WhisperXによる、音声文字起こし&話者分離(Windows11環境)
OpenAIによる、オープンソースの文字起こしWhisper。こちらに改良を加えたWhisperXというものが公開されています。こちらは、faster-whisperを使った速い文字起こし、音のタイミングと文字のタイミングを合わせるテキストアラインメント、pyannoteを使った話者分離などが可能です。
開発者さんのTwitterアカウントはこちら。テキストアラインメントと話者分離のデモの映像も付いています。
こちらを使って、複数話者がいる音声を、話者分離して文字起こしをしてみました。Google Colabでは上手く動かせなかったので(何故)、Windows11環境のローカルで動かしています。
pip install git+https://github.com/m-bain/whisperx.git
venvで仮想環境を用意し、そこに↑のpipコマンドでインストールします。
そして、以下のスクリプトを実行します。「起こしたい音声ファイル名」の部分には、実際のファイル名を入れてください。'hugging faceのトークン'にも同様に、ご自身のHugging Faceのトークンを入れてください。
import whisperx
from datetime import timedelta
from tqdm import tqdm
device ="cuda"
audio_file = "起こしたい音声ファイル名"
batch_size = 16 # reduce if low on GPU mem
compute_type = "float16" # change to "int8" if low on GPU mem (may reduce accuracy)
model = whisperx.load_model("large-v2", device, compute_type=compute_type)
audio = whisperx.load_audio(audio_file)
result = model.transcribe(audio, batch_size=batch_size)
model_a, metadata = whisperx.load_align_model(language_code=result["language"], device=device)
result = whisperx.align(result["segments"], model_a, metadata, audio, device, return_char_alignments=False)
diarize_model = whisperx.DiarizationPipeline(use_auth_token='hugging faceのトークン', 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')
pyannoteによる話者分離をするには、事前にHugging Faceのアカウントを取得し、以下のページで利用規約に同意した上で、トークンを取得する必要があります。
トークンはHugging Faceにログインした状態で以下のページにアクセスすると取得出来ます。
今回は試しに、以下の参議院予算委員会の中継から、00:30:30からの部分の音声を抜き出して利用してみました。
著作権法の40条にて、公開の場で行われた政治上の演説は自由に利用できることが定められているおり、国会での演説はこちらに該当すると思ったので、実験に利用させてもらっております(この解釈が間違っていたらすいません)
上記のスクリプトで、実際に文字起こししてみたものの冒頭部分が以下です。
実際には以下の文章の「考えております」と「竹見」の間で話者が切り替わっているのですが、そこは上手く拾えていなかったようです。ただ、全体としては、おおよそ分離出来ています。
ちなみに、話者分離にはかなり時間がかかります。使っているGPUによっては、録音データの実時間以上余裕でかかることもあるでしょう。
正直なところ、LINE CLOVA Note、Nottaのような話者分離機能を謳った文字起こしツールの方が高速ですし、正確でもあると思います。
ただ、機密性の高い会議の音声など、クラウドにアップロードするのが社内規定上認められないため、ローカルPCで文字起こしを行いたいといった場面はあると思います。無料で、ローカルで動く話者分離付き文字起こしとしては、十分に実用的な範囲ではないでしょうか。
というわけで、WhisperXを試してみたという話でした。Google Colabで動かせたという方は、是非やり方を教えてください…!