video-narrado は何をしますか?
入力: .mdファイル。出力(この順序で):
- 詳細動画 16:9(2〜4分)。MDの内容をすべてカバーします。
- ショート動画 9:16(2〜3本、60秒未満)。各動画は詳細動画の1つの発見事項をピックアップします。
- 各動画ごとに
publicacion.md(タイトル、説明、ハッシュタグ、代替テキスト)。
すべて指定された音声、字幕、独自の背景音楽付き。
- エンジン: このスキル内の
motor/ディレクトリ(Playwright 1.63.0 + ffmpeg、Python 3、依存関係なし)。MOTORはそのフォルダの絶対パス。 - プロジェクト: 動画ごとに1つのフォルダ(例:
videos/YYYY-MM-DD_テーマ/)、各動画ごとにサブフォルダ(largo/、short-1-…/、short-2-…/)。各動画にはstoryboard.jsonが含まれます。 - インストール(初回のみ):
README.mdを参照。
選択された音声
デフォルトでは、HeyGenのクローン音声「audio_pmm」を使用します。
create_speech のフィールド | 値 |
|---|---|
voiceId | b088805628184836963fa5d2881bb23b |
engine | elevenlabs |
settings | {"model_id": "eleven_v4"} |
language | es |
動画作成者が別の音声を希望する場合、mcp__heygen__list_voices で検索し、生成前に確認します。
フロー
1. MDを読み込み、動画の構成を提案
MD全体を読み込みます。詳細動画の流れ(すべての発見事項を順に)と、各ショート動画で取り上げる発見事項(最も強いものを最初に)を定義します。ストーリーボードを書く前に、動画のリストを表示します。
2. ストーリーボード → 承認
1つのアイデアにつき1シーン。詳細動画は8〜16シーン、ショート動画は4〜7シーンで、最初のシーンにフック(destacado)を配置します。完全な例: motor/ejemplos/storyboard-desalacion-16x9.json
{"id": "03-sesiones", "tipo": "barras", "kicker": "セッション数", "titulo": "最も話された場所",
"items": [{"etiqueta": "カレタ・チャニャラル", "valor": 6}], "destacar": 0, "nota": "出典…",
"subtitulo": "チャニャラル・デ・アセイトゥーノが最もセッションが多いケースでした。",
"voz": "チャニャラル・デ・アセイトゥーノが最もセッションが多いケースでした。"}
ストーリーボードのヘッダー: titulo、serie(「Rizoma ·」の隣に表示されるもの)、formato(詳細動画は "16:9"、ショート動画は "9:16")、fuente_md、必要に応じて musica(ステップ5を参照)。
シーンの種類(すべて kicker、tono: "oscuro"、lluvia: true を受け付けます):
| 種類 | フィールド | 用途 |
|---|---|---|
portada | titulo, bajada | 詳細動画の開始 |
cifras | titulo, items[{valor, prefijo?, sufijo?, texto, detalle?}](1〜3)、destacar | カウントアップする数字 |
barras | titulo, items[{etiqueta, valor, rotulo?}](最大8)、destacar, nota | 数量の比較 |
hito | fecha, etiqueta, titulo, texto, progreso{i, n} | 時系列上の出来事 |
lista | titulo, items[{marca?, texto, alerta?}](最大6) | 論点や手順 |
cita | fecha, texto, quien, nota | 誰かの発言 |
destacado | texto, bajada | 覚えておくべきフレーズ、ショート動画のフック |
cierre | bajada, url, fuente | ブランドと出典 |
編集ルール:
- MDにある事実のみ。MDが疑わしいとしているものは除外するか、その旨を明記する。
vozは読み上げるテキスト: 数字、年、パーセンテージ、頭字語は単語で書く(texto_voz.pyが数字を拒否します)。subtituloは画面表示用で、数字を含めてもよい。textoはhito、cita、destacadoの画面上のテキスト。- 短い文、中立的なチリスペイン語、約2.9語/秒。ショート動画は約140語を超えない。
- 自動文字起こしから取得したものは、パラフレーズとしてマークする(
nota)。 - 公開するものにクライアント名や内部プラットフォーム名は記載しない。クロージングに出典を記載する。
各ストーリーボードを表(シーン・種類・表示内容・ナレーション内容)として表示し、承認を待つ: 各ナレーションは音声クォータを消費します。
3. 音声(動画ごとに1回の呼び出し)
python3 $MOTOR/texto_voz.py <動画フォルダ>
出力されるテキスト(各シーンの音声を <break time="1.2s"/> で結合したもの)を、選択された音声で mcp__heygen__create_speech に渡します。返ってきた audio_url を使って:
python3 $MOTOR/bajar_voz.py <動画フォルダ> "<audio_url>"
音声をダウンロードし、ポーズを見つけてシーンごとに分割します。ポーズが見つからないと警告された場合は、ダウンロード済みの音声に対してより低いしきい値で再実行します: python3 $MOTOR/bajar_voz.py <動画フォルダ> <動画フォルダ>/voz/narracion.wav --pausa 0.7(実際にはElevenLabsが一部のポーズを少し短くすることがあります)。それでも失敗する場合、音声が <break> を尊重しなかった可能性があります。再生成する前に確認してください。エラー後に単独で生成を再試行しないでください。
4. 構築とレンダリング
bash $MOTOR/producir.sh <動画フォルダ> # 完全な動画
bash $MOTOR/producir.sh <動画フォルダ> --hasta 15 --salida prueba.mp4 # 短いテスト
各シーンは、その音声の長さだけ続きます。MP4は <動画フォルダ>/salida/video.mp4 に出力されます。処理時間は動画の長さにほぼ比例します。
5. 背景音楽
自動: ffmpegで合成されたアンビエントパッド(サードパーティの権利なし)、音声より14 dB低く、ソフトダッキングあり、最終ミックスは-16 LUFS。ストーリーボードで: "musica": {"bajo_voz_db": 18} でさらに低く; {"archivo": "pista.mp3"} で独自のトラック(フリー使用のみ、ライセンスを明記)を使用; false でオフ。
6. ショート動画
詳細動画が承認された後、各ショート動画を別の動画として構成します(formato: "9:16")。詳細動画のシーンを再利用: フック → データシーン2〜4 → クロージング。ステップ3(動画ごとに1回の音声呼び出し)とステップ4を同じ手順で実行します。
7. レビューと納品
- ffmpegで4〜8フレームを抽出し確認: 字幕がデータを覆い隠していないか、テキストがフレームからはみ出していないか、空白のシーンがないか。
- 各動画に
publicacion.mdを作成: タイトル(60文字以内)、出典付きの説明、3〜5個のハッシュタグ、代替テキスト、公開前に確認すべき点。 - MP4を
~/Downloadsにわかりやすい名前でコピー(Video_<テーマ>.mp4、Short_<n>_<テーマ>.mp4)。音声とMP4はgit管理対象外(**/voz/*.wav、**/salida/)。
独自のアニメーションHTMLからの場合
window.seek(t) と固定時間のシーンを持つHTMLがすでに存在する場合、手動で guion.json(セグメントごとに html: [a, b])を作成し、preparar.py + render.mjs を実行します。手動で作成したショート動画の場合: motor/plantillas/motor-vertical.js。
フォーマットとセーフゾーン
- 16:9: 1920×1080、下部34pxの字幕、58文字以内のフレーズ。
- 9:16: 1080×1920、下部から400pxの位置に54pxの字幕、34文字以内のフレーズ。コンテンツは y=400 から y=1380 の間に配置(上下は各プラットフォームのボタン用)。
- どの字幕も「que」「las」「por」などで終わらないようにします。
既知のエラー
- ネットワークなし: Googleフォントが読み込めず、レンダリングがArialにフォールバックします。
- libassなしのffmpeg(Homebrew): そのため、字幕はページ内で描画されます。
- 未知のシーンタイプ: 動画が空白で出力されます。
tipoを確認してください。