mcpField
V
video-translate

video-translate

github.com/melvynxクリエイティブ・メディア6446 回インストール1 週間前に更新
リポジトリ

video-translate について

video-translate は、元の映像を保ったまま、撮影テイクを別の言語で吹き替える手順を案内するスキルです。ElevenLabs で声をクローンし、リップシンクは行わず、吹き替え後は /video-edit で編集できます。

主な機能

  1. 01ElevenLabs による目標言語の吹き替え
  2. 02元のテイクから声をクローン
  3. 03吹き替え前に不要部分をカット
  4. 04元映像を維持しリップシンクなし
  5. 05吹き替えテイクを /video-edit に引き継ぎ

活用シーン

  1. 01動画テイクを別の言語に吹き替え
  2. 02リテイクや無音部分を切り使用量を抑制
  3. 03吹き替え版の字幕と編集を作成
  4. 04吹き替え内の人名や専門用語を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/melvynx/video-agent-skills --skill video-translate

インストール後、Claude Code で/video-translateを入力して読み込まれたか確認します。

詳細

動画の翻訳

テイクを1つ入れると、同じテイクが別の言語で出力されます。音声はクリエイター本人の声です(ElevenLabsがテイク自体から声をクローンします)。映像は元のままで、リップシンクは行いません。その後、/video-edit でほかのテイクと同じように翻訳済みテイクを編集し、新しい言語の字幕を付けます。

本人の言語で話しかけてください。<slug>:テイクのスラッグ、<lang>:対象言語コード(en、es、fr、de、pt、it、ja…)、<from>:元の言語コードです。

1. ElevenLabs のキー(一度だけ)

キーは video-agent/.env に保存します。チャットメッセージ、スクリプト、コミットには絶対に含めないでください。

grep -c ELEVENLABS_API_KEY video-agent/.env 2>/dev/null

0 またはファイルがない場合:

  1. elevenlabs.io/app/settings/api-keys でキーを作成します(ElevenLabs アカウントが必要です。吹き替えにはプランのクレジットを使用します。無料プランではウォーターマークが付きます)。
  2. キーは本人が video-agent/.env に1行で貼り付けます:ELEVENLABS_API_KEY=sk_...。空のファイルを作成して開くことを提案してください。チャットでキーを貼り付けるよう求めてはいけません。本人が貼り付けてしまった場合は、ファイルに書き込み、キーを再生成できることを伝えてください。
  3. video-agent/.env がプロジェクトの .gitignore に含まれている必要があります(なければ video-agent/.env の行を追加します)。

以下の各コマンドでは set -a; . video-agent/.env; set +a でキーを読み込み、キーを出力することはありません。

2. 翻訳するもの

完成した動画ではなく、テイクを翻訳します。完成した動画には元の言語の字幕が焼き込まれているためです。その後、video-edit で新しい音声に合わせてカット、字幕、タイミングを調整します。

  • すでに編集済みのテイク(video-agent/edits/<slug>/edit.json が存在する場合):残す部分だけを送信し、無音、どもり、撮り直しに料金がかからないようにします。video-edit の範囲指定を使って、プレーンカットを作成します(video-agent/studio/ から実行):
    SEL=$(node -e 'const e=require("./public/<slug>.edit.json");console.log(e.ranges.map(r=>`between(t,${r.fromMs/1000},${r.toMs/1000})`).join("+"))')
    ffmpeg -y -i public/<slug>.mp4 -vf "select='$SEL',setpts=N/FRAME_RATE/TB" -af "aselect='$SEL',asetpts=N/SR/TB" -c:v libx264 -crf 18 -c:a aac -b:a 192k ../.tmp/<slug>-cut.mp4
    
    元動画は video-agent/.tmp/<slug>-cut.mp4 です。
  • 未編集のテイク:同じ理由から、まず /video-edit をカットリスト作成まで実行する(手順1〜4)ことを提案してください。急ぐ場合は、未編集のテイクをそのまま送信します。

3. 見積もりを出してから送信

ffprobe -v error -show_entries format=duration -of csv=p=0 "<source>"

1行で提示し、承諾を待ちます:Dub <slug> fr → en · 動画の長さ 0:52 · 1分程度の料金がElevenLabsのクレジットから請求されます(プランの吹き替え料金は elevenlabs.io/pricing で確認してください)· リップシンクなし。

その後、送信します(アップロード1分あたり約10秒):

mkdir -p video-agent/.tmp
set -a; . video-agent/.env; set +a
curl -sS --fail-with-body -X POST https://api.elevenlabs.io/v1/dubbing \
  -H "xi-api-key: $ELEVENLABS_API_KEY" \
  -F "file=@<source>" -F "target_lang=<lang>" -F "source_lang=<from or auto>" \
  -F "num_speakers=1" -F "watermark=false" -F "name=<slug>-<lang>" \
  > video-agent/.tmp/<slug>-<lang>.job.json
cat video-agent/.tmp/<slug>-<lang>.job.json

{"dubbing_id": "...", "expected_duration_sec": ...} が返されます。IDを保管してください。処理が中断しても、同じIDで再度ポーリングしても料金はかかりません。401はキーの誤り、402または「quota」はプランのクレジット残高不足を意味します。「watermark」で拒否された場合は、そのフィールドを省略して再送信してください。

4. 待機してからダウンロード

status が dubbed になるまで15秒ごとにポーリングします(failed の場合はエラーを表示して停止します)。短い動画なら通常1〜5分です。バックグラウンドで実行してください:

set -a; . video-agent/.env; set +a
curl -sS --fail-with-body -H "xi-api-key: $ELEVENLABS_API_KEY" https://api.elevenlabs.io/v1/dubbing/<dubbing_id>

続いて、吹き替え済みファイルを取得します:

set -a; . video-agent/.env; set +a
curl -sS --fail-with-body -H "xi-api-key: $ELEVENLABS_API_KEY" -o video-agent/.tmp/<slug>-<lang>.dub https://api.elevenlabs.io/v1/dubbing/<dubbing_id>/audio/<lang>
ffprobe -v error -show_entries stream=codec_type -of csv=p=0 video-agent/.tmp/<slug>-<lang>.dub
  • video ストリームがある場合:すでに吹き替え済みの動画です。video-agent/takes/<slug>-<lang>.mp4 に移動します。
  • 音声のみの場合:元の映像に音声を重ねます:
    ffmpeg -y -i "<source>" -i video-agent/.tmp/<slug>-<lang>.dub -map 0:v -map 1:a -c:v copy -c:a aac -b:a 192k -shortest video-agent/takes/<slug>-<lang>.mp4
    

確認します。元動画と同じ長さ(誤差1秒以内)であることを確認してください。その後、編集に進む前に最初の10秒を聞いてもらってください(声、アクセント、単語の誤りを確認します)。

5. 翻訳済みテイクを編集

/video-edit <slug>-<lang> を実行し、次のように伝えます:

  • 言語が変わったこと:この文字起こしでは video-agent/studio/whisper-config.mjs の WHISPER_LANG を <lang> に設定し、終わったら元に戻します(英語:WHISPER_MODEL = "medium.en" が最適です。それ以外の言語:"medium")。フックカード、コールアウト、post.md は <lang> で作成します。
  • 元の動画がある場合は、同じ編集にすること:同じフックカードとコールアウトを翻訳し、新しい文字起こしで対応する言葉に合わせて配置します。
  • <lang> での依頼文(CTA):翻訳を一度だけ本人に尋ねるか、voice.md にあるものを翻訳して提示します。

すべて <slug>-<lang> という名前にし、両方のバージョンを並べて置きます。その後、対象言語のアカウントで /video-publish <slug>-<lang> を実行します。

最後に video-agent/.tmp/<slug>-* を削除します。ただし、吹き替えを再ダウンロードする可能性がある場合はジョブファイルを残します。

正直な制限事項

  • リップシンクには対応していません。唇は元の言語のまま動きます。動きが多い映像、顔が小さく映る映像、カットが素早い映像なら問題ありませんが、長いクローズアップでは目立ちます。
  • 音声クローンは元の音声から作られます。音声にノイズがある場合や、声の下に音楽が流れている場合は、クローンの品質が低下します。
  • 機械翻訳では、名前、専門用語、ジョークが誤訳されることがあります。公開前に、吹き替え版の文字起こしを本人(またはネイティブスピーカー)に確認してもらってください。
  • 吹き替えでは1分ごとにElevenLabsのクレジットが消費され、料金はプランによって異なります。最も手軽に費用を抑える方法は、先に映像をトリミングすることです。

コメント