「gpt-4o-transcribe」「gpt-4o-mini-transcribe」を試す
公式記事
本日、API で新しい音声合成およびテキスト読み上げ音声モデルを発表します。これにより、真の価値を提供する、より強力でカスタマイズ可能なインテリジェント音声エージェントを構築することが可能になります。
新しい音声テキスト変換モデル
Whisperのオリジナルモデルと比較して、単語誤り率の改善、言語認識と精度の向上を実現した新しいgpt-4o-transcribeおよびgpt-4o-mini-transcribeモデルを導入します。
gpt-4o-transcribeは、複数の確立されたベンチマークにおいて、既存のWhisperモデルよりも単語誤り率(WER)のパフォーマンスが向上しており、音声テキスト変換技術の大幅な進歩を反映しています。これらの進歩は、強化学習における的を絞った革新と、多様かつ高品質なオーディオデータセットを用いた広範囲にわたる中間トレーニングから直接的に生み出されたものです。
その結果、これらの新しい音声認識モデルは、音声のニュアンスをより正確に捉え、誤認識を減らし、転写の信頼性を高めることができます。特に、アクセント、騒音の多い環境、話し方の速度が変化するといった難しい状況において、その効果を発揮します。これらのモデルは、音声認識API(新しいウィンドウが開きます)で現在ご利用いただけます。
ざっくり見た感じ、
-
gpt-4o-mini-transcribe
で、whisper-large-v2
・whisper-large-v2
よりもエラー率が低く、gpt-4o-transcribe
になるとさらにエラー率が低くなっている。 -
gemini-2.0-flash
(Google)、scribe-v1
(ElevenLabs)、nova-2
・nova-3
(Deepgram)など商用トップモデルとの比較でも、gpt-4o-mini-transcribe
・gpt-4o-transcribe
のエラー率は多くの言語においてトップレベルの低さ- ただし言語によっては他のモデルのほうがエラー率が低いものもある
- 日本語の場合はscribe-v1が最も低いエラー率となっている
という感じ。
公式ドキュメント
Speech-to-Textは2つのAPIがある
-
transcriptions
: 文字起こし -
translations
: 翻訳
gpt-4o-mini-transcribe
・gpt-4o-transcribe
はtranscriptions
のみ、かつ、使用可能なパラメータも限定されている。
Colaboratoryで試す。
パッケージインストール。v1.68.0以上が必要。
!pip install -U openai
!pip freeze | grep -i openai
openai==1.68.0
APIキーをセット
from google.colab import userdata
import os
os.environ['OPENAI_API_KEY'] = userdata.get('OPENAI_API_KEY')
サンプル音声として、自分が開催した勉強会のYouTube動画から冒頭5分程度の音声を抜き出したオーディオファイルを用意した。
from openai import OpenAI
client = OpenAI()
audio_file= open("voice_lunch_jp_5min.wav", "rb")
transcription = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file
)
print("\n===== whisper-1 =====\n", transcription.text)
transcription = client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe",
file=audio_file
)
print("\n===== gpt-4o-mini-transcribe =====\n", transcription.text)
transcription = client.audio.transcriptions.create(
model="gpt-4o-transcribe",
file=audio_file
)
print("\n===== gpt-4o-transcribe =====\n", transcription.text)
結果
gpt-4o-mini-transcribe
おだしょー はい じゃあ始めます ちょっとまだ 来られてない方もいらっしゃるんです けど ボイスランチでAP始めます 皆さん 日曜日 はい 日曜日にお集まり いただきましてありがとうございます 今日 久しぶりにオフラインということで 今日はスペシャルなゲストお二人 来ていただいておりますということで 今日ちょっとトピックに回ります けれども ボイスローのCEOである レデン・リムさんと あと セールス フォースのカムセジョナルデザイン のディレクターであるグレイク ベネスさんに来ていただいてます ということで 日本に来ていただ いて ありがとうございました はい 今日はちょっとこのお二人に また後でいろいろと聞こうという コーナーがありますので そこで またいろいろと聞きたいと思います 今日のアジェンダなんですけども 時間過ぎちゃいましたが まず 最初にボイスランチJPについて ということと あと 改造のところを 少しご説明させていただいて 一つ目 のセッションで まず私のほうから ボイスローの2022年の新機能とか その辺の話を少しさせていただ いて その後 二つ目のセッション でグレイクベネスさんとグレイク さんにいろいろカムセジョナル デザインについて 何でも聞こう ぜみたいなところを予定しております その後 15時から 15時で一旦終了 という形でさせていただいて 一応 ボイスランチJP確か記念撮影は 必須ですよね なので それだけ させていただいて その後ちょっと 1時間ぐらい簡単にお菓子と飲み物 を用意してますので 懇親会という のをそのままさせていただこう と思っています ボイスランチJP についてなんですけども ボイスランチ はボイスUIとか音声関連ですね そういった技術に実際に携わっている 人 もしくは興味がある人のための グローバルなコミュニティという 形になっていて ボイスランチの 日本リージョンという形がボイスランチ JPになってます 過去もずっとやって ますけど オンライン オフライン でいろんな音声のデザインだったり 技術だったりというところで情報 とかを共有して みんなで業界盛り上げて いこうぜというようなことでやって おります 今日のハッシュタグ シャープ ボイスランチJPでいろいろと 自由に付き合わせてください あと 会場ですね 今回グラニカ様の お声で利用させていただいてます ありがとうございます ぜひこちらも シェアをお願いしたいですと 今日と 配信のところもいろいろとやって いただいてますって非常に感謝 しております 今 コロナで会場に 来られる方とかもあまりいない ということでされてないんですけ れども 通常はここでIoT機器とか ガジェットとかを展示されている ようなので そういったものがある とき 今度また体験してみていただけ ればなと思っていますというところ で あと すいません トイレがこちら で あと 煙草吸われる方はこちら のところになってますんでよろしく お願いします ということで 最初の挨拶はこれで じゃあ まず私のほうのセッション からさせていただきますという ところで Voice Flow Updates 2022という ところで 今年の新機能について 少しお話をします 自己紹介です 清水と申します 神戸でインフラ のエンジニアをやってますので 普段はKubernetesとかAWSとかTerraform とかをいじってまして 最近ちょっと フリーランスになりました ちょっと 調べてみたら Voice Flow 一番最初に 始めたのは2019年の頭ぐらいなんで だいたい4年弱ぐらいですね いろいろと触ってまして あと 音声 関連のコミュニティのところでは Voice Launch AP 今回のやつですね 以外 にAJAG Amazon Alexa Japan User Groupとか あと Voice Flowの日本語ユーザー グループということでVFJUGという のをやっています 日本語コミュニティ のほうはFacebookのほうでやって ますので もしよろしければ見て いただければなと思います あと2年ぐらい前にですね 技術書店 のほうで ここに今日スタッフで 来ていただいてる皆さんとですね 一緒に同人誌作ろうぜということで 作ったんですけれども もうこれ ちょっと2年ぐらい経って中身が だいぶ古くなってしまっている ので 既にちょっと販売は終了して おります 今日ちょっと持ってきた かったんですけど ストレスを忘れて しまいました なので こういうことも
gpt-4o-mini-transcribe
じゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチJP始めます。皆さん日曜日にお集まりいただきましてありがとうございます。今日は久しぶりにオフラインということで、今日はスペシャルなゲストをお二人来ていただいております。今日はトピックに回りますけれども、ボイスロのCEOであるブレゼン・リームさんと、あとセールスフォースのカムバセーショナルデザインのディレクターであるグレック・ベネスさんに来ていただいてます。ということで日本に来ていただいてありがとうございます。今日はちょっとこのお二人にまた後でいろいろと聞こうというコーナーがありますので、そこでまたいろいろと聞きたいと思います。今日のアジェンダなんですけれども、ちょっと時間過ぎちゃいましたが、まず最初にボイスランチJPについてと、あと改造のところですね、少し説明させていただいて、一つ目のセッションでまず私の方からボイスロの2022年の新機能とかですね、その辺の話を少しさせていただいて、その後二つ目のセッションでブレゼンさんとグレックさんにいろいろカンバセーショナルデザインについて何でも聞こうぜみたいなところを予定しております。その後15時から一旦終了という形でさせていただいて、一応ボイスランチJP、確か記念撮影は必須ですよね。なのでそれだけさせていただいて、その後1時間ぐらい簡単にお菓子と飲み物を用意してますので懇親会というのをそのままさせていただこうと思っています。ボイスランチJPについてなんですけれども、ボイスランチはボイスUIとか音声関連ですね、そういった技術に実際に携わっている人、もしくは興味がある人たちのためのグローバルなコミュニティという形になっていて、ボイスランチの日本リージョンという形がボイスランチJPになっています。過去もずっとやってますけど、オンラインオフラインでいろんな音声のデザインだったり技術だったりというところで情報とかを共有して、みんなで業界を盛り上げていこうぜというようなことでやっております。今日のハッシュタグですね、シャープボイスランチJPでいろいろとシェアしてください。あと会場ですね、今回グラニカ様のご好意で利用させていただいています。ありがとうございます。ぜひこちらもシェアをお願いしたいです。今日と配信のところもいろいろとやっていただいていますので非常に感謝しております。今コロナで会場に来られる方とかもあまりいないということでされてないんですけれども、通常はこうでIoT機器とかガジェットとかを展示されているようなので、そういったものがあるとき、今度ですね、また体験してみていただければなと思っていますというところで、あとすみません、トイレがこちら、あとタバコを吸われる方はこちらのところになっていますのでよろしくお願いします。ということで最初の挨拶はこれで、じゃあまず私の方のセッションからさせていただきますというところで、ボイスフローアップデート2022というところで、今年の新機能について少しお話をします。自己紹介です。清水と申します。神戸でインフラのエンジニアをやってますので、普段はKubernetesとかElasticsearchとかをいじってまして、最近ちょっとフリーランスになります。ちょっと調べてみたらボイスフローを一番最初に始めたのが2019年の頭ぐらいなので、だいたい4年弱ぐらいですね。いろいろと触ってまして、あと音声関連のコミュニティのところでは、ボイスランチJP、今回のやつですね、以外にAJAG、Amazon Alexa、Japan User Groupとか、あとボイスフローの日本語ユーザーグループということでVFGUGというのをやっています。日本語コミュニティの方はFacebookの方でやってますので、もしよろしければ見ていただければなと思います。あと2年ぐらい前に技術書店の方で、ここに今日スタッフで来ていただいている皆さんと一緒に同人誌作ろうぜということで作ったんですけれども、もうこれちょっと2年ぐらい経って中身がだいぶ古くなってしまっているので、既に販売は終了しております。今日ちょっと持ってきたかったんですけど、忘れてしまいました。なのでこういうこともやっています。
gpt-4o-transcribe
はいじゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチJP始めます。皆さん日曜日です。日曜日にお集まりいただきましてありがとうございます。今日は久しぶりにですねオフラインということで、今日はですねスペシャルなゲストをお二人来ていただいております。ということで日本に来ていただいてありがとうございます。今日はちょっとこのお二人にまた後でいろいろと聞こうというコーナーがありますので、そこでまたいろいろと聞きたいと思います。今日のアジェンダなんですけれども、ちょっと時間過ぎちゃいましたがまだ最初にボイスランチJPについてというと、あと会場のところですね少し説明させていただいて、一つ目のセッションでまず私の方からボイスランチ2022年の新機能とかですねその辺の話を少しさせていただいて、その後二つ目のセッションでグレゼルさんとグレさんにいろいろカンバセーショナルデザインですねについて何でも聞こうぜみたいなところを予定しております。その後15時から、15時で一旦終了という形でさせていただいて、一応ボイスランチJP確か記念撮影は必須ですよね。なのでそれだけさせていただいて、その後ちょっと1時間ぐらい簡単にお菓子と飲み物を用意してますので懇親会というのをそのままさせていただこうと思っています。ボイスランチJPについてなんですけれども、ボイスランチはボイスUIとか音声関連ですねそういった技術に実際に携わっている人、もしくは興味がある人たちのためのグローバルなコミュニティという形になっていて、ボイスランチの日本リージョンという形ではボイスランチJPになってます。過去もずっとやってますけどオンラインオフラインでいろんな音声のデザインだったり技術だったりというところで情報とかを共有してみんなで業界盛り上げていこうぜというようなことでやっております。今日のハッシュタグですね、シャープボイスランチJPでいろいろと自由に増やしてください。あと会場ですね、今回グラニカ様のご好意で利用させていただいてます。ありがとうございます。ぜひこちらもシェアをお願いしたいですと。今日と配信のところもいろいろとやっていただいてますので非常に感謝しております。今コロナで会場に来られる方とかもあまりいないということでされてないんですけれども、通常はIoT機器とかガジェットとかを展示されているようなので、そういったものがあるとき、今度また体験してみていただければなと思っています。あとトイレがこちら、あとタバコ吸われる方はこちらのところになってますのでよろしくお願いします。ということで最初の挨拶はこれで、まず私の方のセッションからさせていただきますというところで、ボイスフローアップゼット2022というところで今年の新機能について少しお話をします。自己紹介です。清水と申します。神戸でインフラのエンジニアをやってますので、普段はKubernetesとかAWSとかTerraformとかをいじってまして、最近ちょっとフリーランスになります。ちょっと調べてみたらボイスフロー一番最初に始めたのが2019年の頭ぐらいなので、大体4年弱ぐらいですね。いろいろと触ってます。あと音声関連のコミュニティのところではボイスランチAP今回のやつですね。以外にAJAG、Amazon、Alexa、Japan User Groupとか、あとボイスフローの日本語ユーザーグループということでVFGUGというのをやっています。日本コミュニティの方はFacebookの方でやってますので、もしよろしければ見ていただければなと思います。あと2年ぐらい前にですね、技術書店の方でここに今日スタッフで聞いていただいている皆さんと一緒に同人誌作ろうぜということで作ったんですけれども、もうこれちょっと2年ぐらい経って中身がだいぶ古くなってしまっているのですでにちょっと販売は終了しております。今日ちょっと持ってきたかったんですけど忘れてしまいました。なのでこういうこともやっています。
順当に下に行くほど精度が高いように思える。
gpt-4o-transcribe
とgpt-4o-mini-transcribe
は、whisper-1
と比較して、現時点ではいくつかの制約がある。これが現時点だけで今後修正されるのか、それともモデルの違いとして修正されないのかは不明。
response_format
)
出力形式(whisper-1
では出力形式を以下から選択できる
json
text
-
srt
: SubRip Text形式。動画に、字幕・キャプションなどを追加するためのフォーマット。 -
verbose_json
: JSON形式で、各セグメントごとに分割され、より詳細な情報が出力される。 -
vtt
: Video Text Tracks形式。動画に、字幕・キャプションなどを追加するためのフォーマット。
これに対して、gpt-4o-transcribe
とgpt-4o-mini-transcribe
は、現時点では json
とtext
のみとなっている。
from openai import OpenAI
client = OpenAI()
audio_file= open("voice_lunch_jp_5min.wav", "rb")
transcription = client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe",
file=audio_file,
response_format="text"
)
print(transcription)
じゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチJP始めます。皆さん日曜日にお集まりいただきまして(snip)
timestamp_granularities
)
タイムスタンプの粒度(response_format
がverbose_json
の場合、セグメントに分割され、各セグメントごとのタイムスタンプの粒度を単語単位・セグメント単位・両方のどれかで選択できるが、gpt-4o-transcribe
とgpt-4o-mini-transcribe
はresponse_format="verbose_json"
に対応してないため、こちらも対応していない様子。
長い入力
Transcription APIには1ファイルあたり最大25MBの制限がある。これはgpt-4o-transcribe
とgpt-4o-mini-transcribe
でも同様。よって、これを超えるファイルサイズの文字起こしの場合は分割したりオーディオ形式を圧縮する必要がある。
プロンプト
Transcription APIでは、文字起こしの認識を改善するためにプロンプトが使える。といっても自分は使ったことがない上、効果も限定的らしい。
以下のようなユースケースが紹介されている。
- 特定の単語や略語の修正
- モデルが音声中の特定の単語や略語を誤認識する場合、プロンプトで正しい表記を示すと改善される
- 例: 「この書き起こしは、DALL·E・GPT-3・ChatGPTなどの技術を提供するOpenAIに関するものです。」
- 分割した場合の文脈を保持
- 音声が複数のセグメントに分割された場合、前のセグメントの書き起こし内容をプロンプトに含めることで、文脈が維持され精度が向上する
- ただしその場合、プロンプトの最後の224トークンのみが考慮される。
- 例:
- 前のセグメント: 「昨日の会議で議論された予算案について、引き続き本日の話題として取り上げます。」
- 句読点の挿入
- 句読点が省略され勝ちになる場合、プロンプトに句読点を含めると反映されやすくなる。
- 例: 「こんにちは、私の講義へようこそ。」
- フィラー単語の保持
- 音声中のフィラー(「えーと」「あー」等)も書き起こしに含めたい、プロンプトにフィラーを含めておくと反映されやすくなる。
- 例: 「あの、ちょっと考えさせてください、えーっと… それで、私が思っているのは、という感じです。」
- 言語の書き方の指定
- 中国語など、同じ言語でも異なる表記がある場合は、それをプロンプトで指定すると反映される。
- 例: 「この書き起こしは、繁体字で出力してください。」
どうやらこれはgpt-4o-transcribe
とgpt-4o-mini-transcribe
でも使える様子。
from openai import OpenAI
client = OpenAI()
audio_file= open("voice_lunch_jp_5min.wav", "rb")
transcription = client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe",
file=audio_file,
prompt="VoiceLunch JPという音声デザインに関するイベントの音声です。ゲストにVoiceflow CEOのブレイデン・リーム氏とSalesforceのConversational Design Directorであるグレッグ・ベネット氏を招いています。フィラーを省略しないでください。"
)
結果の抜粋
じゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチJP始めます。皆さん日曜日にお集まりいただきましてありがとうございます。今日は久しぶりにオフラインということで、今日はスペシャルなゲストをお二人来ていただいております。ということで、今日はトピックにもありますけれども、ボイスフローのCEOであるブレゼン・リームさんと、あとセールスフォースのカムセッションナルデザイナーのディレクターであるグレッグ・ベネットさんに来ていただいてます。
一つ上で試したときには
じゃあ始めます。ちょっとまだ来られてない方もいらっしゃるんですけど、ボイスランチJP始めます。皆さん日曜日にお集まりいただきましてありがとうございます。今日は久しぶりにオフラインということで、今日はスペシャルなゲストをお二人来ていただいております。今日はトピックに回りますけれども、ボイスロのCEOであるブレゼン・リームさんと、あとセールスフォースのカムバセーショナルデザインのディレクターであるグレック・ベネスさんに来ていただいてます。
という感じだったので、多少改善されたかなー・・・?という感じかな。
プロンプトは224トークンしか認識されないとあるのだけど、どうもWhisperに関する記述のように思えるが、gpt-4o-transcribe
とgpt-4o-mini-transcribe
でもそうなのだろうか?
あとはLLMを使って後処理でなんとかするっていうやり方もある。
ストリーミング
ストリーミングを使うことで、文字起こしが完全に完了するのを待たずに結果を出力できる。これはgpt-4o-transcribe
とgpt-4o-mini-transcribe
で新しく使えるようになったみたい。
まずストリーミングなしの場合
from openai import OpenAI
import time
client = OpenAI()
audio_file= open("voice_lunch_jp_5min.wav", "rb")
start = time.perf_counter()
transcription = client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe",
file=audio_file,
)
end = time.perf_counter()
print("Finished: ", end - start)
完了に約8.4秒かかっている
Finished: 8.365924930999881
ストリーミングの場合。
from openai import OpenAI
import time
client = OpenAI()
audio_file= open("voice_lunch_jp_5min.wav", "rb")
start = time.perf_counter()
stream = client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe",
file=audio_file,
stream=True
)
for idx, event in enumerate(stream):
if event.type == "transcript.text.delta":
print("{}: {}".format(time.perf_counter() - start, event.delta))
end = time.perf_counter()
print("Finished: ", end - start)
4.268681543000184: じゃ
4.26884503600013: あ
4.268888718000198: 始
4.297264323000036: め
4.297332052000002: ます
4.297364759000175: 。
4.297415073000138: ち
4.297494724999979: ょ
4.297542313000122: っと
4.297583769000084: まだ
4.297623646000375: 来
4.2976633250000305: ら
4.370375413000147: れて
4.370604693000132: ない
4.394052084000123: 方
4.397789568000007: も
4.400329343000067: い
4.400560030000179: ら
4.40194093700029: っ
4.402024539000195: しゃ
4.402200061000258: る
4.402307690000271: ん
4.402718094000193: です
4.402769482000167: け
4.403151153000181: ど
(snip)
9.6438956410002: 忘
9.648207924000417: れて
9.653769835000276: しま
9.660560186000112: いました
9.662969262000388: 。
9.67294212600018: なので
9.676314400000138: こう
9.676808819000144: いう
9.685635106000063: こと
9.689120605000426: も
9.695110778000071: や
9.699597289000394: っています
9.704664048000268: 。
Finished: 9.715369725000073
じゃあ始めます。ちょっとまだ来られてない...
最初のチャンクが返ってくるのが約4秒となっているのがわかる。
また、gpt-4o-transcribe
とgpt-4o-mini-transcribe
で出力形式がjson
の場合はlogprobs
も使える。
from openai import OpenAI
import time
client = OpenAI()
audio_file= open("voice_lunch_jp_5min.wav", "rb")
start = time.perf_counter()
stream = client.audio.transcriptions.create(
model="gpt-4o-mini-transcribe",
file=audio_file,
response_format="json",
stream=True,
include=["logprobs"]
)
for idx, event in enumerate(stream):
if event.type == "transcript.text.delta":
print("{}: {} ({})".format(
time.perf_counter() - start,
event.delta,
event.logprobs[0].logprob
))
if event.type == "transcript.text.done":
print("Finished: {}\n{}...".format(
time.perf_counter() - start,
event.text[:20]
))
7.195718604999456: はい (-1.3189557)
7.1964203150000685: 、 (-0.31590518)
7.19648260699978: じゃ (-0.0002040172)
7.196524968999256: あ (-9.729906e-06)
7.196572988999833: 始 (-1.0683535e-05)
7.196773899999243: め (0.0)
7.1994287789993905: ます (-2.6418418e-05)
7.2023525529994: 。 (-0.0008778738)
7.2074383740000485: ち (-0.0062412494)
7.211921883999821: ょ (-4.3202e-07)
7.216408979999869: っと (-1.6240566e-06)
7.222287608999977: まだ (-3.650519e-06)
7.22647811799925: 来 (-0.00012320446)
7.230085958000018: ら (-0.0013341709)
7.235847696999372: れて (-1.0280384e-06)
7.2401688129994: ない (-0.023245713)
7.246447491999788: 方 (-1.6240566e-06)
7.2488175049993515: も (-1.9816675e-06)
7.263247612999294: い (-3.0545007e-06)
7.273194883999167: ら (-1.9361265e-07)
7.2736425589991995: っ (0.0)
7.277198979999412: しゃ (-2.9352968e-06)
7.282241690999399: る (-1.4498052e-05)
(snip)
なお、通常のTranscriptions APIは基本的に入力はファイルが想定されている。マイクからの入力などのリアルタイムな音声についてはRealtime APIを使用する。
自分はRealtime APIをきちんと使ったことがないため、スキップ。ただRealtime APIの場合はVADやターンテイキングなどが使えるようなので、またあらためて確認したい。