nikkie-ftnextの日記

イベントレポートや読書メモを発信

声をPythonに聴かせて(新章開幕!Whisperの環境構築、いっちゃうよ〜📣)

はじめに

ういっすういっすういっすー!✌️ ぱー🖐 nikkieです。

ここ最近お絵描きAI、Stable Diffusionが非常に賑わいを見せていますが、実はシオン・プロジェクト的にも熱いAI、Whisperが登場したんです!
この記事ではWhisperを手元で動かすまでをまとめます。

目次

動作環境

前回のシオン・プロジェクト!

アイの歌声を聴かせて』のファン活動(アイカツ)として、劇中に登場するAIシオンのv0.0.1を実装するというプロジェクトを立ち上げました。

直近のエントリはこちら

ここまでの内容はPyCon APAC 2022で世界に発信しました🎤(日本語トークです)

Whisperとは

OpenAIが公開した音声認識モデルという認識です(※動かすことを優先していて理論面は全く掘り下げられていません)。

  • 書き起こし(英語もそれ以外の言語も。つまり日本語対応
  • 各言語の音声から英語に翻訳した書き起こし

ができるみたいです、すごい!
1つのモデルで複数の言語に対応している、いったいどうなってるんだ〜🤩(未来ずら〜)

Twitterでは「すごいんだよ、これ!」な例が紹介されています。

Setup Whisper

READMEの「setup」1に沿って実施します。

Whisperのリポジトリからインストールするだけで済みます。簡単🙌

pip install git+https://github.com/openai/whisper.git

動かす上で、macOSの場合はbrew install ffmpegも必要でした。
Pythonライブラリの依存関係にffmpeg-pythonがあり、ffmpegを使っているようです2

私の環境では、1.11以上のtorchがimportでエラーを送出する3ので、1.11未満のtorchを入れています。

setupによるとbrew install rustが必要な場合もあるそうです4
使用しているプラットフォーム向けにhuggingface/tokenizersが事前ビルドしたwheelを提供していない場合、rustが必要になるそうです。

Pythonコードで音声認識

Whisperは、わずかなコードで音声ファイルから音声認識できます!5

音声ファイルはsayコマンドで作りました6

say 親譲りの無鉄砲で子供の時から損ばかりしている -o sample.wav --data-format=LEF32@160000

こちらをWhisperはどう認識するのか?
今回は動かすのを優先で小さい(=精度はそんなに高くない)モデル base を使いました。

>>> import whisper
>>> model = whisper.load_model("base")
>>> result = model.transcribe("sample.wav", fp16=False)
>>> result["text"]
'親ゆずりのむてっぽうで、子どもの時から、そんばかりしている'

認識した!!🎉

fp16=Falseは「FP16 is not supported on CPU; using FP32 instead」というwarningを見たので、CPUで動かす際の指定ととらえてつけています7

resultは辞書を指しており、トークンのIDも持っているんですよね。
何が起こっているのかまだ追えていないんですがすごそう! わくわくもんだぁ!

コマンドラインから音声認識

Pythonを書かなくてもwhisperコマンドで音声ファイルから音声認識できます8
whisperをインストールすると、このコマンドが使えるようになっています。

$ whisper sample.wav --model base --language Japanese --fp16 False
[00:00.000 --> 00:04.560] おやゆずりのむてっぽうで、子どもの時から、そんばかりしている

コマンドの全容はwhisper --helpで確認できます。
細かい点ですが、CLIでよくあるフラグ引数ではなく、--fp16 FalseのようにTrue/Falseというどちらかの文字列を渡す必要がありました9

終わりに

Whisperの環境構築をして、READMEの例を動かしてみました。
macOSsayコマンドで作った日本語の音声ファイル、認識しましたね〜👏
こんなに簡単に音声認識が使えてやばい〜。

Whisperの登場により、シオン・プロジェクトも影響は免れないでしょう!
果たして、Whisperはシオンさん(の一部)なのか、盛り上がってまいりました!

大盛り上がりのStable Diffusionは、例えばからあげさんが睡眠を削って、毎日めっちゃ楽しそうに取り組まれてますよね!
これは私も睡眠を削ることになるのか!?

次回に続く(To Be Continued)10


  1. https://github.com/openai/whisper#setup

  2. https://github.com/openai/whisper/blob/0b1ba3d46ebf7fe6f953acfd8cad62a4f851b49f/whisper/audio.py#L39-L45

  3. 詳細はこちらで報告しています。 https://github.com/r9y9/ttslearn/issues/37

  4. 「You may need rust installed as well, in case tokenizers does not provide a pre-built wheel for your platform.」

  5. https://github.com/openai/whisper#python-usage

  6. 声をPythonに聴かせて(前編:wavファイルだと書き起こせるのに、マイクの入力はいまいち!?) - nikkie-ftnextの日記

  7. https://github.com/openai/whisper/blob/0b1ba3d46ebf7fe6f953acfd8cad62a4f851b49f/whisper/transcribe.py#L78

  8. https://github.com/openai/whisper#command-line-usage

  9. argparseを使っていて、str2bool関数を定義して渡ってきた文字列('True'または'False')をboolに変換しています。これは好みなんですけどargparseならactionがオススメです(この実装をしないといけない理由があるのかな?)

  10. どうか次回がありますように