Communitygithub.com

rizomaai/video-narrado

.mdファイル(レポート、議事録、分析など)を、指定された音声でナレーションされた16:9の詳細動画と、Reels・YouTube Shorts・TikTok向けの9:16ショート動画に変換します。

video-narrado とは?

このスキルは、Markdownファイルを元に、プロフェッショナルなナレーション動画を自動生成するエージェントスキルです。入力された.mdを分析し、2〜4分の16:9詳細動画と、各発見事項に基づく60秒未満の9:16ショート動画(Reels/Shorts/TikTok向け)を、指定された順序で生成します。動画には選択した音声(デフォルトはHeyGenのクローン音声)によるナレーション、自動字幕、背景音楽が含まれ、各動画には公開用のタイトル・説明・ハッシュタグ・代替テキストを含む`publicacion.md`も同時に作成されます。内部ではPlaywrightとffmpegを使用した独自のレンダリングエンジンが動作し、8〜16シーンのストーリーボードを編集者と共同で作成・承認してから、音声生成・動画構築・最終チェックのワークフローを実行します。主にスペイン語(チリ)のコンテンツ向けですが、音声エンジンと言語設定は変更可能です。

対応~Claude Code~Codex CLI~Cursor
npx skills add rizomaai/video-narrado

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

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

ドキュメント

video-narrado は何をしますか?

入力: .mdファイル。出力(この順序で):

  1. 詳細動画 16:9(2〜4分)。MDの内容をすべてカバーします。
  2. ショート動画 9:16(2〜3本、60秒未満)。各動画は詳細動画の1つの発見事項をピックアップします。
  3. 各動画ごとに 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 のフィールド値
voiceIdb088805628184836963fa5d2881bb23b
engineelevenlabs
settings{"model_id": "eleven_v4"}
languagees

動画作成者が別の音声を希望する場合、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 を受け付けます):

種類フィールド用途
portadatitulo, bajada詳細動画の開始
cifrastitulo, items[{valor, prefijo?, sufijo?, texto, detalle?}](1〜3)、destacarカウントアップする数字
barrastitulo, items[{etiqueta, valor, rotulo?}](最大8)、destacar, nota数量の比較
hitofecha, etiqueta, titulo, texto, progreso{i, n}時系列上の出来事
listatitulo, items[{marca?, texto, alerta?}](最大6)論点や手順
citafecha, texto, quien, nota誰かの発言
destacadotexto, bajada覚えておくべきフレーズ、ショート動画のフック
cierrebajada, 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 を確認してください。

関連スキル