前回はAmiVoiceAPIを使用して、ログの文字起こしをしました。
今回は、Kotoba-Whisperを試してみたいと思います。
(whisperとは)
(whisperはOpenAIが開発した音声認識エンジンです。
OpenAI自身もAPIを提供してはいますが、whisperはオープンソースのモデルです。)
(「ささやき」という名前なの、可愛いですよね。)
Kotoba-Whisperとは
Kotoba-Whisperは日本語特化の派生モデルです。
whisperはオープンソースがゆえに、たくさん派生があります。
嬉しい点
個人的に何よりもうれしいのは、料金です!!
モデルが公開されていて、自由に利用することができるため、ローカルで動かすことが出来れば、お金が必要ありません。電気代だけで済みます。
導入
Kotoba-whisperはあまり関係ない部分も含みます。
Pythonの最新バージョンをインストールする
私のパソコンにはDetroit Become Humanを遊ぶためにGPUが入っていますから、使わない手はないなと思ったのですが、もともと入れていたPythonが古すぎてCUDAが入りませんでした。
さいきんPythonの環境をバージョン違いで入れすぎて環境が荒れていることこの上なかったので、まず最新のPythonを入れる作業が発生しました。
Nividiaのドライバーをインストールする
GPUが使えるはずなんですよ。
えーっと、だからドライバーを入れましょうね。
あれ? 今までドライバー入ってなかったのか?
……。
GPUの何が入っているか分からなかったら、デバイスマネージャーで確認します。
PyTorchをインストールする
PyTorchは、Python向けの機械学習ライブラリです。こういうモデルを動かしたいなと思ったときに必要になってくるようですね。
公式サイトを参考に、必要なパッケージをインストールします。
こうやって選ぶとコマンドを教えてもらえるので、インストールします。
.venvの環境を作る
Visual Studio Codeでフォルダを作って、.venvを作成します。
python -m venv .venv
そしておもむろに、仮想環境を起動します。
source .venv/bin/activate
必要なパッケージのインストール
いるパッケージをインストールします。
pip install --upgrade pip
pip install transformers accelerate datasets[audio]
あと、ffmpegも入れました。
pip install ffmpeg
実装
とりあえず、ファイルの選択などのUIは後回しにするとして、動かしてみることにしました。
import torch
from transformers import pipeline
import torchaudio
import numpy as np
import os
import time # 時間計測用モジュールをインポート
print("Current working directory:", os.getcwd())
# コンフィグ設定
model_id = "kotoba-tech/kotoba-whisper-v1.0"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
device = "cuda:0" if torch.cuda.is_available() else "cpu"
model_kwargs = {"attn_implementation": "sdpa"} if torch.cuda.is_available() else {}
generate_kwargs = {"language": "japanese", "task": "transcribe"}
# モデル読み込み
pipe = pipeline(
"automatic-speech-recognition",
model=model_id,
torch_dtype=torch_dtype,
device=device,
model_kwargs=model_kwargs
)
# 音声ファイルの読み込み (torchaudioを使用)
audio_path = "test.wav"
waveform, sample_rate = torchaudio.load(audio_path)
resample_waveform = torchaudio.transforms.Resample(orig_freq=sample_rate, new_freq=16000)(waveform) # Whisperモデルが期待するサンプリングレートにリサンプル
# PyTorch テンソルを NumPy 配列に変換
resample_waveform_np = resample_waveform.numpy()
# 変換実行
start_time = time.time() # 処理開始時間
result = pipe({"array": resample_waveform_np[0], "sampling_rate": 16000}, generate_kwargs=generate_kwargs)
end_time = time.time() # 処理終了時間
# 結果と処理時間の表示
print(result["text"])
print("Processing time: {:.2f} seconds".format(end_time - start_time))
きちんと動いてくれました(テスト音声はAmiVoiceの検証で使ったものを流用しました。)
実際に、動画ログを文字起こしさせてみる
長尺のマダミス(4時間45分程度)を文字起こしさせてみました。
時間はたったの6分程度!!!
(動作環境にもよるかと思いますが)私のパソコンはちょっと良いゲーミングパソコンではありますが、機械学習を専門にしている人たちほどのつよつよPCではないのでかなり驚きです。
はやーい!
精度について
ちょうどAmiVoiceAPIで文字起こしをしていたところだったので、そちらとの比較が多めです。
8割くらいはできている
8割くらいはよい感じに文字起こししてくれていました。
会話の流れを思い返すには良い感じです。
幻聴(繰り返し)が発生している
固有名詞や、状況的にあまり普通使わない単語を間違ってしまうのは仕方ないとして、それとは別に、結構幻聴(=全く言ってないことを文字に起こしてしまう)がありました。
意味が取れない文章を繰り返してしまっているようなんですね。
なかなかホラー。
元の音声がそうというわけでもなく、これは幻聴をやってしまう箇所のようです。
頻度は少な目で、全体としてはほぼ上手くいっているようなので、無料でこれなら……まあ、妥協しても良い範囲ではあります。1からよりは断然マシですね。
言ったことが上手く文字に起こせていなかったり、別の言葉に間違われてしまうのは良いとして、結構、言ってもいないことが言ったことになってるとぎょっとするかもしれない。
ほか、句読点や文の区切りなどは非常に少ないです。たまに「。」がありますが、AmiVoiceのほうが分の区切りは親切でした。
(それでも、あるだけで結構嬉しいです。)
総括
速度、コストは◎ですが、精度や修正の少なさという点を見ればAmiVoiceの方が勝るという感じでしょうか。