最近何かと話題のChatGPTですが、開発元であるOepnAIはChatGPT以外にもいくつかのサービスを提供しています。
その中の1つとして、音声から文字起こしするWhisperという機能があります。
今回はこのWhisperについてまとめます。
Whisperとは
冒頭で文字起こし機能と述べましたが、正確には68万時間もの訓練データで訓練された大規模な音声認識モデルです。
日本語を含む多言語の音声を高精度で文字起こしすることが可能です。
このモデル自体は2022年9月にオーブンソースとして公開されましたが、2023年3月になると開発者向けのWhisper APIが公開されました。
APIでできることは基本的に同じですが、細かいパラメータが設定できなかったり、ファイルサイズに上限があるなどある程度制限があります。
Whisperでできることは以下になります。
- transcribe(文字起こし)
- 音声からの文字起こし。
- 99言語に対応
- translate(文字起こし + 翻訳)
- 音声からの翻訳処理。
- 入力は多言語に対応していますが、出力は英語のみ。
この記事ではメインにtranscribe(文字起こし)について取り上げます。
料金については2023年7月現在で、1分あたり$0.006になります。
例えば1時間の音声だと60min × $0.006 = $0.36で、現時点での為替が1ドル138円なので約50円ほどです。
Whisper APIの使い方
実際にWhisper APIを使って文字起こしする方法を見ていきます。
①パッケージをインストールします。
!pip install openai
②環境変数のセット
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIのトークン>"
OpenAIのAPIトークンはマイページから発行できます。
③文字起こし
import openai
with open(audio_file, 'rb') as file:
= openai.Audio.transcribe(
file=file,
model='whisper-1',
response_format='verbose_json',
)
print(transcript['text'])
file
に文字起こしする音声ファイルを指定します。
model
に使用するモデルを指定します。現時点ではwhisper-1
しかありません。
response_foemat
では文字起こし結果をどのようなフォーマットで返してもらうかを指定します。
verbose_json
とすることで以下のようなセグメントごとに開始終了時間など詳細情報まで取得することが可能です。
{
"task": "transcribe",
"language": "japanese",
"duration": 30.65,
"segments": [
{
"id": 0,
"seek": 0,
"start": 0.0,
"end": 5.4,
"text": "こんにちは、これは音声ファイルです",
"tokens": [
41589,
6117,
20788,
22615,
36941,
23072,
15096,
247,
39454,
3384,
3203,
2972,
5998,
21017,
6722,
47745,
32418,
7016,
20699,
29707
],
"temperature": 0.0,
"avg_logprob": -0.34013558912646863,
"compression_ratio": 0.5819397993311036,
"no_speech_prob": 0.0035294992849230766,
"transient": false
},...
],
"text": "文字起こし全文"
}
以下がその他設定できるパラメータです。
パラメータ | データ型 | 必須/任意 | 説明 |
---|---|---|---|
file | file | 必須 | トランスクリプトするオーディオファイルオブジェクト(ファイル名ではない)。対応している形式はmp3、mp4、mpeg、mpga、m4a、wav、webm |
model | string | 必須 | 使用するモデルのID。現在利用可能なのはwhisper-1のみ |
prompt | string | 任意 | モデルのスタイルを指南するためのテキスト、または前のオーディオセグメントを続けるためのもの。プロンプトはオーディオ言語に合わせている必要がある |
response_format | string | 任意 | トランスクリプトの出力形式。対応しているオプションはjson、text、srt、verbose_json、vtt。デフォルトはjson |
temperature | number | 任意 | サンプリング温度。0から1の間。高い値(例えば0.8)は出力をよりランダムにし、低い値(例えば0.2)はそれをより焦点を絞った、決定論的なものにします。0に設定すると、モデルはログ確率を用いて、特定の閾値がヒットするまで自動的に温度を上げる。デフォルトは0 |
language | string | 任意 | 入力オーディオの言語。ISO-639-1形式で入力言語を提供すると、精度とレイテンシが改善される |
Whisper APIで困ったこと
ファイルを渡すだけで簡単に文字起こししてくれるWhisperですが、APIだと制限がいくつかあるため、実運用するにはいくつか考えるべきポイントがあります。
最大ファイルサイズが25MB
まずあげられるのがAPIで渡せるファイルサイズが最大25MBということです。
1時間のzoomの録画ファイルが100MBを超えていたのでそのまま文字起こしすることができません。
この解決策としてファイルを分割して渡したり、ファイル自体を圧縮する必要があります。
ファイルを圧縮する方法を探していたところWhisperのリポジトリで以下のようなDiscussionがされているのを発見しました。
この議論の中にある処理を参考にffmpegを使って音声ファイルを圧縮する方法を試してしましたが、100MB以上あったファイルも10MBくらいまで圧縮することができました。
ただこの方法は要は音質を下げたりしているので、音質下げすぎると文字起こしの精度に影響がでるかもしれないので注意が必要です。
話者識別
この機能が個人的に一番ついてほしいものではありますが、現在のWhisperでは複数人が会話している音声ファイルを文字起こしする際に、誰が何を喋ったかまでは識別することができません。
これを実現するにはpyaanoteのような話者識別のモデルを使うことが良さそうですが、GPUで処理することが推奨されており処理が重たかったりといった課題もあります。
固有名詞の対応
日本語にも高精度で対応しているとはいえ、人物名など固有名詞にはまだ精度が欠ける部分はあります。
APIのパラメータでpromptというものがあり、ここに音声の中で使われている固有名詞を設定しておくと若干精度が上がるかなという印象です。
これも100%ではありません。
無音時間が長い場合のバグ
これは話者を識別するために話者ごとの音声ファイルを文字起こししようとしたときに直面した現象ですが、無音期間が長いと文字起こし内容がおかしくなってしまいます。
Whisperには有音と無音を判定するVAD(Voice Activation Detector)が組み込まれているとのことですが、無音期間が長すぎるとうまく機能せず、最後に発言した内容を永遠にループするような現象が起こります。
数秒間の無音状態であればとくに問題なく文字起こしされました。
実際にあった事象としては無音区間がすべて「Thank you」と文字起こしされ実際は話しているであろう区間も「Thank you」というような結果になりました。
同じような現象は他にも起こっているようです。
まとめ
簡単に音声ファイルから文字起こしできるWhisperではありますが、課題となる部分も存在します。
ただ、ファイルサイズなどはAPIの課題であって、自前でWhisperをインストールして構築してしまえばファイルサイズの上限がなくなったり、文字起こしする際の細かいパラメータの設定などが可能となります。
APIを使わない方法の課題としては音声処理はどうしても処理が重たいためGPUが必要となってきます。
このあたりのコストと機能のバランスについては要件によって合わせていく必要がありそうです。
コメント