faster-whisper:より高速な Whisper 文字起こしエンジン

faster-whisper は CTranslate2 をベースに Whisper 推論を再実装したもので、ローカルやサーバーでより高速かつ省メモリな音声文字起こしに向いています。

faster-whisper は SYSTRAN がメンテナンスしている Whisper 推論実装です。CTranslate2 をバックエンドとして使い、Whisper に近い使い勝手を保ちながら、推論速度、メモリ使用量、デプロイの柔軟性をエンジニアリング用途に合わせやすくしています。

すでに openai/whisper を使ったことがあるなら、faster-whisper はより本番運用向けの代替実装として理解できます。インターフェースはモデル読み込み、音声文字起こし、セグメント結果の取得を中心にしていますが、実行層はより高速で、CPU、GPU、量子化、バッチ処理に合わせて調整しやすくなっています。

何を解決するのか

Whisper の精度は優れていますが、元の実装をそのままデプロイすると、よく次のような問題に当たります。

  1. 長い音声の文字起こしに時間がかかる。
  2. GPU メモリ使用量が大きい。
  3. CPU でも動くが、速度が十分でないことがある。
  4. 大量の音声や動画をバッチ処理するとき、スループットを上げにくい。

faster-whisper は主にこれらの問題を改善するための実装です。プロジェクトの README では、同じ精度で openai/whisper より最大 4 倍高速で、メモリ使用量も少ないと説明されています。8-bit 量子化を使うと、さらに速度を上げられます。

インストール

通常の Python 環境では、そのままインストールできます。

1
pip install faster-whisper

GPU を使う場合は、ローカルの CUDA、cuDNN、CTranslate2 のバージョンが合っているか確認してください。ここでつまずきやすいのは、GPU ドライバーと CUDA ランタイムの不一致です。コード自体に問題がなくても、モデル読み込み時や初回推論時に失敗することがあります。

基本的な使い方

最小構成の例はシンプルです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from faster_whisper import WhisperModel

model_size = "large-v3"

model = WhisperModel(model_size, device="cuda", compute_type="float16")

segments, info = model.transcribe("audio.mp3", beam_size=5)

print("Detected language '%s' with probability %f" % (info.language, info.language_probability))

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

主なパラメータは次の通りです。

パラメータ 役割
model_size smallmediumlarge-v3 などの Whisper モデルサイズを選ぶ
device 推論デバイス。よく使う値は cuda または cpu
compute_type 計算精度。例:float16int8_float16int8
beam_size デコード時の探索幅。大きいほど安定しやすいが遅くなる

ローカルで素早く文字起こししたい場合は、まず medium または large-v3 から試すとよいです。GPU メモリが厳しい場合は、量子化を検討します。

CPU と GPU の選び方

NVIDIA GPU がある場合は、まず次の設定を使います。

1
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

GPU メモリが足りない場合は、次のように変更できます。

1
model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16")

GPU がない場合は、CPU で実行できます。

1
model = WhisperModel("small", device="cpu", compute_type="int8")

CPU モードは軽いタスク、低頻度のバックグラウンド処理、または GPU のないサーバーに向いています。大量の長い音声を処理するなら、やはり GPU のほうが適しています。

バッチ文字起こし

faster-whisper はバッチ文字起こしにも対応しています。大量の短い音声を処理する場合や、GPU のスループットを上げたい場合に便利です。

1
2
3
4
5
6
7
8
from faster_whisper import WhisperModel, BatchedInferencePipeline

model = WhisperModel("turbo", device="cuda", compute_type="float16")
batched_model = BatchedInferencePipeline(model=model)
segments, info = batched_model.transcribe("audio.mp3", batch_size=16)

for segment in segments:
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

batch_size は大きければよいわけではありません。スループットは上がりますが、GPU メモリの負荷も増えます。実際のデプロイでは、4、8、16 のような値を段階的に試し、安定して動く点を探すのがおすすめです。

VAD と単語単位のタイムスタンプ

音声文字起こしでは、長い無音、背景ノイズ、字幕の位置合わせがよく問題になります。faster-whisper には、文字起こし時にそのまま有効化できる実用的なパラメータがあります。

VAD を有効化する例:

1
segments, info = model.transcribe("audio.mp3", vad_filter=True)

単語単位のタイムスタンプを取得する例:

1
2
3
4
5
segments, info = model.transcribe("audio.mp3", word_timestamps=True)

for segment in segments:
    for word in segment.words:
        print("[%.2fs -> %.2fs] %s" % (word.start, word.end, word.word))

VAD は、会議録音、ポッドキャスト、ライブ配信のアーカイブなど、長い無音を含む音声に向いています。単語単位のタイムスタンプは、字幕生成、逐語録の校正、プレイヤー上での単語ハイライトに便利です。

モデルの選び方

モデル選びでは、主に精度、速度、マシンリソースを見ます。

場面 推奨
すばやく試す small または medium
中国語コンテンツで品質優先 large-v3
GPU メモリが厳しい int8_float16 またはより小さいモデル
CPU でバックグラウンド処理 小さいモデルと int8
大量の短い音声 BatchedInferencePipeline を試す

中国語音声では、品質を重視するならまず large-v3 を試すのがおすすめです。マシンへの負荷が大きすぎる場合は、モデルサイズを下げるか量子化を使います。最初から速度だけを見るのは避けたほうがよいです。文字起こし品質が下がると、手作業の校正時間で推論時間の節約分が消えてしまうことがあります。

向いている用途

faster-whisper は次のようなタスクに向いています。

  1. 動画字幕の生成。
  2. ポッドキャスト、会議、講義録音の文字起こし。
  3. Bilibili、YouTube などの動画をローカルで文字起こしするワークフロー。
  4. 音声の一括アーカイブと検索。
  5. 音声コンテンツを RAG、ナレッジベース、検索システムに渡す処理。

話者分離、要約、チャプター分割のような上位タスクを直接解決するものではありませんが、安定した文字起こし層として使えます。その後に pyannote で話者分離を行い、LLM で要約や構造化整理を行う構成にできます。

デプロイ時のすすめ方

実際に使うときは、次の順番で調整するとよいです。

  1. まず 1 から 3 分程度の音声で、環境が正しく動くか確認する。
  2. 対象言語と実際の音質に近いサンプルで精度を確認する。
  3. GPU メモリ使用量を見て、量子化を有効にするか決める。
  4. 長い音声は先に分割し、失敗時にすべてを再実行しなくて済むようにする。
  5. 結果は TXT と SRT の両方で保存し、後から校正しやすくする。

サーバータスクでは、リクエストごとにモデルを読み込むのではなく、サービス起動時にモデルを読み込むのがよいです。モデル読み込みには時間がかかり、頻繁に読み込むと GPU メモリ管理も不安定になりやすくなります。

OpenAI Whisper の位置付けと利用上の境界

openai/whisper は、OpenAI オープンソース音声認識プロジェクトです。論文の方向性は「大規模な弱い監視による堅牢な音声認識」です。これにより、多くの人が初めて、ローカルで実行できる多言語音声音訳機能を低いしきい値で取得できるようになります。

現在では、より高速なウィスパー、ウィスパー.cpp、さまざまなクラウド ASR および新世代音声モデルがありますが、オリジナルのウィスパーは依然としてオープンソース ASR エコシステムを理解するための出発点です。

何に適していますか?

Whisper の一般的な用途は次のとおりです。

  • 音声をテキストに変換。
  • ビデオ字幕の生成;
  • ポッドキャストの文字起こし;
  • 会議の議事録。
  • 多言語音声認識;
  • 英語への音声翻訳;
  • 字幕のドラフトとコンテンツの検索。

その利点は、堅牢性、多言語、オープンソース、および環境的成熟度です。その後の多くのツールは、Whisper モデルまたはインターフェイスを中心に最適化されています。

境界を使用する

ウィスパーは普遍的な独裁者ではありません。

  • ノイズ、アクセント、複数の人の重複は結果に影響します。
  • 専門用語と名前は後処理が必要です。
  • 長い音声はセグメント化する必要があります。
  • タイムスタンプは常に完璧であるとは限りません。
  • 元のバージョンの推論速度とリソース使用量は実稼働環境に適していない可能性があります。
  • プライベートオーディオのローカル処理と保存に注意してください。

高スループットの実稼働サービスが必要な場合は、より高速なウィスパー、ウィスパー.cpp、バッチ、量子化、および GPU のデプロイメントを検討するとよいでしょう。

誰に適していますか?

適切な:

  • 字幕および音訳ツール;
  • ポッドキャスト、コース、会議の録画を処理します。
  • ASR モデルを研究する;
  • ローカルの音声テキスト変換サービスを構築します。
  • 多言語コンテンツを整理します。

音声を時々書き起こすだけの場合は、ホストされたサービスの方が問題が少ない可能性があります。プライバシーとコストを重視する場合は、ローカル展開の方が魅力的です。

## まとめ

Whisper は、オープンソース音声認識エコシステムの象徴的なプロジェクトです。これは必ずしも現時点で最速の実装ではありませんが、依然として ASR ツールチェーンの重要な基盤です。

音声転写、字幕、または音声データ処理を行っている場合は、Whisper について理解し始め、パフォーマンス要件に基づいて最適化されたバージョンを選択する価値があります。

参考ソース

NAS に faster-whisper を導入する

Whisper を NAS に導入するための最も適切なシナリオは、「リアルタイムの会議字幕」を追求するのではなく、ホーム ビデオ、インタビュー、コース録画、ポッドキャスト、会議ファイルをプライベート ディレクトリに置き、トランスクリプトと SRT 字幕をオンデマンドまたはバッチで生成することです。

ほとんどの NAS では、faster-whisper から始めることをお勧めします。 CTranslate2 推論エンジンを使用し、CPU または CUDA GPU を使用でき、量子化、VAD 無音フィルタリング、およびワードレベルのタイムスタンプをサポートします。まず小さなモデルを使用してプロセスを実行し、次に精度と待ち時間に基づいてモデルをアップグレードするかどうかを決定します。

まず結論から話しましょう

NAS ローカル音声認識への最も安全なルートは次のとおりです。

1
2
3
4
5
6
准备输入 / 输出目录
-> 安装 ffmpeg 与 faster-whisper
-> 用短音频跑 small 或 base
-> 检查 TXT 和 SRT
-> 开启 VAD 过滤
-> 再做批量任务、GPU 加速或 Docker 封装

個別のグラフィックスを持たない NAS も転写できますが、オフライン タスクとして扱う必要があります。長いビデオを頻繁に文字起こししたり、複数の人物を録画したり、より高速な応答を追求したりする場合、通常は、単純にハード ドライブの容量を増やすよりも GPU の役割がより明確になります。

モデルの選び方

Whisper にはさまざまなサイズのモデルがあります。一般に、モデルが大きいほど、アクセント、ノイズ、複雑なコンテキストの処理に優れていますが、推論が遅くなり、メモリ要件が高くなります。

モデル NASに関するご提案 シーンに合わせて
tiny / base テストプロセス、低電力NAS クリアな短い音声、素早いプレビュー
small ほとんどの家庭用 NAS の出発点 一般的な中国語カンファレンス、コース、ビデオ字幕
medium 通常、CPU NAS は低速で​​す。 GPU がある場合はもう一度試してください ノイズや専門用語が多い音声
large-v3 / turbo 十分なビデオ メモリを備えた GPU ホストにより適しています 高品質のオフライン文字起こし、長時間音声のバッチ処理

モデル名だけで効果を判断しないでください。録音の明瞭さ、スピーカーの重なり、BGM、マイクの距離、固有名詞は、small からより大きなモデルに移行するよりも、最終的なトランスクリプトに大きな影響を与えることがよくあります。

ディレクトリ計画: 個別の入力、出力、およびモデル キャッシュ

Linux NAS を例に挙げます。

1
2
3
mkdir -p ~/asr/inbox
mkdir -p ~/asr/out
mkdir -p ~/asr/models

提案される合意:

1
2
3
~/asr/inbox/   放 MP3、M4A、WAV、MP4 等输入文件
~/asr/out/     放 TXT、SRT、JSON 等结果
~/asr/models/  放下载的模型缓存

バッチ タスクは、同じディレクトリ内に入力、出力、モデル キャッシュが混在することを最も恐れます。分離後のバックアップ、クリーンアップ、権限管理が容易になります。

設置環境

Debian/Ubuntu のような NAS または Linux コンテナーに、まず基本ツールをインストールします。

1
2
sudo apt update
sudo apt install -y python3 python3-venv ffmpeg

独立した仮想環境を作成します。

1
2
3
4
python3 -m venv ~/asr/.venv
source ~/asr/.venv/bin/activate
pip install --upgrade pip
pip install faster-whisper

ffmpeg は、一般的なオーディオおよびビデオ形式を読み取るために使用されます。これがないと、MP4、M4A、または一部のエンコード形式がトランスコードされなかったり、正しく読み取れなかったりする可能性があります。

最小限の音訳スクリプト

~/asr/transcribe.py に次のコードを記述します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from pathlib import Path
from faster_whisper import WhisperModel

input_file = Path("/home/USER/asr/inbox/sample.mp3")
output_dir = Path("/home/USER/asr/out")
output_dir.mkdir(parents=True, exist_ok=True)

model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8",
    download_root="/home/USER/asr/models",
)

segments, info = model.transcribe(
    str(input_file),
    language="zh",
    vad_filter=True,
    word_timestamps=True,
)

segments = list(segments)

lines = []
for segment in segments:
    text = segment.text.strip()
    lines.append(text)
    print(f"[{segment.start:.2f} -> {segment.end:.2f}] {text}")

(output_dir / f"{input_file.stem}.txt").write_text(
    "\n".join(lines), encoding="utf-8"
)

コード内の /home/USER を実際の Linux ユーザー ディレクトリに変更し、次を実行します。

1
2
source ~/asr/.venv/bin/activate
python ~/asr/transcribe.py

初めて実行するとき、faster-wisper は対応するモデルをダウンロードします。モデルが正常にダウンロードされると、指定した download_root に保存されるため、今後再度ダウンロードする必要はありません。

CPU NASの推奨パラメータ

GPU がない場合は、モデル サイズと計算精度の制御が優先されます。

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cpu",
    compute_type="int8",
    download_root="/home/USER/asr/models",
)

int8 は、多くの場合、CPU 推論の開始点として適しています。 NAS がファイル同期、写真のインデックス作成、ダウンロード、またはメディア サービスも提供する場合は、次のことをお勧めします。

  • base または small から始めます。
  • 複数の文字起こしタスクを同時に実行しないでください。
  • 長いビデオはオフピーク時間にスケジュールされます。
  • システムメモリ、CPU 温度、スワップを観察します。
  • NAS が大量のトランスコーディング、検証、およびトランスコーディングを同時に実行できないようにします。

CPU NAS の目標は、オーディオ再生の進行状況をリアルタイムで追いつくことではなく、「安定した完了」であるべきです。

NVIDIA GPUがある場合の設定方法

NAS または Linux ホストで NVIDIA GPU を利用できる場合は、次のことを試してください。

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cuda",
    compute_type="float16",
    download_root="/home/USER/asr/models",
)

メモリが不足している場合は、次のことを試すことができます。

1
2
3
4
5
6
model = WhisperModel(
    "small",
    device="cuda",
    compute_type="int8_float16",
    download_root="/home/USER/asr/models",
)

実際に利用可能な compute_type は、CTranslate2、CUDA、ドライバー、および GPU によって異なります。最初に短い音声で確認してから、長いファイルを処理します。これを Docker に配置する場合は、まずコンテナーが GPU を認識できることを確認する必要があります。 nvidia-smi がコンテナーで使用できない場合、トランスクライバーは CUDA アクセラレーションを受け取りません。

VAD フィルタリングをオンにすることが推奨される理由

VAD (音声アクティビティ検出) は、明らかに音声のないセグメントをスキップします。会議の録音、長い一時停止、バックグラウンド ミュージック、または録音の最初と最後に多くの空白スペースがあるファイルの場合、通常、次の 2 つの利点があります。

  • 無意味な推論時間を削減します。
  • 無音セグメントが無関係なテキストとして認識される確率を減らします。

高速ウィスパーで有効化:

1
2
3
4
segments, info = model.transcribe(
    "input.mp3",
    vad_filter=True,
)

ただし、VAD は「絶対に失敗しない」スイッチではありません。声が非常に小さい場合、音楽と人間の声が混在している場合、または電話の録音が断続的である場合は、VAD が有効なコンテンツを誤って遮断していないかどうかをランダムに確認する必要があります。

SRT 字幕の生成

Whisper の各セグメントには開始時間と終了時間があります。上記のスクリプトに基づいて単純な SRT を出力できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
def srt_time(seconds: float) -> str:
    milliseconds = round(seconds * 1000)
    hours, milliseconds = divmod(milliseconds, 3_600_000)
    minutes, milliseconds = divmod(milliseconds, 60_000)
    seconds, milliseconds = divmod(milliseconds, 1000)
    return f"{hours:02}:{minutes:02}:{seconds:02},{milliseconds:03}"

blocks = []
for index, segment in enumerate(segments, start=1):
    blocks.append(
        f"{index}\n"
        f"{srt_time(segment.start)} --> {srt_time(segment.end)}\n"
        f"{segment.text.strip()}\n"
    )

(output_dir / f"{input_file.stem}.srt").write_text(
    "\n".join(blocks), encoding="utf-8"
)

単語ごとの強調表示やより詳細な編集を行う場合は、word_timestamps=True の後の単語レベルのタイムスタンプを読み取ることができます。ただし、単語レベルの結果、特に中国語と英語が混在しているもの、人名、場所、略語などは手動によるスポットチェックも必要です。

完全なバッチ転送を一度に実行しないでください

バッチ ファイルをシリアルに処理するか、キューごとに低い同時実行性で処理することをお勧めします。

1
2
3
for file in ~/asr/inbox/*; do
  python ~/asr/transcribe.py "$file"
done

拡張子のフィルタリング、成功/失敗のログ記録、完了したファイルのスキップのためのロジックを実際のスクリプトに追加する必要があります。最も重要なことは、タスクのバッチ全体を開始する前に、最初に 5 つのサンプルを処理し、出力ディレクトリ、言語、モデル、および字幕のタイムラインが正しいことを確認することです。

NAS 上で複数の large-v3 転送タスクをやみくもに同時に実行すると、メモリ、GPU メモリ、または熱放散がボトルネックになりやすくなります。文字起こしサービスがフォト アルバム、バックアップ、ダウンローダーとリソースも共有する場合は、キューを制限する必要があります。

Dockerを安定して使うには

多くの NAS は、Container Manager または Docker を使用してサービスを管理するのに適しています。最初にホストまたは通常の Linux コンテナーで Python バージョンを実行してから、コンテナーをパッケージ化することをお勧めします。コンテナ化する場合は、少なくとも次のことを行ってください。

  • 入力ディレクトリを読み取り専用でマウントします。
  • 出力ディレクトリを個別に書き込み可能にマウントします。
  • モデル キャッシュ ディレクトリを永続的にマウントします。
  • 高速ウィスパー、CTranslate2、Python のバージョンを修正しました。
  • GPU を使用している場合は、最初にコンテナーのランタイムとデバイスのパススルーを確認します。

NAS 共有ディレクトリ全体を読み取り/書き込みモードでトランスコーディング コンテナにマウントしないでください。音声認識タスクでは、音声とビデオを読み取り、テキスト結果を書き込むだけで済みます。権限が小さいほど、誤操作による影響は小さくなります。

精度とプライバシーの境界

ローカル展開の利点は、オーディオをサードパーティのサービスにアップロードする必要がないことですが、これは出力が自然に正確であることを意味するわけではありません。 Whisper は、名前、専門用語、数字、無音部分を聞き間違えたり、ノイズや長い空白にさらされると信頼性の低いテキストを聞き間違えたりする可能性があります。

次のコンテンツは手動で確認する必要があります。

  • 医療、法律、財務、セキュリティの記録。
  • 字幕は一般に公開されます。
  • インタビューの引用と会議の決議。
  • 名前、金額、日付、電話番号、製品モデル。

元の音声を保持し、トランスクリプトを初稿として扱うことは、「トランスクリプトの直後に元のファイルを削除する」よりも安全なプロセスです。

NAS に適した一連のデフォルト構成

専用グラフィックス カードをお持ちでない場合:

1
2
3
4
5
model: base 或 small
device: cpu
compute_type: int8
vad_filter: true
并发: 1

NVIDIA GPU が利用可能な場合:

1
2
3
4
5
model: small 起步,按效果再试 medium
device: cuda
compute_type: float16 或 int8_float16
vad_filter: true
并发: 从 1 开始压测

まず、モデルをアップグレードするかどうかを決定する前に、同じ 10 ~ 30 分間の実際の録画を使用して、時間のかかる省略された単語、タイプミス、字幕のタイムラインを比較します。 NAS が長期転写に適しているかどうかを判断するために、数秒の透明なサンプルだけに依存しないでください。

要約する

Whisper NAS 導入は、小規模モデル、低同時実行性、VAD フィルタリング、入力ディレクトリと出力ディレクトリの分離など、より高速な Whisper から開始できます。 CPU NAS は、低頻度のオフライン転写を処理できます。適切な CUDA 環境を備えた GPU NAS は、多数のビデオや大型モデルに適しています。

実際にエクスペリエンスを決定するのは、「Whisper がインストールできるかどうか」ではなく、オーディオの品質、モデルのサイズ、実際のトランスコーディング キュー、および NAS が担当するその他のサービスの数です。最初に実際のオーディオを実行してから、スケールアップします。

参照:

まとめ

faster-whisper の価値は、Whisper を長期運用しやすい文字起こしコンポーネントにする点にあります。別のモデルに置き換えるのではなく、より効率のよい推論バックエンドとエンジニアリング向けのインターフェースを使う、という位置づけです。

個人のワークフローでは、動画、会議、講義音声をすばやくテキスト化できます。サーバー側のタスクでは、GPU、量子化、バッチ処理、VAD を組み合わせて性能を調整できます。マシン環境が正しく設定されていれば、安定した一括音声文字起こしには元の Whisper 実装より扱いやすい選択肢になります。

プロジェクト:https://github.com/SYSTRAN/faster-whisper