OpenAIがSpeech-To-Text AIのWhisperを発表しました。Githubからpipでインストールすれば簡単に使えます。私のM1 Max MacBook Proでも動作しましたので、作業内容を書いておきます。
Python仮想環境を作る
Python自体のインストールは既に終わっているところから書くことにします。私の環境は、ASDFを使ってPythonのバージョンを使い分けており、今回使用するのは、miniforge3-4.10.3-10です。Python 3.9.13が動作しています。
まず、仮想環境を作ります。miniforgeを使っていながらPython標準のvenvを使っていました。(あまり意識してなかった・・・。)
mkdir whisper
cd whisper
python -m venv venv
. venv/bin/activate
Whisperのインストール
Whisperのインストールは、下記のpipコマンド一発です。M1 Macの環境(arch=arm64)でも何ら問題なくインストールできます。
pip install git+https://github.com/openai/whisper.git
WhisperはPyTorchを使っているので、PyTorchなどの依存パッケージも合わせてインストールされます。
公式ドキュメントにあるように、ffmpegもインストールしておきましょう。MacでHomebrewの環境がある場合は、下記のコマンドで大丈夫です。
ちなみに、私のMacには既にインストール済みでした。
brew install ffmpeg
Whisperをコマンドラインから使う
インストールが終われば、すぐにWhisperを使ってSpeech-To-Textを行うことができます。
venv/bin
配下にwhisper
というコマンドプログラムがインストールされるので、それを使えば、簡単に動作を試すことができます。また、Pythonのプログラムからwhisperパッケージをインポートして使うこともできます。Whisperを使って何らかのAPI化を行う場合は、Python上で使うことになるでしょう。
ここでは、QuickTime Playerを使って音声を録音し、hello.m4aというファイルを作りました。「こんにちは。今日は良いお天気ですね。今日は八幡西図書館に行ってきました。」と喋っているので、これがしっかり認識できるかどうか・・・。
whisper hello.m4a --language Japanese
--language
オブションでJapenese
を指定すると日本語での認識ができます。
最初の実行時は、学習済みモデルのファイルをダウンロードするので、少し時間がかかります。
ダウンロードする学習済みモデルは、トレーニングデータの量に応じてtinyからlargeまで5種類があり、largeに近いほどダウンロードされるファイルを大きく、認識にかかる時間は長く、認識精度は良好になります。
デフォルトでは、smallモデルが使用されます。ダウンロードされたファイルは461MBでした。
認識結果は、このように表示されました。
[00:00.000 --> 00:08.400] こんにちは。今日は良いお天気ですね。 今日はヤハタ西図書館に行ってきました。
なるほど。だいたい認識していますね。「八幡西」という地名が「ヤハタ西」となっています。
baseモデルとlargeモデルも試す
デフォルトのsmallモデルは5段階のちょうど真ん中のサイズです。次に、下から2番目のbaseモデルと、5番目(最大)のlargeモデルを試してみました。
whisper hello.m4a --language Japanese --model base
使用するモデルは、--model
オプションで指定できます。baseモデルのダウンロードされたファイルは139MBでした。
認識結果は下記のとおり。
[00:00.000 --> 00:03.600] こんにちは、今日は良いお店です。
[00:03.600 --> 00:30.600] 今日はやはた西都所館に行ってきました。
まず、2つの文字列に分割して認識されているようです。
認識誤りも結構出ています。
whisper hello.m4a --language Japanese --model large
さらにlargeモデル。ダウンロードされたファイルは2.87GBとかなり巨大になります。また、ダウンロード後の実際の認識にかかる時間は、1分近くかかるようになりました。
認識結果は下記のとおり。
[00:00.000 --> 00:08.320] こんにちは 今日は良いお天気ですね 今日は八幡西図書館に行ってきました
おお!完璧です。「八幡西」という地名も問題ありません。
CPUかGPUか
このようにM1 Macでも問題なく動くのですが、私の24コア(32コアではない)M1 Maxをもってしても、largeモデルは認識に1分近くかかります。
というのも、CPUモードで動作しているからです。CPUはM1 MaxでもM1 Proでも同じ10コアなので、どれを使っても同じくらいの時間がかかるでしょう。
で、せっかくなのでGPUを使いたいわけです。M1 Maxの24コアGPUを使えば、largeモデルでも、もっと早く認識できるはず・・・。
whisperでは、--device
オプションで使用するデバイスを指定できます。この辺はPyTorchの実装に依存しているようですが、下記の選択肢があります。
cpu, cuda, ipu, xpu, mkldnn, opengl, opencl, ideep, hip, ve, ort, mps, xla, lazy, vulkan, meta, hpu
M1 Macでは、mps
を指定すれば良いはず。
whisper hello.m4a --language Japanese --model large --device mps
実行結果は、下記のとおりエラーになりました。
loc("mps_multiply"("(mpsFileLoc): /AppleInternal/Library/BuildRoots/a0876c02-1788-11ed-b9c4-96898e02b808/Library/Caches/com.apple.xbs/Sources/MetalPerformanceShadersGraph/mpsgraph/MetalPerformanceShadersGraph/Core/Files/MPSGraphUtilities.mm":219:0)): error: input types 'tensor<1x1280x3000xf16>' and 'tensor<1xf32>' are not broadcast compatible
LLVM ERROR: Failed to infer result type(s).
このエラーをクリアできれば・・・というところですが。
RTX3070を積んだWindows機があるので(GTX1650からグレードアップした)、それならcudaと指定すれば動くはず。また、試してみようと思います。
翻訳もできる
ちなみに、Whisperを使って翻訳することもできます。
whisper hello.m4a --language Japanese --task translate
--task
オプションにtranslate
と指定すれば良いわけですね。
実行結果は下記のとおり。
[00:00.000 --> 00:03.500] Hello, it's a good weather today.
[00:03.500 --> 00:23.500] Today, I went to Nishito Shokan in Yahata.
まずはデフォルトのsmallモデルでの翻訳ですが、”Nishito Shokan in Yahata”はかなり厳しいか・・・。
whisper hello.m4a --language Japanese --model large --task translate
largeモデルでも試してみました。
[00:00.000 --> 00:03.000] Hello, the weather is nice today, isn't it?
[00:03.000 --> 00:30.000] Today, I went to Yahata West Library.
これは素晴らしいじゃないですか。「今日は良いお天気ですね」のところも英語の表現力が増していると思います。「八幡西図書館」が”Yahata West Library”となっているのも完璧。
まとめ
マシンパワーはそこそこ必要ですが、この精度でのSpeech-To-Text AIが手元のマシンで動くなんて!
いろいろと活用方法が広がりそうです。