2024年1月31日水曜日

Python の oepnai-whisper で Speech-to-text したので結果のメモ

Python の oepnai-whisper で Speech-to-text したので結果のメモ

概要

M2 mac mini 上で openapi-whisper を動かして音声解析してみました
音声ファイルが大きい場合は素直に mlx 経由で実行しましょう

環境

  • macOS 14.2.1 (M2 pro mac mini)
  • Python 3.11.6
  • openai-whisper 1.1.10
  • MLX 0.0.10

インストール

  • pipenv install openai-whisper

サンプルコード

import whisper

# モデルは large を使用
model = whisper.load_model("large")
# 解析
result = model.transcribe("/path/to/audio.m4a")
# ファイル書き出し
with open("result.txt", mode="w") as f:
    f.write(result["text"])

使用モデル

  • large
  • ファイルサイズ 2.88G

音声ファイル

  • m4a ファイル
  • サイズは 45.41MB
  • ビットレート 64kbps

解析時間

  • 不明 (かなりかかりそうなので途中でやめて mlx 形式にしました)

MLX 経由で実行する

以下は MLX を使って whisper を動作させる方法です
こちらを参考に設定していきます

clone

  • git clone https://github.com/ml-explore/mlx-examples.git

初期化

  • cd mlx-examples/whisper
  • brew install ffmpeg
  • pipenv install -r ./requirements.txt

モデルのコンバート

pytorch で作成された whisper のモデルを mlx で使用可能なモデルに変換します
もしかすると hugging face の MLX Community を使えば自分でコンバートする必要はないかもです

  • pipenv run python convert.py --torch-name-or-path large --mlx-path mlx_models/large
[INFO] Loading
[INFO] Saving

生成されるファイルは以下のとおりです

tree mlx_models
mlx_models
└── large
    ├── config.json
    └── weights.npz

2 directories, 2 file

スクリプト作成

  • vim app.py
import whisper

# 生成したモデルと音声ファイルを指定して解析
result = whisper.transcribe(
    "/path/to/audio.m4a", path_or_hf_repo="mlx_models/large", verbose=True
)

# ファイル書き出し
with open("result.txt", mode="w") as f:
    f.write(result["text"])

ここで import している whisper.transcribe は mlx-examples が独自で修正している transcribe.py になります
なので path_or_hf_repo というパラメータが指定できます

実行

  • pipenv run python app.py

今回の場合成功すれば result.txt にテキスト情報がそのまま保存されます

解析時間

  • 約1時間

GPU はほぼフルで使っていました
スペックによってはさらに速くなるかなと思います

最後に

mlx + whisper で M2 mac mini 上で音声解析してみました
精度はかなりいいので Google の Speech-to-text レベルのものがローカルで動作するようになります
スペックの低いマシンではかなり時間がかかるのでそれなりのスペックのマシン特に GPU のあるマシンを使って解析することをオススメします

また mlx を使うことで GPU をフルに使って解析するので時間も短縮できます

language='ja' というキーワード引数を指定しなくても自動で日本語だと判断してくれましたが入れてもいいのかもしれません
verbose=True を指定すると自動検出した言語を print デバッグしてくれるので試しに入れてみてもいいのかもしれません
また verbose=True は解析の経過も表示してくれるのでファイルが大きい場合は入れたほうがいいかなと思います

参考サイト

0 件のコメント:

コメントを投稿