OpenAIのSpeech-To-Text AI「Whisper」をM1 Macで試してみる

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が手元のマシンで動くなんて!
いろいろと活用方法が広がりそうです。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。