はじめに
先の記事で、音声認識 AI の Whisper と、高速・省 VRAM 版の Faster Whisper の Windows11 WSL2 への導入方法について記事にしました。
whisper コマンドや fast-whisper 用の Python script を使用すると、音声ファイルを音声認識して文字起こしする事が出来ました。
とはいえ、毎回オプションを指定したり、initial_prompt を書き換えたりするのは面倒です。画像生成 AI の Stable Diffusion WebUI のような、Whisper の WebUI が無いか探してみた所、次の Hugging Face のページを見つけました。
aandk 氏の作成した Hugging Face 上の Whisper WebUI です。上のリンク先で動作を試す事が出来ますが、音声ファイルの上限が 600 sec となっています。
この Whisper WebUI はローカルで動作させる事も出来ます。その場合には、音声ファイルの 600 sec の上限も無く、外部に個人的な音声ファイルを送る事もありません。
今回の記事では、この Whisper WebUI を Windows11 WSL2 Ubuntu で動作させる手順について紹介します。
Whisper 用の Python 仮想環境の構築
Whisper / Faster Whisper をコマンドライン、或いは Python script で使用できるように環境を構築します。手順については、以下のページを参照下さい。
Python 仮想環境内に構築しておくと、他の環境への影響もなく、ディレクトリごと削除すればやり直しも簡単ですので、仮想環境を作成しておく事をお勧めします。
この時点で、PyTorch は CUDA に対応したバージョンがインストールされている状態です。
Whisper WebUI のインストール
以下のページを参考にしました。
Hugging Face のリポジトリですが、git で clone 出来ます。
$ cd whisper
$ source .venv/bin/activate
(.venv) $ git clone https://huggingface.co/spaces/aadnk/whisper-webui
(.venv) $ cd whisper-webui
clone したディレクトリ内の README.md の Running Locally を見ると、requirements.txt を pip で一括してインストールすると書かれていますが、そのまま実行してはダメです。
- requirements.txt … whisper 用 (requirements-whisper.txt も同じ内容)
- requirements-fasterWhisper.txt … faster-whisper 用
どちらにも、既にインストール済みの Python package が含まれていて、whisper が動作している環境を壊す可能性があります。二種類の requirements.txt から、追加でインストールが必要な package を抜き出したのが以下のファイルになります。仮に requirements-add.txt とします。
ffmpeg-python==0.2.0
gradio==3.38.0
yt-dlp
altair
json5
今回は話者分離 (diarization) は使用しない条件で動作させますので、pyannote-audio 等は含めませんでした。
- ffmpeg-python は音声 codec の変換用
- gradio は WebUI 用の GUI ライブラリ
- yt-dlp は Youtube から動画・音声を取り込むライブラリ
- altair はデータ可視化ライブラリ
- json5 は 設定ファイルの config.json5 を読み込むためのライブラリ
です。
新しく作成した requirements-add.txt から pip でインストールします。
(.venv) $ pip install -r requirements-add.txt
これで準備が出来ました。
Whisper WebUI の起動方法
Python 仮想環境内で、以下のコマンドで Whisper WebUI を起動します。
(.venv) $ python app.py --input_audio_max_duration -1 --auto_parallel True
Using whisper implementation: whisper
[Auto parallel] Using GPU devices ['0'] and 8 CPU cores for VAD/transcription.
Diarization libraries not found - disabling diarization
/home/hiro/whisper/.venv/lib/python3.11/site-packages/gradio/blocks.py:939: UserWarning: api_name predict already exists, using predict_1
warnings.warn(
/home/hiro/whisper/.venv/lib/python3.11/site-packages/gradio/blocks.py:939: UserWarning: api_name predict already exists, using predict_2
warnings.warn(
Queue mode enabled (concurrency count: 1)
Running on local URL: http://127.0.0.1:7860
To create a public link, set `share=True` in `launch()`.
無事起動すれば、http://127.0.0.1:7860 にアクセスすれば、Whisper WebUI が起動します。(クリックで拡大)
Whisper WebUI の使い方
コマンドライン版で使用していた場合には、各項目の意味は分かると思います。それぞれの項目の default を変更する方法については後述します。
左上より順に説明します。
Model と Language を選択します。
Model は tiny / base / small / medium / large / large-v1 / large-v2 / large-v3 の 8種類から選びますが、VRAM 12GB の GPU で推論する場合には large-v3 で良いかと思います。
Language は日本語で音声認識させる場合には japanese を選びます。
次に音声ファイルを指定します。何方か片方に入力します。
URL の欄には音声ファイルの場所や、Youtube の動画の URL を直接入力します。Upload Files には、ローカルに保存してある音声ファイルをアップロードします。内部で ffmpeg で変換してくれますので、mp3 でも m4a でも、ffmpeg が対応している codec であれば大丈夫だと思います。
Microphone Input にはマイクから直接音声を録音します。
Task は transcribe / translate の選択です。音声認識の場合は transcribe を選択します。
VAD (Voice Activity Detector) は発話部分を検出する model です。通常の Whisper には含まれず、Whisper WebUi に含まれている機能です。(faster-whisper には含まれています) silero-vad は以下の github に記載されています。
Whisper / Faster-Whisper では、無音部分を誤検出して無意味な文字を出力する事があります。VAD を有効にすると、発話部分のみを音声認識して、無音部分の誤検出を防止できます。
5種類の選択肢があります。Whisper WebUI のページから引用します。
種類 | 機能 |
none | 発話部分の検出をせずに音声入力全体で Whisper を実行する |
silero-vad | Silero VAD を使用して音声を含むセクションを検出し、各セクションに対して個別に Whisper を実行する。Whisper は各音声セクション間のギャップに対しても実行され、最大マージサイズまでセクションを拡大するか、非音声セクションに対して単独でWhisperを実行する。 |
silero-vad-skip-gaps | Silero VADを使用して音声を含むセクションを検出し、各セクションに対して個別にWhisperを実行する。各音声セクションは、隣接する非音声セクションをカバーするように拡張される。 |
silero-vad-expand-into-gaps | 上記と同様だが、silero-vad で発話が含まれない部分はスキップされる。この方が若干速くなるが、台詞がスキップされる可能性がある。 |
periodic-vad | "VAD - Max Merge Size" に入力した秒ごとにスピーチのセクションを作成する。これは非常に速く単純な処理だが、文や単語を2つに分割する可能性がある。 |
silero-vad か silero-vad-skip-gaps で試してみるのが良いかと思います。
"VAD - Merge Window (s)" と "VAD - Max Merge Size (s)" は default の 5 と 30 のままにしておきました。
ここまで設定したら「送信」を押すと音声認識が始まります。
音声認識の結果は、右側の "Download"、"Transcription"、"Segments" に表示されます。
上部のタブに "Simple"、"Full"、"Extra" の 3種類があります。
これまでの説明は "Simple" の場合です。"Full" の場合には、VAD の option が増え、initial_prompt を入力する欄が追加されるなど、更に細かい指定が出来るようになっています。
Whisper WebUI による音声認識結果
試しに青空文庫の「吾輩は猫である」から本文の一部を頂いて、VOICEVOX で音声ファイルに変換し、そのファイルを Whisper WebUI に読み込ませて音声認識させてみました。音声には「VOICEVOX:四国めたん」を使わせて頂きました。
音声認識の途中では下記のような画面になります。
音声認識が終了すると、次のような表示になります。(クリックで拡大)
固有名詞の違い (×諸星○書生) 等はありますが、変換精度は高いと思います。
Whisper WebUI の設定ファイル
Wisper WebUI の設定ファイルは git clone したディレクトリ内の config.json5 です。このファイルを編集する事によって、起動時のオプションやプルダウンメニューの内容を変更する事が出来ます。
先頭が "//" はコメント行です。
// 音声ファイルの最大時間 -1 で制限なし
// Maximum audio file length in seconds, or -1 for no limit. Ignored by CLI.
//"input_audio_max_duration": 600,
"input_audio_max_duration": -1,
// GPU と CPU の全てのコアを使用する場合に true
// True to use all available GPUs and CPU cores for processing. Use vad_cpu_cores/vad_parallel_devices to specify the number of CPU cores/GPUs to use.
//"auto_parallel": false,
"auto_parallel": true,
// デフォルトで使用するモデル名
// The default model name.
//"default_model_name": "medium",
"default_model_name": "large-v3",
// 音声ファイルの言語の種類 "japanese"
// Language spoken in the audio, specify None to perform language detection
//"language": null,
"language": "japanese",
// faster-whisper を使う場合に変更する
// The default implementation to use for Whisper. Can be "whisper" or "faster-whisper".
// Note that you must either install the requirements for faster-whisper (requirements-fasterWhisper.txt)
// or whisper (requirements.txt)
//"whisper_implementation": "whisper",
"whisper_implementation": "faster-whisper",
他にも起動時の default にしたい項目があれば、変更しておくと便利です。
設定後は、Whisper WebUI の起動コマンドはシンプルになります。
(.venv) $ python app.py
まとめ
コマンドライン版の whisper や faster-whisper の python script の代わりに、Whisper WebUI を導入・使用する方法についてまとめました。事前に whisper や faster-whisper の動作する環境を作成しておけば、スムーズに導入する事が出来ました。
- Whisper でも VAD (Voice Activity Detector) が使えるようになり、無音部分の誤認識や同じ文章の繰り返しの減少が期待できます。(faster-whisper は内部で対応済み)
- 高速・省 VRAM の faster-whisper も使用できますので、VRAM の少ない GPU でも large-v3 model での音声認識が可能になります。
- 複数の音声ファイルを登録したり、それぞれの結果を入手できる GUI は使いやすいです。
この記事には記載しませんが、Youtube の動画の音声認識も出来ました。早口で喋る方の音声認識の精度は落ちますが、それでも概ね文字起こし出来ていますので、このような用途にも十分使用できるのではないかと考えます。
この記事を作成するのに最も時間を要したのは、実は VOICEVOX の環境構築でした。Windows 版のソフトウェアはすんなり動作したのですが、Linux で Python で動かそうとしても中々上手く行かず。もう少し試してから別の記事にしたいと考えています。
今回のアイキャッチ画像
富士山からの初日の出を生成しました。頭の中では Dreams Come True の「何度でも」が繰り返し流れています。
コメント