Zenn
🎵

OpenAIの新しいAudio Modelを使って音声の文字起こしをする

2025/03/21に公開

はじめに

1年半前にYouTube動画編集の際の文字起こしを楽にしたく、OpenAIのWisperを利用する記事を書きました。
https://zenn.dev/atakon/articles/youtube-transcript

その後Docker環境で動かせるように改善をしました。
https://zenn.dev/atakon/scraps/723358fecce380

それから月日が経ち、今朝(2025/3/21)待望してたOpenAIのAudio Modelがリリースされたというメールが届いたので、早速試してみました。

https://platform.openai.com/docs/guides/audio

結論から言うと、僕の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)
https://platform.openai.com/docs/pricing

Wisperは音声の時間ベースでの課金で、gpt-4o-transcribeのトークンベースでの課金とは単純比較できませんが、Estimated costを見ると、gpt-4o-transcribeとwisperは同程度の価格であることがわかります。

実験

前回の記事と同じ愛知県安城市名物の「北京飯」の動画で出力結果を比較します。

https://youtu.be/F1ZseOh3d-k

コードの修正は以下のみです。
https://github.com/atamakonkurii/whisper-transcript-python/pull/15/commits/32805785d3a042f676cb2d24bd58410372b9275a

今回試した動画ではそれほど差分が出なかったです。疑問文のところで?が入ったことや句読点が入ったことあたりが、改善ポイントでした。

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でも同じように起こってしまいました。
https://zenn.dev/atakon/articles/youtube-transcript#whisper-apiの問題点(2023%2F3%2F25時点)

具体的には長尺の動画で人が話さない期間があると、繰り返し同じ文字列を生成してしまうという問題があります。

別の長尺動画でのgpt-4o-transcribeの出力結果
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のコストはほぼ一緒でかつ、実装も変える必要がなかったので最新モデルを使っていこうと思います。

GitHubで編集を提案

Discussion

ログインするとコメントできます