Communitygithub.com

nicko1122/auto-subtitle

自動音声抽出、Whisper音声認識、Luna二重検証歌詞アライメント、ローカルEdge LLM校正、CSS字幕スタイリング、NVENC GPU動画ハードサブ焼き込み。動画・音声の字幕処理、歌詞アライメント、バッチ字幕自動化、ASS/CSSハードコピー動画焼き込みを行う際にこのスキルを有効化します。

auto-subtitle とは?

AutoSubtitle AIスキルは、動画・音声ファイルに対する自動字幕生成、歌詞アライメント、校正、GPU高速ハードサブ焼き込みを実現するための包括的なCLIツールセットです。このスキルは、Whisperによる音声認識、Lunaパイプラインによる二重検証(安定したアライメントとLLM監査)、ローカルEdge LLM(例:Qwen2.5-3B-Instruct GGUF)による誤認識訂正、NVIDIA NVENC GPUアクセラレーションによる動画への字幕焼き込みをサポートします。主なユースケースは、歌詞アライメント(メディア+歌詞テキスト)、台詞・講演の字幕生成、既存字幕の校正、スタイル付きASS字幕の動画焼き込み、フォント管理、FastAPI REST APIによる統合です。ワークフローは決定マトリクスに従って選択でき、CSS box modelのプロパティをASS書式にマッピングする高度なスタイリング機能も備えています。バッチ処理スクリプトやPythonモジュールとしての利用も可能で、自動化パイプラインに簡単に組み込めます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/nicko1122/auto-subtitle/tree/HEAD/skills/auto-subtitle

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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 fontslist, 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 #000Outline: 2.0、OutlineColour: &H00000000&paint-order: stroke fill; と併用すると、ストロークは外側にのみ拡大。
text-shadow: 2px 2px 3px #000Shadow: 2.0、BackColour: &H80000000&絶対軸オフセットの大きい方を使用。等軸CSSはドリフトなく往復可能。
writing-mode: vertical-rl\N 改行による垂直カラムレイアウトビューポート高さを超えると自動的に右から左に折り返す。
text-align: center/left/right九宮格アライメントマッピング(1〜9)下中央 = 2、上中央 = 8、中央 = 5。
padding: 50px 40px 60px 40pxMarginV、MarginL、MarginRPlayRes解像度に対するASSピクセルマージンに変換。

⚠️ 重要な実装注意事項

  1. GPUアクセラレーション:
    • Whisper: スクリプトあり・なし、ロックタイムライン推論のすべてでネイティブWhisper large-v3-turbo を使用します。モデルとバックエンドは固定です。モデルや計算タイプのオプションを渡さないでください。
    • 動画焼き込み: デフォルトの use_gpu=True はFFmpeg h264_nvenc を試行します。実行時にNVENCが利用できない場合は、CLI --cpu で libx264 を使用します。
  2. 歌詞の複数行文字列とファイルパス:
    • run_luna_pipeline はファイルパス(.txt)または生の複数行歌詞文字列の両方を受け入れます。CLIはTXTパスを取ります。複数行文字列はファイルシステムのパスチェックなしで直接解析されます。
  3. ソース字幕の上書き防止:
    • .srt または .vtt を生成する際、出力はターゲット出力ディレクトリに書き込まれるか、同じ名前のファイルが存在する場合は .generated.srt という接尾辞が付加されます。

関連スキル