はじめに
私はこれまで、画像生成 (Stable Diffusion WebUI) と文字生成 (Text generation web UI, calm2-7b) の二種類の AI について試してきました。
画像生成、文字生成と来れば、未だ取り組んでいないのは音声認識 AI です。
OpenAI が Open Source として公開している Whisper を使用して、音声から文字起こしが出来るかどうか試してみました。また、オリジナルの Whisper よりも高速且つ省 VRAM で動作できる faster-whisper についても、同時に試して比較しました。
Whisper について
Whisper is a general-purpose speech recognition model. It is trained on a large dataset of diverse audio and is also a multitasking model that can perform multilingual speech recognition, speech translation, and language identification.
Whisperは汎用音声認識モデルである。多様な音声の大規模データセットで学習され、多言語音声認識、音声翻訳、言語識別を実行できるマルチタスクモデルでもある。
https://github.com/openai/whisper
Whisper は、OpenAI 社が開発した汎用音声認識モデルです。英語だけでなく多言語に対応していて、もちろん日本語についても音声を認識、テキストとして出力できます。同時に翻訳機能も有しています。
ChangeLog を見ると、2023年1月に初版の v20230117 が github で公開されています。最新版は v20231117 で、直近では large-v3 model への対応と PyTorch 2.1 への対応がなされています。
対応する model
使用する model は Hugging Face から取得します。以下は large-v3 へのリンクです。
英語のみのモデルを除いた一覧表を以下に示します。
Size | Parameters | Multilingual model | Required VRAM | Relative speed |
---|---|---|---|---|
tiny | 39 M | tiny | ~1 GB | ~32x |
base | 74 M | base | ~1 GB | ~16x |
small | 244 M | small | ~2 GB | ~6x |
medium | 769 M | medium | ~5 GB | ~2x |
large | 1550 M | large | ~10 GB | 1x |
large model でも必要な VRAM は ~ 10 GB ですので、RTX3060 12GB でも十分使用できる範囲です。
2023年9月3日に large-v2 model が、2023年11月6日に large-v3 model が公開されて、より高精度に認識できるようになっています。
今回は、主に large-v3 model を使用します。
なお、Whisper をローカルの PC で使用する場合には、PC 代や電気代以外は無料で使用する事が出来ます。OpenAI の Whisper API を使用する場合には、$0.006 / minute が必要です。
Faster Whisper について
Faster Whisper は、OpenAI の Whisper に対して、高速化・省VRAM で同等の性能を発揮する音声認識 AI です。
faster-whisper is a reimplementation of OpenAI's Whisper model using CTranslate2, which is a fast inference engine for Transformer models.
This implementation is up to 4 times faster than openai/whisper for the same accuracy while using less memory. The efficiency can be further improved with 8-bit quantization on both CPU and GPU.
faster-whisperは、OpenAIのWhisperモデルを、Transformerモデル用の高速推論エンジンであるCTranslate2を使って再実装したものです。
この実装は、同じ精度でopenai/whisperより最大4倍高速で、メモリ使用量も少ない。CPUとGPUの両方で8ビット量子化を行えば、効率はさらに向上する。
https://github.com/SYSTRAN/faster-whisper
model は Whisper と同じものを使用します。初回の実行時に Transformer model から CTranslate2 model への変換が行われます。
私の使用しているビデオカードは RTX3060 12GB ですので、Whisper の large-v3 model でも使用可能な VRAM の容量ですが、faster-whisper を使用する事により、どの程度高速化・省VRAM されるのか興味がありますので、同じファイルを音声認識させて比較してみます。
Whisper のインストール
ググると Windows 環境に Whisper をインストールするのは大変という記事が多かったのですが、WSL2 Ubuntu を使用すると、インストールはそれほど難しくありませんでした。
インストール手順について一つ一つ説明します。
WSL2 Ubuntu の準備
Windows11 で WSL2 Ubuntu を使用する方法については、ググると沢山の情報がありますので、この記事では省略します。
今回は、先日の記事でアップグレードした Ubuntu 23.10 を使用します。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 23.10
Release: 23.10
Codename: mantic
$ python3 -V
Python 3.11.6
必要な package のインストール
Whisper の github の Setup の項を見ると、必要最低限の情報のみ記載されています。GPU を使用して Whisper の音声認識をする場合には、
- CUDA
- CUDA のバージョンに対応した PyTorch
- ffmpeg
- transformers, datasets, accelerate, librosa, soundfile
他にも git や rust が必要な場合には、追加でインストールしてください。
CUDA は過去に、他の生成 AI の為に11.8 をインストールしていましたので、これを使用します。
$ /usr/local/cuda-11.8/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Wed_Sep_21_10:33:58_PDT_2022
Cuda compilation tools, release 11.8, V11.8.89
Build cuda_11.8.r11.8/compiler.31833905_0
ffmpeg は apt でインストールします。
$ sudo apt install ffmpeg
PyTorch は CUDA のバージョンに合わせて Python 仮想環境内でインストールします。
Python venv 仮想環境の作成と pip によるインストール
個人的には、.venv 以下に作るのが好みです。
$ mkdir whisper && cd whisper
$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ pip list -o
Package Version Latest Type
---------- ------- ------ -----
pip 23.2 23.3.2 wheel
setuptools 68.1.2 69.0.3 wheel
(.venv) $ pip install -U pip setuptools
行頭に (.venv) が表示されていれば、仮想環境の中に入っています。pip と setuptools をアップデートしておきます。
PyTorch については、下記ページのマトリックスから選択します。Stable (2.1.2) をインストールします。
(.venv) $ pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
CUDA が使用可能かどうか動作確認します。
(.venv) $ cat test.py
import torch
print(torch.cuda.is_available())
(.venv) $ python test.py
True
これで CUDA 11.8 に対応した PyTorch がインストール出来ました。
必要に応じて、transformers, datasets, accelerate, librosa, soundfile も pip でインストールします。
(.venv) $ pip3 install transformers datasets accelerate librosa soundfile
Whisper 本体のインストール
Whisper の github に記載されている方法でインストールします。
(.venv) $ pip install git+https://github.com/openai/whisper.git
...(snip)...
Successfully installed ...(snip)... openai-whisper-20231117 ...(snip)...
openai-whisper-20231117 がインストールされれば成功です。
(.venv) $ which whisper
/home/hiro/whisper/.venv/bin/whisper
whisper コマンドが Python 仮想環境内にインストールされます。
Whisper の動作確認
whisper コマンドで動作を確認します。
まず音声ファイルを準備します。自分の声を録音しても良いですが、私は青空朗読と radiko のタイムフリーのデータを使用しました。(著作権上の問題がありますので、認識された文字の全文は載せません)
radiko の音声ファイルの取得には、rec_radiko_ts を使用しました。
whisper コマンドの実行例です。time コマンドで要した時間を測定しました。
(.venv) $ mkdir whisper_results
(.venv) $ time whisper --model large-v3 \
--output_dir whisper_results --language Japanese radiko_sound.m4a \
|& tee whisper_results/radiko_sound.log
...(snip)...
real 5m20.512s
user 4m31.220s
sys 1m4.534s
10分の radiko の音声データが 5分20秒で文字起こしされました。large-v3 model ですが、実時間の約半分で終了しています。
whisper コマンドの結果は、拡張子別に 5つのファイルに出力されます。
拡張子 | 内容 |
txt | 一定の区切り毎に改行されたテキストファイル 例: 感染者による死亡者を増やして 倒産による自殺者を減らすという政策転換は 誰がどのような価値判断で行うのでしょうか |
srt | SubRip Subtitle の略。 キャプション/字幕と開始/終了時刻を含むテキストファイル 例: 15 00:01:03,580 --> 00:01:08,000 感染者による死亡者を増やして 16 00:01:08,000 --> 00:01:12,780 倒産による自殺者を減らすという政策転換は 17 00:01:12,880 --> 00:01:16,380 誰がどのような価値判断で行うのでしょうか |
tsv | 開始時刻(msec)、終了時刻(msec)、テキスト内容で タブ区切りされたファイル 例: start end text 63580 68000 感染者による死亡者を増やして 68000 72780 倒産による自殺者を減らすという政策転換は 72880 76380 誰がどのような価値判断で行うのでしょうか |
vtt | Video Track Text の略 動画字幕で最も良く使用される形式 例: 01:03.580 --> 01:08.000 感染者による死亡者を増やして 01:08.000 --> 01:12.780 倒産による自殺者を減らすという政策転換は 01:12.880 --> 01:16.380 誰がどのような価値判断で行うのでしょうか |
json | json 形式のファイル |
srt と vtt ファイルは Youtube でも使用されている形式のようです。
Faster Whisper のインストール
Whisper 用に構成した Python 仮想環境内に Faster Whisper をインストールします。
Faster Whisper の github 内に記載されている必要なソフトウェアは、
- Python 3.8 以上
- cuBLAS for CUDA 11
- cuDNN 8 for CUDA 11
です。
nVidia の cuBLAS、cuDNN 8 は共に CUDA のインストール時に追加するリポジトリに含まれていますので、apt でインストールする事が出来ます (cuBLAS は既に入っているかもしれません)。
$ sudo apt install libcublas-11-8
$ sudo apt install nvidia-cudnn
Faster Whisper をインストールします。
(.venv) $ pip install faster-whisper
...(snip)...
Successfully installed Faster_Whisper-0.10.0 ...(snip)...
Faster_Whisper-0.10.0 がインストールされていれば OK です。
Faster Whisper の動作確認
Faster Whisper はコマンド版がありません。Python のスクリプトで実行する必要があります。
Faster Whisper の github に記載されているサンプルを少し変更して使用します。
#!/home/hiro/whisper/.venv/bin/python
from faster_whisper import WhisperModel
import sys
args = sys.argv
if 2 != len(args):
print(f'Usage : {args[0]} target_filename')
sys.exit(1)
target_filename = args[1]
model_size = "large-v3"
model = WhisperModel(model_size, device="cuda", compute_type="float16")
segments, info = model.transcribe(target_filename, beam_size=5, language="ja", initial_prompt="今日は、良い天気です。")
for segment in segments:
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
変更箇所は以下の通りです。
- 読み込む音声ファイルを指定できるように変更
- 日本語 (ja) を指定
- initial_prompt を追加
initial_prompt を追加したのは、句読点が追加されなかった為です。簡単な文章を initial_prompt に追加するだけで、句読点を適宜追加してくれます。
実行結果です。
(.venv) $ time ./faster_whisper_transcription.py ./radiko_sound.m4a \
|& tee faster_whisper_results/radiko_sound.log
...(snip)...
real 1m17.466s
user 1m28.063s
sys 0m18.148s
10分の radiko の音声データが 1分17秒で文字起こしされました。large-v3 model ですが、実時間の約1/8で終了しています。
Whisper と Fast Whisper の比較
複数の音声ファイルを使用して、Whisper と Faster-Whisper の音声認識に要した時間を比較しました。
音声ファイル | 内容 | 音声の実時間 (ffprobe) | 音声認識に 要した時間 と割合 (Whisper) | 音声認識に 要した時間 と割合 (Faster Whisper) |
file_1 mp3 (青空朗読) | 女性の声で童話の朗読 | 12m06s | 8m26.422s 69.8% | 2m12.210s 18.2% |
file_2 m4a (radiko_1) | 放送大学の講義 | 1h00m00s | 27m57.100s 46.6% | 9m52.842s 16.5% |
file_3 m4a (radiko_2) | 情報番組、途中に音楽あり | 10h00s | 5m20.512s 53.4% | 1m17.466s 12.9% |
file_4 mp3 (Youtube) | Windows の画面収録で記録して 音声のみ分離 女性の声の朗読 | 1m54s | 0m49.531s 43.4% | 0m16.985s 14.9% |
nVidia RTX3060 12GB の large-v3 model を使用した場合、音声の実時間に対して、Whisper では 43 ~ 70 %、Faster Whisper では 13 ~ 18 % の時間で音声認識による文字起こしが完了しました。
もう少し高性能な GPU を使用できれば、実時間の 10% 以下で音声認識が可能になるかと思います。
Whisper / Faster Whisper を使用した感想と注意点
Whisper / Faster Whisper を使用して、音声認識による文字起こしを行った感想です。
まずはポジティブな感想です。
- 朗読や講義、情報番組等、今回使用した音声ファイルは、比較的声がはっきりしているサンプルが多かった為か、音声認識の精度は高いと感じました。専門用語や漢字の間違いはあるものの、文章のみを読んでも内容が理解できるレベルでした。文章を読んで理解して、少し手直しすれば大丈夫なレベルです。
- 女性の声、男性の講義調の声、ラジオの DJ の声、天気予報や交通情報、ニュース速報のアナウンサーの声、等、発声する人の種類に寄らず、対談のように途中で変わった場合にも、問題なく音声認識できていました。声の特徴を把握せずに音声認識できるのはすごい、と素直に感心しました。
- Whisper の github には large model では実時間程度で音声認識できると書かれていましたが、ワーストケースでも実時間の 70%、Faster Whisper を使用した場合には実時間の 18% で音声認識が完了しました。nVidia RTX3060 12GB というギリギリ AI できるか、というレベルの GPU でもそれなりに使用できます。
- Whisper では、そのまま動画の字幕に使用できる srt と vtt ファイルを出力できますので、作成した動画に字幕を追加したい場合等にも応用できるかと思います。
次にネガティブな感想です。
- 最初の1文を音声認識できないという状況がありました。音源の最初に無音部分を追加しても解決せず。結局、initial_prompt に最初に発言する言葉を入れる事により、認識できるようになりました。
- 句読点を入れてくれませんでした。漢字も使用しないような状況もあり、まるで小学生の書いた文章を読んでいる気持ちになりました。こちらも、initial_prompt に句読点を含む文章を一つ入れる事で、ある程度解消できました。
- 無音部分や音楽部分、AI の判断する境界付近で、同じ文字列が複数表示されたり、前後の繋がりが無い文章が急に表示されたり、音声認識が一定期間停止する事がありました。この辺りは仕様と割り切って、人間が対処するか、時間をオフセットした音声ファイルを複数用意して音声認識させる必要があると感じました。
まとめ
音声認識モデルの Whisper と、高速版の Faster Whisper を使用してみました。large-v3 model を nVidia RTX3060 12GB で使用した場合の感想です。
- 2 min ~ 60 min の音声ファイルを音声認識モデル Whisper / Faster Whisper により文字起こししてみました。
- ワーストケースでも Whisper で実時間の 70%、Faster Whisper では実時間の 18% で音声認識が完了しました。
- 男性・女性や話者が変わった場合にも、そのまま音声認識できます。
- 音声認識で生成されたテキストは、個人的な感覚ですが 95% はそのまま使用できると思います。ただし、誤変換のような単語の誤認識、同じ文字列の複数回表示、AI の判断する区切り付近の文章の乱れはありますので、最終的には人間が訂正する必要があると感じました。
- initial_prompt に句読点を含む文章を入れないと、句読点を入れてくれません。また、最初の音声が認識されない場合にも initial_prompt に文字を入れると解消される事があります。
Whisper / Faster Whisper による音声認識は、100% の精度ではもちろんありませんが、95% 位は認識されて、そのまま読んでも内容を理解できるレベルの文章を生成できます。ちゃんとした文章にする為には人間の介在は必要ですが、全てを聞きながら打ち込む事に比べると、内容の理解や文章の手直しに集中できますので、かなりの労力を減らす事が出来ると思います。
Whisper にも WebUI があるようですし、Youtube の動画から直接字幕を作成する事も出来るようです。近いうちに試してみたいと考えています。
今回のアイキャッチ画像
眠そうな三毛猫を SDXL で生成しました。oil painting を prompt に追加すると、実写っぽくなくなってイラストっぽくなるので私好みです。
私が使用しているキーボードは keychron K8 US 配列、茶軸です。下記リンクは赤軸です。国内の代理店は kopek になります。
US 配列キーボードを日本語環境で使う方法については、以下の記事を参照下さい。
PC を操作している時に最も長く触れている機器はキーボードです。配列もそうですが、キータッチについても拘って選ぶと、キーボード入力が快適で楽しくなります。現在は keychron K8 US 配列茶軸で満足しています。(試してみたいキーボードは他にもありますが沼にハマりそうで抑えています)
コメント