自動字幕(音声→字幕)
オーディオ/ビデオ内の音声を認識して字幕に変換します。共通スクリプト skills/shared/scripts/asr.py(faster-whisper ラッパー)に基づき、
パラメータが明確で再現性があり、中国語に適した文区切り処理を行います。オプションで字幕を動画に焼き込むことも可能です(skills/shared/scripts/video_ops.py / ffmpeg subtitles フィルターを再利用)。
「音声 → 字幕ファイル(+ オプションで焼き込み)」のみを行います。一般的な動画編集は video-editing を、純粋なノイズ除去は audio-denoise を、長時間動画のスマートカット+字幕焼き込みは clipify を参照してください。
入力
| フィールド | 必須 | 説明 |
|---|---|---|
| input_file | はい | オーディオまたはビデオファイルのパス(ビデオの場合は自動的に音声トラックを抽出します) |
| format | いいえ | srt(デフォルト)/ ass / txt / json |
| language | いいえ | auto(デフォルト)または zh/en などの ISO 639-1 コード |
| model | いいえ | tiny/base(デフォルト)/small/medium/large-v3。サイズが大きいほど精度は高いが処理が遅くなります |
| burn | いいえ | 字幕を動画に焼き込むかどうか(ビデオ入力が必要) |
対応形式:mp3/wav/m4a/aac/flac などのオーディオ;mp4/mkv/mov/webm などのビデオ。
出力
- 字幕ファイルは
outputs/<トピック名>/に保存されます(SRT/ASS/TXT/JSON) - 焼き込みありの場合:ハード字幕付き動画(
*-sub.mp4) - レポート:認識言語、字幕数、使用モデル、出力パス
前提条件
- 初回実行時に HuggingFace からモデルをダウンロードします。外部プロキシが必要です。スクリプトは
EASEL_PROXYまたはhttp(s)_proxy環境変数をプロキシとして読み取ります。 どちらも設定されていない場合は直接接続します。事前にexport https_proxy=... http_proxy=...で指定することも可能です。 - CPU 環境ではデフォルトの
--device cpu --compute-type int8をそのまま使用してください。
実行手順
スクリプトのパス(プロジェクトルートからの相対パス):skills/shared/scripts/asr.py、skills/shared/scripts/video_ops.py。
1. 字幕ファイルの生成
# ビデオ → SRT(音声トラック自動抽出 + 言語自動検出)
python skills/shared/scripts/asr.py transcribe \
-i input.mp4 -o outputs/トピック名/input.srt --language zh
# ビデオ → ASS(スタイル付き、**フォントサイズとマージンがビデオの縦横比に自動適応**):ビデオ入力時に自動で幅と高さを検出
python skills/shared/scripts/asr.py transcribe \
-i input.mp4 -o outputs/トピック名/input.ass --format ass --model small
# 純粋なオーディオ → ASS:サイズを検出できないため、デフォルトは縦型 1080x1920。横型の場合は --res 1920x1080 を指定
python skills/shared/scripts/asr.py transcribe \
-i voice.mp3 -o outputs/トピック名/voice.ass --format ass --res 1920x1080
- ASS スタイルはターゲット動画の幅と高さに自動適応:フォントサイズは短辺(min(w,h)*0.05、縦/横型で適切、横型で大きくなりすぎません)、
下部マージンは高さ、左右マージンは幅に基づき、
PlayRes=実際の幅と高さになります。ビデオ入力時は自動検出;オーディオのみの場合は--res 幅x高さで指定します。 スタイル付きハード字幕が必要な場合は、この ASS ファイルを優先して焼き込みます(次のセクション)。生の SRT + 手動 force_style よりも手間がかからず、適応性があります。 - 中国語はデフォルトで1行あたり約18文字、長すぎる場合は自動改行・分割されます;
--max-line-charsで調整可能です。 -oを指定しない場合は入力ファイル名に基づいてプロジェクトディレクトリが作成されます(例:talk.mp4の場合outputs/talk/talk.srtに出力)。既存のプロジェクトでは明示的に-o outputs/トピック名/<ファイル名>.<フォーマット>を指定する必要があります。- 利用可能なモデル/言語を確認するには:
python skills/shared/scripts/asr.py info。
2.(オプション)字幕を動画に焼き込む
ユーザーが「ハード字幕/字幕を焼き込む」を要求した場合、ffmpeg の subtitles(SRT)または ass(ASS)フィルターを使用します:
# SRT の焼き込み(スタイルカスタマイズ可能)
ffmpeg -y -i input.mp4 \
-vf "subtitles=outputs/トピック名/input.srt:force_style='FontName=Noto Sans CJK SC,FontSize=20,PrimaryColour=&H00FFFFFF,OutlineColour=&H80000000,BorderStyle=1,Outline=2'" \
-c:a copy outputs/トピック名/input-sub.mp4
# ASS の焼き込み(スタイルは ass ファイル内で定義、忠実に再現)
ffmpeg -y -i input.mp4 \
-vf "ass=outputs/トピック名/input.ass" \
-c:a copy outputs/トピック名/input-sub.mp4
- パスに特殊文字が含まれる場合は、
subtitles=の値をシングルクォートで囲み、コロンをエスケープします。 - ソフト字幕(オフにできる)が必要で焼き込み不要の場合:
ffmpeg -i in.mp4 -i sub.srt -c copy -c:s mov_text out.mp4。
3. 成果物とレポート
- 字幕ファイル、焼き込み動画はすべて
outputs/<トピック名>/に書き込まれます。 - ユーザーに報告:認識言語、字幕数、モデル、ファイルパス;
--model/--max-line-charsを変更して再実行可能であることを伝えます。
ルール
- ビデオから先に音声トラックを抽出 — スクリプトは自動的に ffmpeg で 16kHz モノラル wav を抽出します。元のビデオは変更されません。
- 中国語に適した文区切り処理 — 句読点と長さに基づいて行を分割し、1行が長くなりすぎないようにします。
- 元のファイルは絶対に削除しない —
outputs/に新しいファイルのみを作成します。 - モデル選択 — 速度重視なら
base、精度重視ならsmall/medium;CPU では int8 を使用します。 - 焼き込みにはビデオ入力が必要 — オーディオのみの場合は焼き込み不可、字幕ファイルのみ出力されます。
- プロファイル依存なし — 文字起こしにアカウントプロファイルは必要ありません。
参考資料
- SYSTRAN/faster-whisper — CTranslate2 で高速化された Whisper 推論
- openai/whisper — 元の Whisper モデルと ASR 手法
- FFmpeg
subtitles/assフィルター(字幕焼き込み)