Python + Whisperを使って音声の文字起こし
これを唐突にやってみたくなりました。
手順としてはこんな感じです。
- minicondaで仮想環境を作っておく
- そこにwhisperをインストール
- コードからmp3など音声を読み込み
- それを自動で文字起こしさせる
この手順とかwhipserの文字起こし精度とか…
いろいろ判明したことがあったので残しておきます。
このページの目次
1.minicondaで仮想環境を用意する
ここではminicondaを使うことにします。
※ もちろんconda・pipだけでもOK
仮想環境があると何かと便利なんですよね。
だから好みでminicondaを使うことにしました。
▼ 始めに whipser という名前で環境作成
1 |
> conda create -n whisper python=3.7 |
▼ 仮想環境を有効化
1 |
> conda activate whisper |
Python3.7以上であることがWhisper必須です。
ここまでで仮想環境の用意が完了
2.pip経由でwhisperをインストール
作成した環境にwhiperをインストールしていきます。
▼ Github : openai / whisper
▼ 次のpipコマンドでインスト
1 |
> pip install git+https://github.com/openai/whisper.git |
▼ 参考までにインストールの出力結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Collecting numpy Using cached numpy-1.21.6-cp37-cp37m-win_amd64.whl (14.0 MB) Collecting torch Downloading torch-1.13.0-cp37-cp37m-win_amd64.whl (167.3 MB) ---------------------------------------- 167.3/167.3 MB 10.9 MB/s eta 0:00:00 Collecting tqdm Using cached tqdm-4.64.1-py2.py3-none-any.whl (78 kB) Collecting more-itertools Downloading more_itertools-9.0.0-py3-none-any.whl (52 kB) ---------------------------------------- 52.8/52.8 kB 2.8 MB/s eta 0:00:00 Collecting transformers>=4.19.0 Downloading transformers-4.25.1-py3-none-any.whl (5.8 MB) ---------------------------------------- 5.8/5.8 MB 28.7 MB/s eta 0:00:00 Collecting ffmpeg-python==0.2.0 Downloading ffmpeg_python-0.2.0-py3-none-any.whl (25 kB) ... Successfully built whisper |
whisper自体はそれほど容量を食いません。
あと音声文字起こしにはデータセットが必要です。これは別途ダウンロードとかは必要ないけど、容量的には巨大だから注意が必要です(後述)
3.Youtubeから適当な音声を拾ってくる
音声が用意済ならここはスキップ
ここではYouTubeから音声をDLすることにします。
▼ youtube-dlをインストール
1 |
> pip install yt-dlp |
▼ 対象のYouTube動画から音声だけmp3保存
1 |
> yt-dlp -x --audio-format mp3 https://www.youtube.com/watch?v=j5BpUK8XTJQ |
ちなみに今回拝借した動画がこちら :
URL : www.youtube.com/watch?v=j5BpUK8XTJQ
背景に主張強めなBGMが流れている動画です。
ノイズが多い動画でも文字起こしできるのか、
そういった精度も確かめたいからこの動画にしました。
4.音声文字起こしのpythonコード例
あとはこういうpythonコードを書くだけです。
▼ test.py : whipserで文字起こしするコード例
1 2 3 4 5 6 7 8 9 10 |
import whisper ## モデル(データセット)読み込み model = whisper.load_model("small") ## 音声へのパス path ="sample.mp3" ## 結果を出力と同時に取得 result = model.transcribe(path, verbose=True, language='ja') |
▼ 実行時の出力結果
1 2 3 4 5 6 |
100%|■■■■■■■■■■| 5/5 [00:04<00:00, 1.24it/s] 100%|■■■■■■■■■■| 461M/461M [01:00<00:00, 7.99MiB/s] warnings.warn("FP16 is not supported on CPU; using FP32 instead") [00:00.000 --> 00:10.440] 歴史的文水例にあって私が戦闘に立って 主の外交を進め新時代リアリズム外交を推進していく決意 [00:10.440 --> 00:20.000] ニューヨークを訪れました 一般討論演説においては国連の理念実現のための日本の決意を表明いたしま した ... |
精度はモデルsmallのせいもあって微妙…
もちろんモデルをmedium・largeに変更(後述)すれば精度が上がります。ただしメモリ使用量と実行時間・精度はトレードオフな関係ですね。
それからモデルが存在しない場合、自動でダウンロードしてくれます。smallだと461MB程度なので、それほど大きくありません。
whisperの各モデルと種類・サイズの対応表
Whisperでは以下5つのモデルが用意されてます。
▼ モデルの容量とかメモリ使用量の対応表
モデル名 | 容量 | 必要なVRAM |
---|---|---|
tiny | < 400MB | ~1 GB |
base | < 400MB | ~1 GB |
small | 461MB | ~2 GB |
medium | 1.42GB | ~5 GB |
large | 2.87GB | 10 GB |
さすがにmedium・largeはモデルサイズが巨大です。大丈夫だとは思うけど、通信環境・ストレージ容量とかには注意が必要かもしれません。
表中のVRAMですが、これはCUDA経由でGPU使用するためのVRAM目安です。CPUを使うなら気にしなくていいので問題ありません。
普通の環境だとCPUによる実行になります。
モデルごとの文字起こしの精度の違いと結果
ここではsmall/medium/largeを試します。
※ small/baseは精度がアレなので除外
それぞれの文字起こし結果はこうなりました。
モデルsmallによる文字起こし結果
1 |
歴史的文水例にあって私が戦闘に立って 主の外交を進め新時代リアリズム外交を推進していく決意 ニューヨークを訪れました 一般討論演説においては国連の理念実現のための日本の決意を表明いたしま した |
文脈的に場違いな誤字がチラホラ見られる…
誤字脱字の総数4つくらい
モデルsmallだと精度はこの程度です。
モデルmediumによる文字起こし結果
1 |
歴史的分水例にあって、私が先頭に立って首都外交を進め、新時代リアリズム外交を推進していく決意でニューヨークを訪れました。一般討論演説においては、国連の理念実現のための日本の決意を表明いたしました。 |
先ほどより誤字は少ない(例 : 戦闘 => 先頭)
誤字脱字の総数は2つほど
かなり精度がよくなってきました。
モデルlargeによる文字起こし結果
1 |
歴史的分水嶺にあって私が先頭に立って首脳外交を進め新時代リアリズム外交を推進していく決意でニューヨークを訪れました。一般討論演説においては国連の理念実現のための日本の決意を表明いたしました |
ほぼほぼ誤字脱字なし!
完璧に近いけど、この部分以外ではまだ若干の誤字脱字が見られました。超高精度なんだけど、100%はないということ。
でも自動文字起こしとしては優秀
GPU(CUDA)でwhipserを実行してみた
当環境だとwhisperは自動的にCPUを使います。
それはCUDAがインストールされていないからです。
▼ CUDAとは何なのか
CUDAとは、コンピュータのグラフィックスプロセッサ(GPU)を利用して汎用の並列計算を行うためのソフトウェア開発・実行環境の一つ。米NVIDIA社が自社製GPU向けに開発・提供している。
次のようにCUDAを使うとGPU実行することも可能に
▼ CUDAをpipインストール
1 2 3 4 5 6 |
>python -m pip install --upgrade --force-reinstall torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116 Looking in indexes: https://pypi.org/simple, https://download.pytorch.org/whl/cu116 Collecting torch Downloading https://download.pytorch.org/whl/cu116/torch-1.13.0%2Bcu116-cp37-cp37m-win_amd64.whl (2436.6 MB) ---------------------------------------- 2.4/2.4 GB 1.3 MB/s eta 0:00:00 |
▼ コマンドからGPU認識させて実行
1 |
> python -m whisper sample.mp3 --model small --device cuda --language Japanese |
速度的には若干早くなったかなという程度
※ グラボはGTX1650を使用している
グラボパワードを活用できるのはいいですね。
whisperは高精度な上に使いやすい
以上、Python+Whisterによる音声文字起こしでした。
総括としては高精度な上に使いやすかったです。
※ ただしモデルがmedium以上という条件下
音声文字起こしの自動化にかなり最適だと考えます。