字幕があれば、短い動画を音声なしでも見やすくなり、プラットフォームがコンテンツを理解しやすくなるうえ、録音した通話、会議、ライブ配信を検索可能なテキストにできます。Whisper は中国語や英語をはじめ数十の言語を高い精度で扱えるオープンソースの音声認識モデルで、faster-whisper を使えば一般的な CPU サーバーでも効率よく動かせます。この記事では、faster-whisper のインストール、モデルサイズの選択、音声・動画から SRT 字幕ファイルへの一括変換、きれいな簡体字中国語の出力、ffmpeg による動画への字幕の焼き込みを解説します。
# Debian / Ubuntu
apt install -y python3-venv ffmpeg
python3 -m venv /opt/whisper
/opt/whisper/bin/pip install --upgrade pip
/opt/whisper/bin/pip install faster-whisper "av<19" # PyAV 19 is not yet compatible with faster-whisper 1.2
専用の仮想環境を使うことで、ライブラリをシステムの Python から切り離せます。ffmpeg は音声の抽出と字幕の焼き込みに使います。
| モデル | 精度 | CPU での速度 | メモリ(int8、目安) |
|---|---|---|---|
| base | 基本的。雑音の多い音声では語を取りこぼす | 非常に速い | 1 GB 未満 |
| small | 明瞭な音声なら良好 | 速い | 約 1~2 GB |
| medium | 非常に良好 | small の数倍遅い | 約 2~3 GB |
| large-v3 | 最高。特に中国語やなまりのある音声に強い | 最も遅い | 約 3~5 GB |
まず small で 5 分間のサンプルを文字起こしして所要時間を計り、そのうえで medium や large-v3 の精度が追加の処理時間に見合うかどうかを、コンテンツに応じて判断してください。
cat > /opt/whisper/transcribe.py <<'EOF2'
import os, sys
from faster_whisper import WhisperModel
def ts(t):
ms = int(round(t * 1000))
h, ms = divmod(ms, 3600000)
m, ms = divmod(ms, 60000)
s, ms = divmod(ms, 1000)
return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"
size = os.environ.get("WHISPER_MODEL", "small")
lang = os.environ.get("WHISPER_LANG") or None # e.g. zh, en; empty = auto-detect
prompt = os.environ.get("WHISPER_PROMPT") or None
model = WhisperModel(size, device="cpu", compute_type="int8", cpu_threads=os.cpu_count())
for path in sys.argv[1:]:
segments, info = model.transcribe(path, language=lang, initial_prompt=prompt,
beam_size=5, vad_filter=True)
out = os.path.splitext(path)[0] + ".srt"
with open(out, "w", encoding="utf-8") as f:
for i, seg in enumerate(segments, 1):
f.write(f"{i}\n{ts(seg.start)} --> {ts(seg.end)}\n{seg.text.strip()}\n\n")
print(f"{path}: language={info.language} -> {out}")
EOF2
vad_filter は音声を含まない無音や音楽の部分をスキップするため、処理が速くなり、無音部分で存在しないテキストが生成されるのを防げます。
# One file, automatic language detection
/opt/whisper/bin/python /opt/whisper/transcribe.py /data/videos/demo.mp4
# A whole folder with the medium model, in the background, with a log
cd /data/videos
WHISPER_MODEL=medium nohup /opt/whisper/bin/python /opt/whisper/transcribe.py *.mp4 > transcribe.log 2>&1 &
tail -f transcribe.log
入力ファイルごとに、同じ名前の .srt ファイルが同じ場所に作成されます。faster-whisper はほとんどの音声・動画形式を直接読み込めます。非常に大きなファイルの場合は、先に ffmpeg -i in.mp4 -vn -ac 1 -ar 16000 in.wav で音声を抽出することもできます。
中国語(普通話)の場合、Whisper が繁体字で出力したり、句読点を省いたりすることがあります。言語を固定し、初期プロンプトとして簡体字中国語の短い例文を与えると、モデルはそのスタイルに従います。
WHISPER_LANG=zh WHISPER_PROMPT="以下是普通话的句子,请使用简体中文和标点符号。" \
/opt/whisper/bin/python /opt/whisper/transcribe.py livestream-0612.mp4
同じ方法は製品名や専門用語にも使えます。正しい表記をプロンプトに含めておくと、モデルがその表記を使うようになります。
# Hard subtitles (always visible), keeping the original audio
ffmpeg -i demo.mp4 -vf "subtitles=demo.srt:force_style='FontSize=20,Outline=1'" -c:a copy demo-sub.mp4
# Or add them as a selectable subtitle track (MP4)
ffmpeg -i demo.mp4 -i demo.srt -c copy -c:s mov_text demo-softsub.mp4
中国語の字幕を使う場合は、サーバーに中国語フォントがインストールされていることを確認してください(例:apt install fonts-noto-cjk)。フォントがないと、文字が四角形(いわゆる豆腐)で表示されます。YouTube を含むほとんどのプラットフォームでは、動画とあわせて .srt ファイルをアップロードすることもできます。
モデルと CPU によって異なります。最新のマルチコアサーバーでは、small モデルは通常、実時間より速く音声を処理します。medium と large-v3 はその数倍遅くなります。大量のアーカイブを処理する前に、短いサンプルで計測してください。
これは通常、長い無音部分や音楽だけの部分で起こります。vad_filter を有効のままにし、より大きなモデルを試し、音声が小さすぎたり歪んだりしていないか確認してください。
Whisper は音声を直接英語に翻訳できます(model.transcribe で task="translate" を指定)。その他の言語に翻訳する場合は、言語モデルで SRT のテキストを翻訳します。例えば Ollama でローカル LLM を動かすで構築したローカルモデルを利用できます。
上記の手順で解決しない場合は、サポートチケットを送信して IMIDC の 24 時間 365 日対応テクニカルサポートへご連絡ください。サーバー IP、OS バージョン、CPU とメモリ、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。