OpenAIの新しいAudio Modelを使って音声の文字起こしをする
はじめに
1年半前にYouTube動画編集の際の文字起こしを楽にしたく、OpenAIのWisperを利用する記事を書きました。
その後Docker環境で動かせるように改善をしました。
それから月日が経ち、今朝(2025/3/21)待望してたOpenAIのAudio Modelがリリースされたというメールが届いたので、早速試してみました。
結論から言うと、僕のAPIを使うユースケースでは、whisperとgpt-4o-transcribeの差はあまりなかったです。
今回はYouTubeの動画の文字起こしを想定しているので、Speech-To-TextのAPIのみを扱います。
価格比較
ページによって値段の表記が違うので正確なことはわかりませんが、以下のPricingページを正とすると、モデルによる価格は以下のようになります。
gpt-4o-transcribe($0.006minute) = Whisper($0.006minute) > gpt-4o-mini-transcribe($0.003minute)
Wisperは音声の時間ベースでの課金で、gpt-4o-transcribeのトークンベースでの課金とは単純比較できませんが、Estimated costを見ると、gpt-4o-transcribeとwisperは同程度の価格であることがわかります。
実験
前回の記事と同じ愛知県安城市名物の「北京飯」の動画で出力結果を比較します。
コードの修正は以下のみです。
今回試した動画ではそれほど差分が出なかったです。疑問文のところで?が入ったことや句読点が入ったことあたりが、改善ポイントでした。
Wipser
文字起こし結果
1
00:00:00,000 --> 00:00:04,000
北京本店
2
00:00:04,000 --> 00:00:09,000
今日は名古屋の南東方面にある安城市の有名店、北京本店を紹介します
3
00:00:09,000 --> 00:00:14,000
日本の大人気ゲーム盲鉄にそれっぽい店が出てくるほどの人気店です
4
00:00:14,000 --> 00:00:17,000
一番有名なのはこの北京版です
5
00:00:17,000 --> 00:00:19,000
めっちゃいい匂いするな
6
00:00:19,000 --> 00:00:21,000
あ、そうそう
7
00:00:21,000 --> 00:00:23,000
これと、なんか餃子だね
8
00:00:23,000 --> 00:00:25,000
さっき看板で美味しそうだった
9
00:00:25,000 --> 00:00:26,000
はいはいはい
10
00:00:26,000 --> 00:00:28,000
だから、餃子セット
11
00:00:29,000 --> 00:00:30,000
安城セット
12
00:00:30,000 --> 00:00:31,000
美味しそう
13
00:00:31,000 --> 00:00:33,000
これ一番有名なやつ
14
00:00:33,000 --> 00:00:36,000
なんだろう、鶏肉かな?
15
00:00:36,000 --> 00:00:37,000
あと卵
16
00:00:37,000 --> 00:00:38,000
カラーケ?
17
00:00:38,000 --> 00:00:39,000
分かんない
18
00:00:39,000 --> 00:00:41,000
台湾まぜそばも注文しました
19
00:00:42,000 --> 00:00:43,000
これから食べる?
20
00:00:43,000 --> 00:00:44,000
うん
21
00:00:44,000 --> 00:00:45,000
サクサク
22
00:00:45,000 --> 00:00:46,000
え?
23
00:00:46,000 --> 00:00:47,000
これサクサクかな
24
00:00:47,000 --> 00:00:48,000
次食べてみ
25
00:00:48,000 --> 00:00:49,000
後で
26
00:00:49,000 --> 00:00:50,000
うん
27
00:00:50,000 --> 00:00:52,000
え、たまごー
28
00:00:56,000 --> 00:00:57,000
うん
29
00:00:57,000 --> 00:00:58,000
サクサク
30
00:00:58,000 --> 00:01:00,000
サクサク鶏肉
31
00:01:00,000 --> 00:01:01,000
薄いな
32
00:01:02,000 --> 00:01:04,000
まぜそばだから混ぜるんだよ
33
00:01:04,000 --> 00:01:05,000
うん
34
00:01:05,000 --> 00:01:06,000
つけた
35
00:01:09,000 --> 00:01:10,000
うまい
36
00:01:10,000 --> 00:01:11,000
うまい?
37
00:01:13,000 --> 00:01:15,000
見て風でヒラヒラしてる
38
00:01:15,000 --> 00:01:16,000
本当だ
39
00:01:16,000 --> 00:01:17,000
薄いな
40
00:01:17,000 --> 00:01:18,000
皮薄っ
41
00:01:18,000 --> 00:01:20,000
ね、パリパリしてる
42
00:01:20,000 --> 00:01:21,000
へー
43
00:01:21,000 --> 00:01:23,000
薄いな本当に
44
00:01:23,000 --> 00:01:24,000
うんうんうん
45
00:01:24,000 --> 00:01:25,000
皮薄いな
46
00:01:26,000 --> 00:01:28,000
全部割れてるね本当に
47
00:01:29,000 --> 00:01:31,000
私結んでないよ
48
00:01:32,000 --> 00:01:33,000
すごい
49
00:01:34,000 --> 00:01:36,000
美味しかったね
50
00:01:36,000 --> 00:01:37,000
美味しかった
51
00:01:39,000 --> 00:01:40,000
卵美味しい
gpt-4o-transcribe
文字起こし結果
1
00:00:00,000 --> 00:00:04,000
北京本店
2
00:00:04,000 --> 00:00:09,000
今日は名古屋の南東方面にある安城市の有名店、北京本店を紹介します
3
00:00:09,000 --> 00:00:14,000
日本の大人気ゲーム盲鉄にそれっぽい店が出てくるほどの人気店です
4
00:00:14,000 --> 00:00:17,000
一番有名なのはこの北京版です
5
00:00:17,000 --> 00:00:19,000
めっちゃいい匂いするな
6
00:00:19,000 --> 00:00:20,000
あ、そうそう
7
00:00:20,000 --> 00:00:23,000
これと、なんか餃子だね
8
00:00:23,000 --> 00:00:25,000
さっき看板で美味しそうだった
9
00:00:25,000 --> 00:00:26,000
はいはいはい
10
00:00:26,000 --> 00:00:28,000
だから、餃子セット
11
00:00:29,000 --> 00:00:30,000
安城セット
12
00:00:30,000 --> 00:00:31,000
美味しそう
13
00:00:31,000 --> 00:00:33,000
これ一番有名なやつ
14
00:00:33,000 --> 00:00:36,000
なんだろう、鶏肉かな?
15
00:00:36,000 --> 00:00:37,000
あと卵
16
00:00:37,000 --> 00:00:38,000
カラオケ?
17
00:00:38,000 --> 00:00:39,000
わかんない
18
00:00:39,000 --> 00:00:41,000
台湾まぜそばも注文しました
19
00:00:42,000 --> 00:00:43,000
これから食べる?
20
00:00:43,000 --> 00:00:44,000
うん
21
00:00:44,000 --> 00:00:45,000
サクサク
22
00:00:45,000 --> 00:00:46,000
え?
23
00:00:46,000 --> 00:00:47,000
これサクサクかな
24
00:00:47,000 --> 00:00:48,000
次食べてみ
25
00:00:48,000 --> 00:00:49,000
後で
26
00:00:49,000 --> 00:00:50,000
うん
27
00:00:50,000 --> 00:00:52,000
え、たまごー
28
00:00:56,000 --> 00:00:57,000
うん
29
00:00:57,000 --> 00:00:58,000
サクサク
30
00:00:58,000 --> 00:01:00,000
うん、サクサク鶏肉
31
00:01:00,000 --> 00:01:01,000
薄いな
32
00:01:02,000 --> 00:01:04,000
まぜそばだから混ぜるんだよ
33
00:01:04,000 --> 00:01:05,000
うん
34
00:01:05,000 --> 00:01:06,000
つけた?
35
00:01:06,000 --> 00:01:07,000
うん
36
00:01:08,000 --> 00:01:09,000
これも美味い
37
00:01:09,000 --> 00:01:10,000
美味い?
38
00:01:13,000 --> 00:01:15,000
見て、風でヒラヒラしてる
39
00:01:15,000 --> 00:01:16,000
本当だ
40
00:01:16,000 --> 00:01:17,000
薄いな
41
00:01:17,000 --> 00:01:18,000
皮薄っ
42
00:01:18,000 --> 00:01:20,000
ね、パリパリしてる
43
00:01:20,000 --> 00:01:21,000
へー
44
00:01:21,000 --> 00:01:23,000
薄いな、本当に
45
00:01:23,000 --> 00:01:24,000
うんうんうん
46
00:01:24,000 --> 00:01:25,000
皮薄いな
47
00:01:26,000 --> 00:01:28,000
全部割れてるね、本当に
48
00:01:29,000 --> 00:01:31,000
私結んでないよ
49
00:01:32,000 --> 00:01:33,000
すごい
50
00:01:34,000 --> 00:01:36,000
美味しかったね
51
00:01:36,000 --> 00:01:37,000
美味しかった
52
00:01:39,000 --> 00:01:40,000
卵美味しい
gpt-4o-mini-transcribe
文字起こし結果
1
00:00:00,000 --> 00:00:04,000
北京本店
2
00:00:04,000 --> 00:00:09,000
今日は名古屋の南東方面にある安城市の有名店、北京本店を紹介します
3
00:00:09,000 --> 00:00:14,000
日本の大人気ゲーム盲鉄にそれっぽい店が出てくるほどの人気店です
4
00:00:14,000 --> 00:00:17,000
一番有名なのはこの北京版です
5
00:00:17,000 --> 00:00:19,000
めっちゃいい匂いするな
6
00:00:19,000 --> 00:00:21,000
あ、そうそう
7
00:00:21,000 --> 00:00:23,000
これと、なんか餃子だね
8
00:00:23,000 --> 00:00:25,000
さっき看板で美味しそうだった
9
00:00:25,000 --> 00:00:26,000
はいはいはい
10
00:00:26,000 --> 00:00:28,000
だから、餃子セット
11
00:00:29,000 --> 00:00:30,000
安城セット
12
00:00:30,000 --> 00:00:31,000
美味しそう
13
00:00:31,000 --> 00:00:33,000
これ一番有名なやつ
14
00:00:33,000 --> 00:00:36,000
なんだろう、鶏肉かな?
15
00:00:36,000 --> 00:00:37,000
あと卵
16
00:00:37,000 --> 00:00:38,000
カラオケ?
17
00:00:38,000 --> 00:00:39,000
分かんない
18
00:00:39,000 --> 00:00:41,000
台湾まぜそばも注文しました
19
00:00:42,000 --> 00:00:43,000
これから食べる?
20
00:00:43,000 --> 00:00:44,000
うん
21
00:00:44,000 --> 00:00:45,000
サクサク
22
00:00:45,000 --> 00:00:46,000
え?
23
00:00:46,000 --> 00:00:47,000
これサクサクかな
24
00:00:47,000 --> 00:00:48,000
次食べてみ
25
00:00:48,000 --> 00:00:49,000
後で
26
00:00:49,000 --> 00:00:50,000
うん
27
00:00:50,000 --> 00:00:52,000
え、たまごー
28
00:00:56,000 --> 00:00:57,000
うん
29
00:00:57,000 --> 00:00:58,000
サクサク
30
00:00:58,000 --> 00:01:00,000
うん、サクサク鶏肉
31
00:01:00,000 --> 00:01:01,000
薄いな
32
00:01:02,000 --> 00:01:04,000
まぜそばだから混ぜるんだよ
33
00:01:04,000 --> 00:01:05,000
うん
34
00:01:05,000 --> 00:01:06,000
つけた?
35
00:01:06,000 --> 00:01:07,000
うん
36
00:01:08,000 --> 00:01:09,000
これもうまい
37
00:01:09,000 --> 00:01:10,000
うまい?
38
00:01:13,000 --> 00:01:15,000
見て、風でヒラヒラしてる
39
00:01:15,000 --> 00:01:16,000
ほんとだ
40
00:01:16,000 --> 00:01:17,000
薄いな
41
00:01:17,000 --> 00:01:18,000
皮薄っ
42
00:01:18,000 --> 00:01:20,000
めっちゃパリパリしてる
43
00:01:20,000 --> 00:01:21,000
へー
44
00:01:21,000 --> 00:01:23,000
薄いな、ほんとに
45
00:01:23,000 --> 00:01:25,000
うんうん、皮薄いな
46
00:01:26,000 --> 00:01:28,000
全部割れてるね、ほんとに
47
00:01:29,000 --> 00:01:31,000
私結んでないよ
48
00:01:32,000 --> 00:01:33,000
すごい
49
00:01:34,000 --> 00:01:36,000
おいしかったね
50
00:01:36,000 --> 00:01:37,000
おいしかった
51
00:01:39,000 --> 00:01:40,000
卵おいしい
一方で前回も挙げた文字起こしAPIの問題点ですが、今回のAPIでも同じように起こってしまいました。
具体的には長尺の動画で人が話さない期間があると、繰り返し同じ文字列を生成してしまうという問題があります。
75
00:02:41,639 --> 00:02:43,639
メニューは?
76
00:02:43,639 --> 00:02:44,639
メニューは?
77
00:02:44,639 --> 00:02:45,639
メニューは?
78
00:02:45,639 --> 00:02:46,639
メニューは?
...
まとめ
今回はOpenAIの新しいAudio Modelを使ってYouTubeの動画の文字起こしを試しました。前の世代のモデルとの比較をしましたが、今回のSpeech-To-Textの条件ではあまり差が出なかったです。
しっかりとマイクを使ったり、部屋の中で話す系の動画であればもっと差が出るのかもしれません。
僕のYouTubeチャンネルでは旅行系の動画が多いので、音量のムラがあったり、人が話していない期間があったとしても精度が高く文字起こしができるようになるともっと嬉しいなと思いました。
APIのコストはほぼ一緒でかつ、実装も変える必要がなかったので最新モデルを使っていこうと思います。
Discussion