5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

faster-whisperを使ってより速いく正確な文字起こし

Last updated at Posted at 2024-07-29

はじめに

Pythonを使って、文字起こしをする方法を記載する。
前回はwhisperを使った文字起こしを行った。しかし、whisperでの文字起こしでは高速で正確な文字起こしを行うことは難しい。よって今回の記事でwhisperよりも最大4倍の高速化をすることができ、さらに正確性も高くなったfaster-whisperを紹介する。

faster-whisperとは

faster-whisperは、OpenAIのWhisperのモデルをCTranslate2という高速推論エンジンを用いて再構築したものである。CTranslate2とは、NLP(自然言語処理)モデルの高速で効率的な推論を目的としたライブラリであり、特に翻訳モデルであるOpenNMTをサポートしている。また、軽量で高速な推論を実現するために設計されており、CPUやGPU上での実行が可能である。Whisperと比較して、同じかそれ以上の精度を保ちながら最大4倍高速な処理速度と、より少ないメモリ使用量を実現している。faster-whisperとwhisprの処理速度とメモリ使用量のベンチマークは以下の通りになる。

Large-v2モデル(GPU)
実装 精度 ビームサイズ 時間 最大GPUメモリ 最大CPUメモリ
openai/whisper fp16 5 4分30秒 11325MB 9439MB
faster-whispe fp16 5 54秒 4755MB 3244MB
faster-whisper fp16 5 59秒 3091MB 3117MB
Smallモデル(GPU)
実装 精度 ビームサイズ 時間 最大GPUメモリ
openai/whisper fp32 5 10分31秒 3101MB
whisper.cpp fp32 5 17分42秒 1581MB
whisper.cpp fp16 5 12分39秒 873MB
faster-whisper fp32 5 12分39秒 1675MB
faster-whisper int8 5 12分39秒 1675MB

これらのベンチマークの結果から、faster-whisperはwhisperと比較して大幅な性能向上を達成していることが分かる。

使用環境

OS : Windows11
CPU : Intel Corei5-10400F
GPU : NVIDIA GeForce GTX 1660 SUPER ... GPUはなくても動くがあったほうが快適
Python 3.12.2 (Python 3.8以上が必要)
venv : 仮想環境構築
Cuda Toolkit : 12.1 ... NVIDIAのGPUを活用した並列コンピューティングを行うための開発ツールキット
FFmpeg ... オーディオやビデオを録画、変換、およびストリーミングするためのオープンソースのマルチメディアフレームワーク

環境構築

前回行ったwhisperの環境構築を行ったものとする。

これを行うことでcudaやtorch、ffmpegなどの環境構築が完了する。
次に、faster-whisperのインストールを行う。
以下のコマンドを仮想環境内で入力する。

cmd.(faster-whisper)
pip install git+https://github.com/guillaumekln/faster-whisper.git

これでfaster-whisperの環境構築が完了する。

テスト実行

faster-whisperを使って文字起こしを行う。今回はlarge-v2よりもさらに高性能なlarge-v3を使用する。
以下のテストプログラムを使用する。

transcription.py
### 文字起こし(faster_whisperを使用)
from faster_whisper import WhisperModel

# モデル設定
model_size = "large-v3"

# GPU設定
model = WhisperModel(model_size, device="cuda", compute_type="float16")

AUDIO_FILE = "file_path"

# 文字起こしの実行
segments, info = model.transcribe(AUDIO_FILE, beam_size=5)

# 結果の表示
print("Detected language:", info.language)
for segment in segments:
    print(f"[{segment.start:.2f} - {segment.end:.2f}]: {segment.text}")
    

このプログラムはシンプルなプログラムであり、入力ファイルとして指定した音声ファイルの「file_path」の文章ごとに区切ってその文の開始時間と終了時間、文字起こしを行うことができる。
それぞれのプログラムを説明していく。

.py
# GPU設定
model = WhisperModel(model_size, device="cuda", compute_type="float16")

このプログラムではWhisperModelクラスのコンストラクタを呼び出し、新しいWhisperモデルのインスタンスを作成する。
model_size : 使用するモデルのサイズを指定する。(ここでは変数として渡している。)
device="cuda" : モデルをGPUで実行することを指定している。
compute_type="float16" : 計算に半精度浮動小数点を使用することを指定している。これにより、高速化とメモリ使用量の削減が可能になる。

.py
# 文字起こしの実行
segments, info = model.transcribe(AUDIO_FILE, beam_size=5)

segments : 文字起こしされたテキストセグメントのリストを返す。各セグメントには、開始時間、終了時間、文字起こしされたテキストが含まれる。
info : 文字起こしに関する追加情報を格納したオブジェクトを返す。これには、検出された言語とその確率などが含まれる。
beam_size=5 : ビームサーチデコーディングのビームサイズを指定するパラメータである。ビームサーチはより正確な文字起こしの結果を得るために使用されるアルゴリズムである。ビームサイズが大きいほどより多くの候補が考慮されるため、計三個ストは増加するが、より正確な結果が得られる可能性がある。

.py
# 結果の表示
print("Detected language:", info.language)
for segment in segments:
    print(f"[{segment.start:.2f} - {segment.end:.2f}]: {segment.text}")

これは使用している言語と文字起こしの結果を出力している。
segmentには開始時間、終了時間、文字起こしされたテキストが含まれる。これをfor分で順番に出力している。

参考文献

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?