AutoSubtitle AI - 自動化 & エージェントスキルガイド
このスキルは、auto-subtitle CLI と FastAPI バックエンドを使用して、字幕抽出、音声認識、歌詞強制アライメント(Lunaパイプライン)、ローカルLLM校正、GPUアクセラレーションによる動画ハードサブ焼き込みを自動化する方法をガイドします。
📌 ワークフロー決定マトリクス
入力アセットに基づいて適切なコマンドまたはパイプラインを選択してください。
| シナリオ / 目標 | 推奨コマンド | 主要な引数 |
|---|---|---|
歌唱 / 歌詞アライメント(メディア + .txt 歌詞) | python src/cli/main.py luna(または align) | <media> <lyrics.txt> --llm local/api -o <dir> |
| 音声 / トーク / 動画から字幕生成(スクリプトなし) | python src/cli/main.py pipeline | <media> -d cuda -o <dir> |
| 音声のみ抽出 | python src/cli/main.py extract | <video> -o <audio.wav> --sr 16000 |
| 誤字・同音異義語の修正(Edge LLM使用) | python src/cli/main.py proofread | <subtitles.srt> --gpu-layers -1 |
| 動画に字幕を焼き込み(ハードサブ) | python src/cli/main.py burn | <video> <subtitles.srt> --css "..." |
| フォント管理(オープンソース / Windowsフォントのインストール) | python src/cli/main.py fonts | list, install <id/path/url>, remove <filename> |
| Web Studioの起動 | python src/cli/main.py serve | --host 0.0.0.0 --port 8000 |
🛠️ CLIコマンドリファレンス
1. Luna歌詞パイプライン(luna / align)
Whisper音響特徴抽出 + stable-ts アライメント + LLM意思決定監査 + +0.16秒の読みやすさパディングの5ステップ二重検証パイプラインを実行します。
python src/cli/main.py luna inputclip/test_video.mp4 inputclip/audio-org.txt \
--llm local \
--output-dir output_luna
--output-dir に出力される成果物:
lyrics.srt: 標準SRT字幕トラック。lyrics.vtt: Webプレイヤー向けWebVTT形式。lyrics.lrc: ミリ秒タイムスタンプ付き拡張LRC形式(音楽プレイヤー向け)。lyrics.ass: FFmpeg焼き込み用に整形されたASS字幕。cue_evidence.json: 各行の完全な音響エビデンスと信頼性指標。review.csv: 異常行とLLM判定結果の詳細レポート。run_manifest.json: ソースメディアと出力のSHA-256整合性ハッシュ。
2. エンドツーエンド音声パイプライン(pipeline)
トーク番組、ポッドキャスト、講義向けの自動音声パイプライン:
python src/cli/main.py pipeline inputclip/test_video.mp4 \
--device cuda \
--prompt "繁體中文" \
--max-chars 16 \
--pause 0.45 \
--output-dir output/
3. Edge LLM校正(proofread)
ローカルの Qwen2.5-3B-Instruct GGUF をGPUオフロードで実行し、音声認識エラーを修正します:
python src/cli/main.py proofread output/video.srt \
--gpu-layers -1 \
--batch-size 8 \
--output output/video.proofread.srt
4. GPUハードサブ動画焼き込み(burn)
NVIDIA NVENC GPUアクセラレーションを使用して、スタイル付きASS字幕を動画フレームに直接焼き込みます:
# インラインCSS文字列を使用(透明度、アウトライン、フォント、ボックスモデルのパディング、色をサポート)
python src/cli/main.py burn inputclip/test_video.mp4 output/lyrics.srt \
--css "font-family: 'Noto Sans CJK TC'; font-size: 36px; color: #FFD700; opacity: 0.85; -webkit-text-stroke: 3px #000; text-shadow: 2px 2px 3px #000; padding: 40px 40px 60px 40px;" \
-o output/final_burned.mp4
# または外部CSSスタイルシートを使用:
python src/cli/main.py burn inputclip/test_video.mp4 output/lyrics.srt \
--css-file styles/youtube_style.css \
-o output/final_burned.mp4
# または明示的なフラグを使用:
python src/cli/main.py burn inputclip/test_video.mp4 output/lyrics.srt \
--font "jf-openhuninn-2.0" \
--size 38 \
--color "#FFFFFF" \
--opacity 0.9 \
--outline 3.0 \
--outline-color "#000000" \
--direction horizontal \
--valign bottom \
--halign center
5. フォント管理(fonts)
# 利用可能、インストール済み、およびWindowsシステムフォントをすべて一覧表示
python src/cli/main.py fonts list
# プリセットIDで人気のオープンソースフォントをインストール:
# オプション: openhuninn(粉圓體), lxgw-wenkai(霞鶩文楷), iansui(芫荽體), win-msjhbd(微軟正黑粗體)
python src/cli/main.py fonts install openhuninn
# URLやローカルファイルからインストール:
python src/cli/main.py fonts install https://example.com/font.ttf
python src/cli/main.py fonts install /path/to/custom_font.otf
🤖 自動化レシピ
レシピ1: ディレクトリ内の全動画をバッチ処理(Bash)
#!/usr/bin/env bash
set -e
INPUT_DIR="./raw_videos"
OUTPUT_DIR="./dist_videos"
mkdir -p "$OUTPUT_DIR"
for video in "$INPUT_DIR"/*.mp4; do
[ -f "$video" ] || continue
filename=$(basename "$video")
stem="${filename%.*}"
lyrics="$INPUT_DIR/$stem.txt"
echo "🚀 処理中: $filename"
if [ -f "$lyrics" ]; then
# 歌詞スクリプトパイプライン
python3 src/cli/main.py luna "$video" "$lyrics" --output-dir "$OUTPUT_DIR/$stem" --llm local
sub_file="$OUTPUT_DIR/$stem/lyrics.srt"
else
# スクリプトなし音声パイプライン
python3 src/cli/main.py pipeline "$video" -d cuda --output-dir "$OUTPUT_DIR/$stem"
sub_file="$OUTPUT_DIR/$stem/$stem.srt"
fi
# ブランディングスタイルでハードサブを焼き込み
python3 src/cli/main.py burn "$video" "$sub_file" \
--css "font-size: 34px; color: #FFFFFF; opacity: 0.9; -webkit-text-stroke: 2.5px #000; text-shadow: 2px 2px #000;" \
-o "$OUTPUT_DIR/${stem}_subtitled.mp4"
echo "✔ 完了: $stem"
done
レシピ2: Python字幕生成スクリプト
from pathlib import Path
from src.core.luna_pipeline import run_luna_pipeline
from src.core.video_burner import burn_subtitles_to_video
from src.schemas.subtitle import SubtitleStyle
media_file = "inputclip/test_video.mp4"
lyrics_file = "inputclip/audio-org.txt"
out_dir = Path("output_automation")
# 1. Luna二重検証パイプラインを実行
track = run_luna_pipeline(
audio_path=media_file,
lyrics_source=lyrics_file,
output_dir=str(out_dir),
llm_provider="local"
)
# 2. 透明度とアウトラインを含む字幕スタイルを定義
style = SubtitleStyle.from_css(
"font-size: 36px; color: #FFD700; opacity: 0.85; -webkit-text-stroke: 3px #000;"
)
# 3. NVENC GPUで字幕を直接焼き込み
burned_mp4 = burn_subtitles_to_video(
video_path=media_file,
subtitles_source=str(out_dir / "lyrics.srt"),
output_path=str(out_dir / "burned_output.mp4"),
style=style,
use_gpu=True
)
print(f"焼き込み動画を作成しました: {burned_mp4}")
レシピ3: REST API統合(FastAPI)
サーバーは http://localhost:8000 で起動します:
- 文字起こし / スクリプトなし:
POST /api/ai/transcribeに Formフィールドmedia_path=...、auto_proofread=true - アライメント / Lunaパイプライン:
POST /api/ai/alignに JSON{"media_path": "...", "script_text": "...", "script_mode": "reference", "llm_provider": "local"} - CSSの解析:
POST /api/style/parse-cssに JSON{"css": "font-size: 36px; opacity: 0.8;"} - 動画焼き込み:
POST /api/burnに JSON{"video_path": "...", "subtitle_path": "...", "css": "..."}
🎨 CSS Box Model & ASSスタイリングマッピング
--css で字幕スタイルをデザインする場合:
| CSSプロパティ | ASS形式への変換 | 注意事項 |
|---|---|---|
opacity: 0.85 | 反転アルファ16進数 &H26FFFFFF& | アルファ = round((1 - opacity) * 255)。0=不透明、255=透明。 |
-webkit-text-stroke: 4px #000 | Outline: 2.0、OutlineColour: &H00000000& | paint-order: stroke fill; と併用すると、ストロークは外側にのみ拡大。 |
text-shadow: 2px 2px 3px #000 | Shadow: 2.0、BackColour: &H80000000& | 絶対軸オフセットの大きい方を使用。等軸CSSはドリフトなく往復可能。 |
writing-mode: vertical-rl | \N 改行による垂直カラムレイアウト | ビューポート高さを超えると自動的に右から左に折り返す。 |
text-align: center/left/right | 九宮格アライメントマッピング(1〜9) | 下中央 = 2、上中央 = 8、中央 = 5。 |
padding: 50px 40px 60px 40px | MarginV、MarginL、MarginR | PlayRes解像度に対するASSピクセルマージンに変換。 |
⚠️ 重要な実装注意事項
- GPUアクセラレーション:
- Whisper: スクリプトあり・なし、ロックタイムライン推論のすべてでネイティブWhisper
large-v3-turboを使用します。モデルとバックエンドは固定です。モデルや計算タイプのオプションを渡さないでください。 - 動画焼き込み: デフォルトの
use_gpu=TrueはFFmpegh264_nvencを試行します。実行時にNVENCが利用できない場合は、CLI--cpuでlibx264を使用します。
- Whisper: スクリプトあり・なし、ロックタイムライン推論のすべてでネイティブWhisper
- 歌詞の複数行文字列とファイルパス:
run_luna_pipelineはファイルパス(.txt)または生の複数行歌詞文字列の両方を受け入れます。CLIはTXTパスを取ります。複数行文字列はファイルシステムのパスチェックなしで直接解析されます。
- ソース字幕の上書き防止:
.srtまたは.vttを生成する際、出力はターゲット出力ディレクトリに書き込まれるか、同じ名前のファイルが存在する場合は.generated.srtという接尾辞が付加されます。