結論: 本当に自前でwhisperをやる必要があるだろうか?なければOpenAIが提供するAPIが最強なのでそれを使おう。
いろいろあって、Goで作るアプリケーションで、音声認識機能をもたせられないか?というのを検討した。たまたまwhisperが出はじめた時期だったので、これを中心に見ていたら whisper.cpp というものがあることを見つけた。
Whisper.cpp
ggerganov/whisper.cpp: Port of OpenAI’s Whisper model in C/C++
OpenAIが作ったwhisperをC/C++で書き直すプロジェクト。大きな違いはGPUを使った加速が"まだ"ないこと。CPUだけで動く。あと、exampleの実装は音声データの制約がある。
Note that the main example currently runs only with 16-bit WAV files, so make sure to convert your input before running the tool. For example, you can use ffmpeg like this:
Go向けのバインディングがすでに実装されており、GoからこのAPIを呼び出すことができる。
whisper.cpp/bindings/go at master · ggerganov/whisper.cpp · GitHub
READMEにある通り、なかなか面倒なステップを通る必要がある。加えて、上記の音声データの制約もあり、例えば、mp4なデータをシュッといれて文字起こし、というわけにもいかない。それをするならデコードして生のwavを取り出して、サンプルレートやサンプルビットを変換して、それからwhisper.cppに入れる必要がある。(入力するまえにffmpegに任せる、という手も取れる)
docker で動かしてみる
mp4のことは全然わからなかったので、いったんwavで動くよね、というのを動かしたかったリポジトリがこちら:
sters/docker-golang-whispercpp
適当なwavファイルを作って置き make build-and-run
で実行できる。最初はモデルのダウンロードやwhisper.cppのビルドで時間がかかるものの、2回目以降はdockerイメージのレイヤーでキャッシュされるので、スキップでき、go側の処理だけで済む。
GPUを積んでいないマシンでも、サクッと動かせて、文字起こしがされて面白い。
それOpenAIがWebAPI出しているよ
dockerで動くぞキャッキャッ!とやっていたら(正確には悪戦苦闘していて、wavができるようになってmp4はどうやるんだ〜と更に色々と格闘していたところ)、OpenAIが有料だけどWebAPIを公開してきた。
- Product
-
Speech to text - OpenAI API
- large-v2 というモデルを使っているらしい
- API Reference - OpenAI API
Pricing を見るとめちゃくちゃ安い(金額は記事執筆時)
$0.006 / minute (rounded to the nearest second)
whisper.cppのモデルの説明( whisper.cpp/models at master · ggerganov/whisper.cpp · GitHub )を見ると、large-v2は無いけれど、largeモデルで2.9GBあり、4.7GBのメモリが最大必要らしい。
自分で同じようなWebAPIを作ろうとしたとき、爆速で処理するなら、おそらくAWS LambdaやCloudRunのようなサクッと関数できるようなものでは起動にめちゃくちゃ時間がかかって無理そうだし、k8sに乗せるにしてもCPUとメモリが潤沢に必要なのでそもそものNodeを強くする必要があるし、Pythonの本家whisperを使うにしてもGPU積む必要があるし…、オンプレ…?。そうしたときに一体どれくらいのランニングコストが掛かるんだろうか、と考えると、よほどのことがない限りは素直にOpenAIのそれを使ったほうがいいんだろうな、と思った。
計算してないのでわからないけれど、例えばCPUやメモリ、GPUのリソースが常時100%近く使えるような大規模にやってる環境で、24/365でwhisper(ないし他のシステム)が動いていますよ、という状況であれば、断然自前のほうが安くなりそうな気はする。
でも有用な場面もあるんでしょう?
あんまりイメージができていないけれど、例えば、ローカルで動くことで十分すぎるような場合には有効なのでは?
- Web会議やライブ配信などで、見ている側が、送られてきた音声データから起こしたり、翻訳したりで表示する
- 撮影済みの動画を見る場面では、裏で解析してデータを持っていてほしい
- 街、ホテル、空港、ショッピングセンターとか各所の案内
- 常時潤沢なネットワークリソースがないと動かないんですわ、が難しい環境もあるでしょう
- 議事録取ってくれるデバイス、アプリ
- インタビューするお仕事の人に嬉しそう
- 電話とか各所の契約とかお役所手続きとか、言った言ってない忘れた等あって面倒なので全部議事録ほしい
結論、超優秀な認識モデルが不要で、小さくてもいいので音声認識機能を入れたい、というケースに強そう。とりあえず音声と文字であれこれしたいッスというもの。実はtinyモデルでも結構ちゃんと認識されるので用途によってはこれで十分。largeだと雑に喋っても認識される、という印象。
音声認識できれば、その後はテキスト処理なので、それこそGPT-4にいれたりもできるし、単純な正規表現マッチで処理するのもワークしそう。音声データはバイナリで難しいけれど文字データなら処理もしやすい。