Linuxサーバー

faster-whisper で文字起こし・字幕を自動生成:CPU サーバーで SRT 一括作成と ffmpeg 焼き込み

6 ステップ 9 分で読めます 22 回閲覧 0
目次

字幕があれば、短い動画を音声なしでも見やすくなり、プラットフォームがコンテンツを理解しやすくなるうえ、録音した通話、会議、ライブ配信を検索可能なテキストにできます。Whisper は中国語や英語をはじめ数十の言語を高い精度で扱えるオープンソースの音声認識モデルで、faster-whisper を使えば一般的な CPU サーバーでも効率よく動かせます。この記事では、faster-whisper のインストール、モデルサイズの選択、音声・動画から SRT 字幕ファイルへの一括変換、きれいな簡体字中国語の出力、ffmpeg による動画への字幕の焼き込みを解説します。

文字起こしはすべてお客様のサーバー上で実行されるため、録音データが外部に出ることはありません。モデルファイルは、各モデルの初回使用時に Hugging Face からダウンロードされます。そのためサーバーにはインターネット接続が必要です。または、別のマシンからモデルフォルダをコピーすることもできます。

ステップ1:faster-whisper をインストール

# 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 は音声の抽出と字幕の焼き込みに使います。

ステップ2:モデルサイズを選択

モデル精度CPU での速度メモリ(int8、目安)
base基本的。雑音の多い音声では語を取りこぼす非常に速い1 GB 未満
small明瞭な音声なら良好速い約 1~2 GB
medium非常に良好small の数倍遅い約 2~3 GB
large-v3最高。特に中国語やなまりのある音声に強い最も遅い約 3~5 GB

まず small で 5 分間のサンプルを文字起こしして所要時間を計り、そのうえで medium や large-v3 の精度が追加の処理時間に見合うかどうかを、コンテンツに応じて判断してください。

ステップ3:文字起こしスクリプトを作成

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 は音声を含まない無音や音楽の部分をスキップするため、処理が速くなり、無音部分で存在しないテキストが生成されるのを防げます。

ステップ4:ファイルやフォルダを文字起こし

# 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 で音声を抽出することもできます。

ステップ5:きれいな簡体字中国語で出力

中国語(普通話)の場合、Whisper が繁体字で出力したり、句読点を省いたりすることがあります。言語を固定し、初期プロンプトとして簡体字中国語の短い例文を与えると、モデルはそのスタイルに従います。

WHISPER_LANG=zh WHISPER_PROMPT="以下是普通话的句子,请使用简体中文和标点符号。" \
  /opt/whisper/bin/python /opt/whisper/transcribe.py livestream-0612.mp4

同じ方法は製品名や専門用語にも使えます。正しい表記をプロンプトに含めておくと、モデルがその表記を使うようになります。

ステップ6:字幕を動画に焼き込む

# 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 とメモリ、実行したコマンド、エラー全文を添えていただくと、より迅速に調査できます。

この回答はお役に立ちましたか?

関連チュートリアル