WhisperX の環境構築がめちゃくちゃ大変だと感じたので、自分用にまとめました。
非エンジニアがChatGPTに聞きながら雰囲気でやったことなので、内容の正確性はお察し。
環境
- Windows 11
- GPU : NDIVIA GeForce RTX 3060
- エディタ:VScode
- Anaconda で Python 3.10 の仮想環境を用意した
- Git 導入済み
GPU関係のいろいろ
https://monomonotech.jp/kurage/memo/m230921_whisper_windows_cuda.html
これの言う通りにやりました。
- ffmpeg
- CUDA
- PyTorch
この3つの導入を行います。 cuDNNの導入は多分やらなくても動きます。 自分は導入しませんでした。(要検証)
ffmpegの導入では環境変数をいじりますが、このとき再起動するのを忘れないようにしましょう(超基本的なことではありますが。。。)
CUDAの導入ではバージョンに気を付ける必要があります。↑のサイトにも書いてますが、PyTorchが対応しているCUDAのバージョンに縛りがあるからです。自分はCUDA 11.8
にしました。
Pytorchの導入ではパッケージのインストールにcondaではなくpipを選びました。condaでもいいですが、GPUの種類によってはAnacondaでサポートされていないものもあるようなので、事前に確認しておくのが良さそうです。
WhisperX インストール
pip install git+https://github.com/m-bain/whisperx.git
github のリポジトリから直接インストールします。当然ですがGitを導入してないとできないので、注意してください。
音声ファイルの準備
サンプリングレート 16kHz のモノラル WAV ファイルならなんでもいいです。WhisperXでは話者分離までできるので、その効果を実感したければ2人以上で喋ってる音声がいいと思います。
ここでは、男2人が5分間くらい喋ってるoutput.wav
を使用します。
Hugging Face 🤗
完全にこちらを舐めている顔文字🤗
https://laboratory.kazuuu.net/obtain-an-api-token-access-token-for-hugging-face/
このサイトを参考に、アクセストークンを取得します。
モデルの同意書
曰く、3つのモデルの同意書に回答しないといけないらしいです。
- https://huggingface.co/pyannote/segmentation
- https://huggingface.co/pyannote/speaker-diarization-3.0
- https://huggingface.co/pyannote/voice-activity-detection
大学とウェブサイトの欄が必須項目になっているみたいです。自分はとりあえず所属している大学とそのホームページのurlを張り付けてみました。3つ目の欄には「I plan to use this model for private use」と入力しました。
本当にこれでいいんか...?でもまあうまくいったし、、、
スクリプト
ここに書いてあるスクリプトを丸コピしました。以下に日本語コメント付きのものを置きます。
# whisperxモジュールから必要な関数やクラスをインポート
import whisperx
# 時間の計算に使用するためのtimedeltaクラスをインポート
from datetime import timedelta
# 進捗バーの表示に使用するtqdmモジュールをインポート
from tqdm import tqdm
# 使用するデバイス(GPU)を指定
device = "cuda"
# 入力となる音声ファイルのパスを指定
audio_file = "output.wav"
# バッチサイズを指定(GPUメモリが不足している場合は数を減らす)
batch_size = 16
# 計算の精度を指定(GPUメモリが不足している場合は"int8"に変更可能、ただし精度は低下する可能性あり)
compute_type = "float16"
# Hugging Faceの認証トークンを指定
auth_token = ""
# Whisper ASRモデルを指定のデバイスと精度で読み込む
model = whisperx.load_model("large-v2", device, compute_type=compute_type)
# 入力音声を読み込む
audio = whisperx.load_audio(audio_file)
# Whisper ASRモデルを使用して音声をテキストに変換し、結果を取得
result = model.transcribe(audio, batch_size=batch_size)
# 言語に応じたアラインメントモデルを読み込む
model_a, metadata = whisperx.load_align_model(language_code=result["language"], device=device)
# Whisperのアラインメントモデルを使用して音声とテキストのアラインメントを行う
result = whisperx.align(result["segments"], model_a, metadata, audio, device, return_char_alignments=False)
# DiarizationPipelineを使用して音声から話者の情報を取得
diarize_model = whisperx.DiarizationPipeline(use_auth_token=auth_token, device=device)
diarize_segments = diarize_model(audio_file)
# 取得した話者の情報を元に、テキストセグメントに話者情報を割り当てる
result = whisperx.assign_word_speakers(diarize_segments, result)
# 結果をテキストファイルに保存する
with open('result.txt', 'w', encoding='utf-8') as f:
# 各セグメントの情報を処理しながらファイルに書き込む
for segment in tqdm(result["segments"], desc="Processing segments", ncols=75):
# セグメントの開始時間を取得して文字列に変換
start_time = str(timedelta(seconds=segment["start"]))
# セグメントの終了時間を取得して文字列に変換
end_time = str(timedelta(seconds=segment["end"]))
# セグメントの話者情報を取得
speaker = segment["speaker"]
# セグメントのテキストを取得
text = segment["text"]
# セグメントの情報をファイルに書き込む
f.write(f'{start_time}-{end_time}\n{speaker}\n{text}\n\n')
ちなみに中身はあんまり理解してないです。コメントはChatGPT君に書いてもらいました。
auth_token
に先ほど🤗で取得したアクセストークンを入れるだけで多分動きます。
ASRのモデルがlarge-v2
になってますが、ここは適宜変更してください。
ターミナルにいろいろ書き込まれてるんだが...
話者分離されたテキストファイルが吐き出されたので、一応動いてはいる。
でもターミナルにいろいろな警告が書き込まれてる...
1.は無視してもいいっぽいですね。
2.は pyannote.audio と torch のバージョンが合ってねぇってことらしいです。CUDAとの互換性にも注意しながらダウングレードすれば解決しそうですが、また今度にします。
3.何言ってるのか分からないです。
じゃあ別になにもしなくていいかな。。。
かわいい。