OpenAI WhisperAPIのwordレベルでの文字起こしを試したみた
こちらの投稿を見て、少し気になったので試してみました!
公式ドキュメントを読む
こちらを参考にしています。
新しく `timestamp_granularities[]` というパラメータが追加されたようです(多分前は無かったはず)。ここで word と指定すると文字レベルで分割された文字起こし結果が出力されます。
また `response_format` を verbose_json にする必要もありそうです。
流石OpenAIといった感じで、ドキュメントの右側にリクエスト例もわかりやすく記載されていました!👏
では実際に試していきましょう!
実際に試してみる
以下のように timestamp_granularities=["word"] と設定して形でリクエストを送ってみます。
from google.colab import userdata
userdata.get('openai-practice') # OPENAI_API_KEYを取得
from openai import OpenAI
client = OpenAI(api_key=userdata.get('openai-practice'))
audio_file = open("audio_1.wav", "rb")
word_transcript = client.audio.transcriptions.create(
file=audio_file,
model="whisper-1",
response_format="verbose_json",
timestamp_granularities=["word"]
)
word_transcript
全体の文字起こし結果に加えて、wordsの中にワードレベルでの文字起こしと開始/終了時刻が出力されていますね。少し見にくいので、wordsの中身を取り出してみます。
word_transcript.words
またこのワードレベルの文字起こしをする際に、response_formatをverbose_jsonにしないと以下のようなエラーが出ます。
---------------------------------------------------------------------------
BadRequestError Traceback (most recent call last)
<ipython-input-23-2aba1fb74181> in <cell line: 5>()
3
4 audio_file = open("audio_1.wav", "rb")
----> 5 word_transcript = client.audio.transcriptions.create(
6 file=audio_file,
7 model="whisper-1",
3 frames
/usr/local/lib/python3.10/dist-packages/openai/_base_client.py in _request(self, cast_to, options, remaining_retries, stream, stream_cls)
978
979 log.debug("Re-raising status error")
--> 980 raise self._make_status_error_from_response(err.response) from None
981
982 return self._process_response(
BadRequestError: Error code: 400 - {'error': {'message': 'Timestamp granularities are only supported with response_format=verbose_json', 'type': 'invalid_request_error', 'param': 'timestamp_granularities', 'code': 'timestamp_granularities_format'}}
ちなみに timestamp_granularities["segment"] ではどうなるかというと、、、
segment_transcript = client.audio.transcriptions.create(
file=audio_file,
model="whisper-1",
response_format="verbose_json",
timestamp_granularities=["segment"]
)
segment_transcript
あまりverbose_json 形式での出力をしたことがなく、馴染みがないフィールドもあったので調べてみました。
終わりに
ワードレベルで文字起こしされると、より細かな開始/終了時刻がわかるので、字幕付けなど色々な用途でより高品質なアプローチができる気がします。
OSS Whisperにはありましたが、APIの方でもサポートしてもらえるのは嬉しいですね!使い倒していきたいと思います!