video-gen について
video-genは、ListenHub CLIでAI動画を生成・編集するエージェントスキルです。HappyHorse、SeeDance、PixVerseの機能を使い分け、PixVerse限定のリップシンクや広告・プロモーション動画の生成にも対応します。
主な機能
- 01テキスト・画像からの動画生成
- 02参照画像と動画の入力
- 03HappyHorseによる動画編集
- 04PixVerseのリップシンクとスタイル変更
- 05JSON出力による非同期生成
活用シーン
- 01テキストプロンプトから動画を生成
- 02静止画や参照素材をアニメーション化
- 03既存動画の編集
- 04動画の口の動きを音声やTTSに同期
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ marswaveai/ skills --skill video-genインストール後、Claude Code で/video-genを入力して読み込まれたか確認します。
同梱ファイルreferences/happyhorse-api.mdreferences/pixverse-api.md
詳細
使用する場合
- テキストの説明からAI動画を生成したい場合
- 静止画像(最初のフレーム)をアニメーション化したい場合
- 動画生成のガイドとして参照画像を使いたい場合
- 既存の動画を編集したい場合(スタイルや背景の変更など)
- 動画の音声またはTTSに合わせてリップシンクしたい場合(PixVerseのみ) — 「对口型」、「口型同步」
- マーケティング広告/プロモーション用のミックス動画を作成したい場合(PixVerse agent)
- 「生成视频」、「做视频」、「video generation」、「text to video」、「视频编辑」、「pixverse」、「口型」と言っている場合
使用しない場合
- ナレーションとAIビジュアルを組み合わせた解説動画を作成したい場合(
/explainerを使用) - 音声/動画をテキストに文字起こししたい場合(
/asrを使用) - 画像を生成したい場合(
/image-genを使用)
目的
ListenHub CLIを使用してAI動画を生成します。3つのモデルファミリーに対応しています。
- HappyHorse(デフォルト) — テキストから動画、画像から動画、参照画像から動画、動画編集
- SeeDance — テキストから動画、フレームモード(最初+最後のフレーム)、参照モード(画像、動画、音声)
- PixVerse — Agent APIによる9つの個別機能(text_to_video、image_to_video、transition、multi_transition、fusion、restyle、mimic、lip_sync、agent)。リップシンクに対応しているのはこのファミリーのみです。OpenAPIのみ対応で、URL/IDベースです。独自の
pixverseCLI名前空間を使用します。
厳守事項
shared/cli-authentication.mdに従って、必ずCLIの認証を確認してください- CLIの実行、エラー、操作パターンについては
shared/cli-patterns.mdに従ってください - 操作を始める前に、
shared/config-pattern.mdに従って必ず設定を読み込んでください - 結果の提示には
shared/output-mode.mdに従ってください —downloadモードでは、shared/config-pattern.md§ Artifact Naming に従って重複を避けながら、カレントディレクトリに{slug}.mp4を保存します - 動画を作成する際は、必ず
--no-wait --jsonを使用してください — 生成には数分かかります - CLIコマンドの実行に
evalを使わないでください — 適切な引用符を使用して、必ずlistenhub video ...を直接実行してください
モデルの比較
| 機能 | HappyHorse(デフォルト) | SeeDance | PixVerse |
|---|---|---|---|
| テキストから動画 | ✅ | ✅ | ✅ (text_to_video) |
| 画像から動画(最初のフレーム) | ✅ | ✅(+最後のフレーム) | ✅ (image_to_video) |
| 参照画像 | ✅(1~9枚、[Image N]プロンプト構文) | ✅ | ✅ (fusion、@refName構文) |
| トランジション(最初→最後) | ❌ | ✅(フレームモード) | ✅ (transition / multi_transition) |
| 動画編集 | ✅ | ❌ | ❌ |
| スタイル変更 | ❌ | ❌ | ✅ (restyle) |
| Mimic(モーション転送) | ❌ | ❌ | ✅ (mimic、720p固定) |
| リップシンク | ❌ | ❌ | ✅ (lip_sync、音声またはTTS) |
| マーケティングエージェント(広告/プロモーション) | ❌ | ❌ | ✅ (agent: ad_master / promo_mix) |
| 参照動画 | ❌(代わりに動画編集を使用) | ✅ | ✅(mimic / lip_syncのソース) |
| 参照音声 | ❌ | ✅ | ✅(lip_sync) |
| 解像度/品質 | 720p、1080p | 480p、720p、1080p | 360p、540p、720p、1080p |
| 動画の長さ | 3~15秒 | 4~15秒 | 1~60秒(agent:20/30/60秒) |
| アスペクト比 | 16:9、9:16、1:1、4:3、3:4、4:5、5:4 | 16:9、9:16、1:1、4:3、3:4、21:9 | 9:16、16:9、1:1、4:3、3:4 |
| プロンプトの長さ | ≤2500 中文 / ≤5000 非中文 | ≤500 | ≤2048 |
| レート制限 | 5 RPM | 5 RPM | 5 RPM |
| CLI名前空間 | … video create | … video create | … video pixverse generate(OpenAPIのみ) |
リップシンクに対応しているのはPixVerseのみです — HappyHorseとSeeDanceはリップシンクに対応していません。Mimic、restyle、fusion、transition、マーケティングエージェントもPixVerse専用です。
Step -1:CLI 認証チェックと Video コマンドの確認
shared/cli-authentication.md の「認証チェック」に従ってください。CLI がインストールされていない、またはログインしていない場合は、自動でインストールしてログインしてください。コマンドを手動で実行するようユーザーに求めないでください。
標準の認証チェック後、video サブコマンドを利用できることを確認します。
if ! listenhub video --help &>/dev/null; then
npm install -g @marswave/listenhub-cli@latest
if ! listenhub video --help &>/dev/null; then
echo "VIDEO_COMMAND_UNAVAILABLE"
fi
fi
VIDEO_COMMAND_UNAVAILABLE の場合は処理を停止し、ユーザーに次のように伝えてください。
video-gen には listenhub-cli の最新バージョンが必要です。現在インストールされているバージョンには video コマンドが含まれていません。新しいバージョンのリリースをお待ちください。
認証モードの検出
CLI は2つの認証モードに対応しています。有効なモードを検出してください。
# Check if OpenAPI key is configured
OPENAPI_STATUS=$(listenhub openapi config show --json 2>/dev/null)
HAS_OPENAPI=$(echo "$OPENAPI_STATUS" | jq -r '.source // empty')
# Check if internal auth is active
AUTH=$(listenhub auth status --json 2>/dev/null)
HAS_INTERNAL=$(echo "$AUTH" | jq -r '.authenticated // false')
**優先順位:**両方が設定されている場合は、機能が豊富な内部認証を優先してください。セッション変数を設定します。
if [ "$HAS_INTERNAL" = "true" ]; then
CMD_PREFIX="listenhub video"
elif [ -n "$HAS_OPENAPI" ]; then
CMD_PREFIX="listenhub openapi video"
else
# Neither configured — trigger internal auth login
listenhub auth login
CMD_PREFIX="listenhub video"
fi
以降のコマンドでは、ハードコードされた listenhub video の代わりに $CMD_PREFIX を使用します。フラグと JSON 出力形式は、どちらのモードでも同じです。
OpenAPI 固有の注意事項:
- OpenAPI モードでは API Key(
lh_sk_...)が必要です。listenhub openapi config set-keyまたは環境変数LISTENHUB_API_KEYで設定します。 - OpenAPI モードは
--audio-settingフラグに対応していません(動画編集の音声制御はまだ公開されていません)。 - 標準の
listenhub openapi video createは、ローカルの画像/動画/音声パスまたは URL を受け付けます。タスク作成前に CLI がローカルファイルをアップロードします。ローカル画像の場合、幅/高さ/サイズのメタデータも自動的に追加されます。 - リモートの Seedance 画像 URL では、CLI が寸法を推測するためにリモートアセットをダウンロードしないため、
--*-metaの値を明示的に指定する必要があります。 - PixVerse は OpenAPI 専用です。
listenhub openapi video pixverseの下で提供され、内部認証に相当する機能はありません。ユーザーが PixVerse(口型/mimic/restyle/fusion/transition/agent)を希望しているものの、内部認証のみが設定されている場合は、先に OpenAPI キーを設定するよう案内してください。 - PixVerse のメディア入力は引き続き URL/ID ベースです。
listenhub openapi video pixverse generateにローカルパスを渡さないでください。公開 URL または以前の PixVerse タスク/動画 ID をユーザーに求めてください。
Step 0:設定
shared/config-pattern.md の Step 0(質問なしで開始)に従ってください。
ファイルが存在しない場合 — デフォルト値でサイレントに作成し、続行します。
mkdir -p ".listenhub/video-gen"
echo '{"outputMode":"inline"}' > ".listenhub/video-gen/config.json"
CONFIG_PATH=".listenhub/video-gen/config.json"
CONFIG=$(cat "$CONFIG_PATH")
セッションのデフォルト値(ユーザーが再設定しない限り保存されません):
- モデル:
happyhorse - 解像度:
1080p - 比率:
16:9 - 長さ:
5
設定に関する質問はしないでください。 そのままインタラクションフローに進んでください。
ファイルが存在する場合 — 設定をサイレントに読み込み、続行します。
CONFIG_PATH=".listenhub/video-gen/config.json"
[ ! -f "$CONFIG_PATH" ] && CONFIG_PATH="$HOME/.listenhub/video-gen/config.json"
CONFIG=$(cat "$CONFIG_PATH")
設定フロー(ユーザーが再設定を開始した場合のみ)
ユーザーが明示的に再設定を求めた場合のみ実行します。現在の設定を表示します。
当前配置 (video-gen):
输出方式: {outputMode}
次に、以下を尋ねます。
- outputMode:
shared/output-mode.mdの「設定フローの質問」に従ってください。
すぐに保存します。
NEW_CONFIG=$(echo "$CONFIG" | jq --arg m "$OUTPUT_MODE" '. + {"outputMode": $m}')
echo "$NEW_CONFIG" > "$CONFIG_PATH"
CONFIG=$(cat "$CONFIG_PATH")
インタラクションフロー
Step 1:プロンプトの収集
動画の説明をユーザーに尋ねます。まだ説明が提供されていない場合:
生成したい動画の内容を説明してください。
自由形式のテキスト入力です。そのまま使用し、ユーザーから支援を求められない限りプロンプトを変更しないでください。
Step 2:モードの振り分け
Question: "你有参考素材想提供吗?"
Options:
- "没有,纯文字生成" — Text-to-video mode, skip to Step 4
- "有图片,想做首帧动画" — Image-to-video (first-frame) → Step 3a
- "有参考图片(风格/角色参考)" — Reference-image mode → Step 3b
- "有视频,想编辑/修改" — Video-edit mode → Step 3c
- "有视频,想做口型同步" — Lip-sync mode (PixVerse only) → Step 3d
ユーザーが PixVerse 専用の機能(口型/リップシンク、模倣/mimic、restyle/スタイル変更、融合/fusion、過渡/transition、広告/promo agent)に言及した場合は、PixVerse に振り分け、対応する --capability を選択してください。Step 4(PixVerse)と references/pixverse-api.md を参照してください。
Step 3a:画像から動画を生成(最初のフレーム)
-
first-frame(必須):画像のパスまたは URL を尋ねます。
- 対応形式:jpg、jpeg、png、webp
- ローカル画像ファイルは最大 10MB
- 画像:幅と高さがそれぞれ 300px 以上、比率は 1:2.5~2.5:1
- ローカル画像の場合、CLI が Seedance のメタデータを自動入力します。リモートの Seedance 画像 URL では
--first-frame-meta WIDTHxHEIGHT[:SIZE]が必要です。
-
last-frame(任意、SeeDance のみ):モデルが SeeDance の場合、最後のフレーム画像があるか尋ねます。
Question: "有尾帧图片吗?(仅 SeeDance 支持)"
Options:
- "没有,只用首帧" — Skip last-frame
- "有" — Collect last-frame path/URL
収集後、Step 4 に進んでください。
注: HappyHorse の i2v モードには ratio パラメーターがありません。比率は入力画像によって決まります。SeeDance では引き続き --ratio を指定できます。
ステップ 3b:参照画像モード
参照画像を収集します(1~9枚必須)。
画像のパス/URLを尋ねます:
- 対応形式:jpg、jpeg、png、webp
- ローカル画像ファイルの上限は 10MB です
- HappyHorse:短辺は 400px 以上を推奨します
- ローカル画像では、CLI が Seedance のメタデータを自動入力します。リモートの Seedance 画像 URL には、一致する
--reference-image-meta WIDTHxHEIGHT[:SIZE]の値が必要です。
HappyHorse のプロンプト構文: 複数の参照画像を指定した場合、ユーザーはプロンプト内で [Image 1]、[Image 2] などを使って特定の画像を参照できます。この機能についてユーザーに伝えてください。
SeeDance の追加参照(モデルが SeeDance の場合のみ):
- reference-video(任意、最大 3 件):mp4、mov、最大 50MB
- reference-audio(任意、最大 3 件):mp3、wav、最大 20MB(画像または動画との組み合わせが必須)
- reference-video のメタデータが必要です。各動画について
--reference-video-meta WIDTHxHEIGHT[:DURATION[:FPS[:SIZE]]]を指定してください。
収集後、ステップ 4 に進みます。
ステップ 3c:動画編集モード(HappyHorse のみ)
モデルが SeeDance の場合、ユーザーに「動画編集は HappyHorse モデルのみ対応しているため、自動的に切り替えました。」と伝え、モデルを happyhorse に設定します。
-
video(必須):動画のパスまたは URL を尋ねます。
- 対応形式:mp4、mov(H.264 を推奨)
- 長さ:3~60 秒(出力は最大 15 秒)
- 最大 100MB、短辺 360px 以上、長辺 4096px 以下
- URL のみ(base64 は不可)
-
reference-image(任意、0~5 件):編集に使う参照画像があるか尋ねます。
-
audio-setting:
Question: "音频如何处理?"
Options:
- "自动(模型决定)" — audio_setting: auto
- "保留原声" — audio_setting: origin
収集後、ステップ 4 に進みます。
注: 動画編集には ratio または duration パラメーターはありません。出力は入力動画に合わせられます。
ステップ 3d:リップシンクモード(PixVerse のみ)
リップシンクは PixVerse でのみ利用できます(--capability lip_sync)。ユーザーが HappyHorse/SeeDance を使用している場合、「口の同期は PixVerse モデルのみ対応しているため、自動的に切り替えました。」と伝え、ステップ 4 の PixVerse コマンドテンプレートを使用します。
-
ソース動画(必須):リップシンクの対象となる動画です。次のいずれかを収集します:
--source-video-id <id>— PixVerse の動画 ID、または--source-task-id <id>— 再利用する、以前に成功した PixVerse タスク。
(OpenAPI 専用。ソースはすでに PixVerse 上に存在している必要があります。)
-
音声ソース — 使用する方法をユーザーに尋ねます:
Question: "口型用什么驱动?"
Options:
- "用一段音频文件" — Collect 1 audio URL → --audio <url>
- "用文字转语音 (TTS)" — Collect speaker + content → --pixverse-json '{"tts":{...}}'
- 音声ファイル: 公開音声 URL を 1 つ収集 →
--audio <url>(最大 1 件)。音声の長さは 5~60 秒である必要があります。 - TTS: 話者 ID と読み上げるテキストを収集し、ネストされた JSON を使用します(
--lip-sync-*フラグは使用しないでください。詳細はreferences/pixverse-api.md§ lip_sync を参照してください):--pixverse-json '{"tts":{"speakerId":"<id>","content":"<text>"}}'
音声と TTS を併用しないでください。どちらか一方を選びます(両方を指定すると、契約により拒否されます)。
収集後、ステップ 4 に進みます(PixVerse の lip_sync テンプレートを使用)。
ステップ 4:任意パラメーターの調整
セッションのデフォルト設定を読み取り、提示します。モードに応じて表示内容を調整します:
テキストから動画および参照画像モードの場合:
Question: "要调整生成参数吗?当前默认配置:\n 模型: happyhorse\n 分辨率: 1080p\n 比例: 16:9\n 时长: 5 秒"
Options:
- "用默认,直接生成" — Proceed to Step 5
- "我要调整参数" — Ask each parameter below
画像から動画(最初のフレーム)モードの場合:
Question: "要调整生成参数吗?当前默认配置:\n 模型: happyhorse\n 分辨率: 1080p\n 时长: 5 秒"
Options:
- "用默认,直接生成" — Proceed to Step 5
- "我要调整参数" — Ask each parameter below
動画編集モードの場合: ステップ 4 全体をスキップします。調整可能な生成パラメーターはありません(解像度のみ)。
調整する場合、パラメーターを 1 つずつ尋ねます:
モデル:
Question: "模型?"
Options:
- "happyhorse(推荐)" — Higher quality, video-edit support
- "doubao-seedance-2-pro" — SeeDance pro, supports last-frame & audio ref
- "doubao-seedance-2-fast" — SeeDance fast
- "pixverse" — PixVerse: 口型同步/模仿/风格化/融合/过渡/广告 agent (OpenAPI only)
ユーザーが pixverse を選択した場合、以下の PixVerse コマンドテンプレートに切り替えます。PixVerse は独自の … video pixverse generate 名前空間と明示的な --capability を使用し、--resolution/--ratio の代わりに --quality/--aspect-ratio を使用します。「PixVerse コマンドテンプレート」と references/pixverse-api.md を参照してください。
解像度:
Question: "分辨率?"
Options:
- "1080p(推荐)" — High quality (default for HappyHorse)
- "720p" — Standard quality
- "480p" — Low quality (SeeDance only)
制約:ユーザーが 480p を選択し、モデルが happyhorse の場合、「HappyHorse は 480p に対応していないため、720p に切り替えました。」と伝えます。
制約:ユーザーが 1080p を選択し、モデルが doubao-seedance-2-fast の場合、黙って doubao-seedance-2-pro に切り替え、「1080p には pro モデルが必要なため、自動的に切り替えました。」と伝えます。
アスペクト比(i2v または動画編集では表示しません):
Question: "画面比例?"
Options:
- "16:9" — Landscape, widescreen
- "9:16" — Portrait, phone screen
- "1:1" — Square
- "Other" — 4:3, 3:4, 4:5, 5:4 (4:5/5:4 HappyHorse only)
長さ:
Question: "时长?"
Options:
- "5 秒(推荐)" — Standard
- "8 秒" — Medium
- "10 秒" — Long
- "Other" — Custom (HappyHorse: 3–15, SeeDance: 4–15)
シード(任意):ユーザーが結果を再現したいと言及した場合のみ尋ねます。それ以外の場合はスキップします。
ステップ 5:コスト見積もりと実行確認
見積もりコマンドを組み立てて実行します(eval は使用せず、直接呼び出します)。
ESTIMATE=$($CMD_PREFIX estimate \
--model "happyhorse" \
--resolution "1080p" \
--duration 5 \
--ratio "16:9" \
--json 2>/tmp/lh-err)
EXIT_CODE=$?
動画編集モードの場合は、--has-video-input と --input-video-duration を追加します。
- ユーザーが URL を指定した場合:長さを尋ねます
- ローカルファイルの場合:可能な範囲で ffprobe を使って検出します。
ffprobe を利用できない、または失敗した場合は見積もりをスキップし、概要に「見積もりを利用できません」と表示します。INPUT_DUR=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "/path/to/ref.mp4" 2>/dev/null | cut -d. -f1)
ESTIMATE=$($CMD_PREFIX estimate \
--model "happyhorse" \
--resolution "1080p" \
--has-video-input \
--input-video-duration "$INPUT_DUR" \
--json 2>/tmp/lh-err)
EXIT_CODE=$?
見積もり結果を解析します。
if [ $EXIT_CODE -eq 0 ]; then
TOKENS=$(echo "$ESTIMATE" | jq -r '.tokens // empty')
CREDITS=$(echo "$ESTIMATE" | jq -r '.credits // empty')
else
TOKENS=""
CREDITS=""
fi
rm -f /tmp/lh-err
確認用の概要を提示します。
Ready to generate video:
Prompt: {prompt text}
模式: {纯文字 / 首帧动画 / 参考图 / 视频编辑}
模型: {model}
分辨率: {resolution}
比例: {ratio or "跟随输入"}
时长: {duration} 秒 {or "跟随输入"}
素材: {无 / first-frame: path / references: N 个 / video: path}
预估费用: {tokens} tokens / {credits} credits ← or "预估不可用" if estimate failed
确认生成?
実行前に、明示的な確認を待ちます。
実行とポーリング
送信(フォアグラウンド)
$CMD_PREFIX create を直接呼び出します。eval でコマンド文字列を組み立ててはいけません。収集した実際の値をコマンドに代入します。$CMD_PREFIX は、ステップ -1 で判定した内部認証の場合は listenhub video、API Key 認証の場合は listenhub openapi video です。
テキストから動画を生成:
RESULT=$($CMD_PREFIX create \
--prompt "用户的视频描述" \
--model "happyhorse" \
--resolution "1080p" \
--ratio "16:9" \
--duration 5 \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
画像から動画を生成(最初のフレーム):
RESULT=$($CMD_PREFIX create \
--prompt "用户的视频描述" \
--model "happyhorse" \
--resolution "1080p" \
--duration 5 \
--first-frame "/path/to/first.png" \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
参照画像モード:
RESULT=$($CMD_PREFIX create \
--prompt "[Image 1]中的角色在城市中行走" \
--model "happyhorse" \
--resolution "1080p" \
--ratio "16:9" \
--duration 5 \
--reference-image "/path/to/ref1.png" \
--reference-image "/path/to/ref2.png" \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
動画編集モード(HappyHorse):
RESULT=$($CMD_PREFIX create \
--prompt "将背景替换为星空" \
--model "happyhorse" \
--resolution "1080p" \
--reference-video "/path/to/input.mp4" \
--audio-setting "origin" \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
SeeDance のフレームモード(最終フレームは任意):
RESULT=$($CMD_PREFIX create \
--prompt "用户的视频描述" \
--model "doubao-seedance-2-pro" \
--resolution "720p" \
--ratio "16:9" \
--duration 8 \
--first-frame "/path/to/first.png" \
--last-frame "/path/to/last.png" \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
SeeDance の参照モード(画像、動画、音声):
RESULT=$($CMD_PREFIX create \
--prompt "保持参考视频的运镜和色调风格" \
--model "doubao-seedance-2-pro" \
--resolution "720p" \
--ratio "16:9" \
--duration 5 \
--reference-video "/path/to/ref.mp4" \
--reference-image "/path/to/ref.png" \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
PixVerse コマンドテンプレート
PixVerse は独自の名前空間と明示的な --capability を使用します。OpenAPI 専用のため、$CMD_PREFIX は listenhub openapi video にする必要があります。… create ではなく … pixverse generate を呼び出します。PixVerse のメディア入力には公開 URL または以前の PixVerse タスク/動画 ID を指定します。ここではローカルファイルのパスを渡さないでください。品質には --quality(360p/540p/720p/1080p)、比率には --aspect-ratio(9:16/16:9/1:1/4:3/3:4)を使用します。ここでは --resolution/--ratio は使いません。
text_to_video:
RESULT=$(listenhub openapi video pixverse generate \
--capability text_to_video \
--model pixverse \
--prompt "赛博朋克城市夜景" \
--quality 720p \
--aspect-ratio 16:9 \
--duration 5 \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
image_to_video:
RESULT=$(listenhub openapi video pixverse generate \
--capability image_to_video \
--model pixverse \
--prompt "让画面里的人物自然走动" \
--image "https://example.com/scene.png" \
--quality 720p \
--aspect-ratio 16:9 \
--duration 5 \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
lip_sync(音声ファイル): ソース動画 + 音声 URL 1 件。
RESULT=$(listenhub openapi video pixverse generate \
--capability lip_sync \
--source-video-id "abc123" \
--audio "https://example.com/voice.mp3" \
--quality 720p \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
lip_sync(TTS): ソース動画 + ネストされた tts(--audio も渡してはいけません)。TTS には --pixverse-json のネストされた tts を必ず使用します。--lip-sync-tts/--lip-sync-speaker-id/--lip-sync-content は使用しないでください(この 3 つのフラグは lipSyncTts* にマッピングされますが、バリデーター/プロバイダーでは認識されず拒否されます。これは上流の listenhub-cli #250 におけるフラグとフィールドの不一致によるものです)。
RESULT=$(listenhub openapi video pixverse generate \
--capability lip_sync \
--source-task-id "task_xyz" \
--pixverse-json '{"tts":{"speakerId":"speaker_01","content":"大家好,欢迎来到本期节目"}}' \
--quality 720p \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
mimic: 画像 1 枚 + 動画 1 本、品質は 720p に固定です。
RESULT=$(listenhub openapi video pixverse generate \
--capability mimic \
--image "https://example.com/subject.png" \
--video "https://example.com/motion.mp4" \
--quality 720p \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
agent(ad_master / promo_mix): 品質は 720p/1080p のみ、長さは 20/30/60 のみです。promo_mix には画像が 4 枚以上必要です。
RESULT=$(listenhub openapi video pixverse generate \
--capability agent \
--agent-type promo_mix \
--prompt "为这款耳机做一支 30 秒带货短片" \
--image "https://example.com/p1.png" \
--image "https://example.com/p2.png" \
--image "https://example.com/p3.png" \
--image "https://example.com/p4.png" \
--quality 1080p \
--duration 30 \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
fusion: 参照画像にはネストされた imageReferences を使用します(トップレベルの --image は使用しないでください。契約の any.invalid により拒否されます)。プロンプトには各 refName に対応する @refName を記述する必要があります。type は subject/background のいずれかとし、refName は /^[A-Za-z][A-Za-z0-9_]{0,31}$/ に一致する必要があります。
RESULT=$(listenhub openapi video pixverse generate \
--capability fusion \
--prompt "让 @cat 在 @city 的街道上奔跑" \
--pixverse-json '{"imageReferences":[{"type":"subject","imageUrl":"https://example.com/cat.png","refName":"cat"},{"type":"background","imageUrl":"https://example.com/city.png","refName":"city"}]}' \
--quality 720p \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
multi_transition: キーフレームにはネストされた multiTransition を使用します({imageUrl,duration,prompt} を 2~7 個。トップレベルの --image は使用しないでください)。品質はデフォルトで 360p です。
RESULT=$(listenhub openapi video pixverse generate \
--capability multi_transition \
--pixverse-json '{"multiTransition":[{"imageUrl":"https://example.com/k1.png","duration":3,"prompt":"清晨的城市"},{"imageUrl":"https://example.com/k2.png","duration":3,"prompt":"正午的广场"},{"imageUrl":"https://example.com/k3.png","duration":3,"prompt":"夜晚的霓虹"}]}' \
--quality 360p \
--no-wait --json 2>/tmp/lh-err)
EXIT_CODE=$?
PixVerse の機能制約(送信前に適用):
mimic— 品質は 720p に固定(ほかの値は拒否されます)。画像 1 枚 + 動画 1 本が必要です。モーションソース動画の長さは 5~30s です。agent— 品質は 720p/1080p のみ、長さは 20/30/60 のみです。promo_mixには画像が 4 枚以上必要です。multi_transition— キーフレームには--pixverse-jsonのmultiTransition[](2~7 個)を使用します。トップレベルの--imageは空にする必要があります。品質はデフォルトで 360p です。fusion— 参照画像には--pixverse-jsonのimageReferences[](1~8 個)を使用します。トップレベルの--imageは空にする必要があります。プロンプトには各refNameに対応する@refNameを記述する必要があります。lip_sync— ソース動画(--source-video-id/--source-task-id)に加え、--audio1 件(5~60s)またはネストされたtts(--pixverse-json '{"tts":{...}}')のどちらか一方を指定します。--lip-sync-*フラグは使用しないでください。両方を同時に指定することはできません。restyle—--source-video-id(または--source-task-id)+--restyle-idを指定します。
PixVerse の見積もり(生成機能と品質/長さの指定を一致させます):
ESTIMATE=$(listenhub openapi video pixverse estimate \
--capability text_to_video \
--model pixverse \
--quality 720p \
--duration 5 \
--json 2>/tmp/lh-err)
EXIT_CODE=$?
agent の場合は --agent-type ad_master(または promo_mix)を追加します。
必要な場合のみフラグを指定:
--no-generate-audio— ユーザーが音声を無効にした場合のみ(SeeDance のみ)--seed 12345— ユーザーがシードを指定した場合のみ--audio-setting origin— 動画編集モードで元の音声を保持する場合--input-video-duration N—--reference-videoと併用する場合は必須(2~15s)
エラーチェック:
if [ $EXIT_CODE -ne 0 ]; then
ERROR=$(cat /tmp/lh-err)
case $EXIT_CODE in
2) echo "Auth error" ;;
*) echo "Error: $ERROR" ;;
esac
rm -f /tmp/lh-err
# Handle error per shared/cli-patterns.md
fi
rm -f /tmp/lh-err
TASK_ID=$(echo "$RESULT" | jq -r '.taskId')
タスクが送信されたことをユーザーに伝えます:「タスクを送信しました。ID: {TASK_ID}、生成中です…」
ポーリング(バックグラウンド)
run_in_background: true と timeout: 1260000(21 分)を指定して実行します。
TASK_ID="{taskId from above}"
for i in $(seq 1 120); do
RESULT=$($CMD_PREFIX get "$TASK_ID" --json 2>/dev/null)
STATUS=$(echo "$RESULT" | jq -r '.status')
case "$STATUS" in
success) echo "$RESULT"; exit 0 ;;
failed) echo "FAILED: $RESULT" >&2; exit 1 ;;
*) sleep 10 ;;
esac
done
echo "TIMEOUT" >&2; exit 2
ステータスの流れ:pending → generating → uploading → success | failed
結果の提示
成功時は、結果を解析します(注:get が返すのは .taskId ではなく .id です)。
VIDEO_URL=$(echo "$RESULT" | jq -r '.videoUrl')
DURATION=$(echo "$RESULT" | jq -r '.duration')
RESOLUTION=$(echo "$RESULT" | jq -r '.resolution')
RATIO=$(echo "$RESULT" | jq -r '.ratio')
SEED=$(echo "$RESULT" | jq -r '.seed')
CREDITS=$(echo "$RESULT" | jq -r '.creditCharged')
設定から OUTPUT_MODE を読み込みます。動作については shared/output-mode.md に従ってください。
inline または both:動画の URL とメタデータを表示します。
次のように提示します:
视频已生成!
URL: {videoUrl}
时长: {duration}s
分辨率: {resolution}
比例: {ratio}
Seed: {seed}
消耗: {creditCharged} credits
download または both:shared/config-pattern.md の § Artifact Naming に従い、トピックに基づいたスラッグを付けて現在の作業ディレクトリに保存します。
SLUG="{topic-slug}" # e.g. "赛博朋克城市夜景"
NAME="${SLUG}.mp4"
BASE="${NAME%.*}"; EXT="${NAME##*.}"; i=2
while [ -e "$NAME" ]; do NAME="${BASE}-${i}.${EXT}"; i=$((i+1)); done
curl -sS -o "$NAME" "$VIDEO_URL"
次のように提示します:
已保存到当前目录:
{NAME}
失敗時:エラーを表示し、プロンプトまたはパラメーターを確認するよう提案します。
タイムアウト時:後で確認するようユーザーに伝えます。
生成がタイムアウトしました。後ほど
listenhub video get {taskId} --json(またはlistenhub openapi video get {taskId} --json)で結果を確認できます。
過去のタスクの照会
ユーザーは以前のタスクの確認や、最近のタスクの一覧表示を依頼できます。
# Get a specific task
$CMD_PREFIX get "{taskId}" --json
# List recent tasks
$CMD_PREFIX list --json
上記の成功時と同じ形式で結果を提示します。
エラー処理
shared/cli-patterns.md の標準エラーコードを再利用します。
| コード | 意味 | 対応 |
|---|---|---|
| 0 | 成功 | JSON 出力を解析 |
| 1 | 一般エラー | stderr をユーザーに表示 |
| 2 | 認証エラー | 内部:listenhub auth login で再ログイン。OpenAPI:listenhub openapi config show で API Key を確認 |
| 3 | タイムアウト | 後でタスクのステータスを確認するよう提案 |
API リファレンス
- CLI 認証:
shared/cli-authentication.md - CLI 実行パターン:
shared/cli-patterns.md - 設定パターン:
shared/config-pattern.md - 出力モード:
shared/output-mode.md - HappyHorse API:
references/happyhorse-api.md - PixVerse API:
references/pixverse-api.md
組み合わせ
| 方向 | 説明 |
|---|---|
listenhub ルーター → video-gen | ユーザーが /listenhub 経由で動画生成に言及した場合にルーティングされます |
listenhub-cli ルーター → video-gen | /listenhub-cli 経由で同様にルーティングされます |
video-gen →(なし) | 独立した終端スキルで、後続の依存関係はありません |
例
テキストから動画(HappyHorse)
「動画を生成してください:サイバーパンクな都市の夜景」
listenhub video create \
--prompt "赛博朋克城市夜景" \
--model "happyhorse" \
--resolution "1080p" \
--ratio "16:9" \
--duration 5 \
--no-wait --json
画像から動画(HappyHorse)
「この画像をアニメーション動画にしてください」+画像のパスを指定
listenhub video create \
--prompt "将静态场景转化为流畅动画" \
--model "happyhorse" \
--resolution "1080p" \
--duration 5 \
--first-frame "/path/to/scene.png" \
--no-wait --json
参照画像モード(HappyHorse)
「この 2 枚の画像のスタイルを参考に、動画を生成してください」
listenhub video create \
--prompt "[Image 1]中的角色在[Image 2]的场景中漫步" \
--model "happyhorse" \
--resolution "1080p" \
--ratio "16:9" \
--duration 5 \
--reference-image "/path/to/character.png" \
--reference-image "/path/to/scene.png" \
--no-wait --json
動画編集(HappyHorse)
「この動画の背景を星空に変えてください」
listenhub video create \
--prompt "将背景替换为深邃的星空,保持人物动作不变" \
--model "happyhorse" \
--resolution "1080p" \
--reference-video "/path/to/input.mp4" \
--audio-setting "origin" \
--no-wait --json
SeeDance フレームモード
「開始フレームと終了フレームを使ってトランジションアニメーションを生成してください」
listenhub video create \
--prompt "从白天自然过渡到夜晚" \
--model "doubao-seedance-2-pro" \
--resolution "720p" \
--ratio "16:9" \
--duration 8 \
--first-frame "/path/to/day.png" \
--last-frame "/path/to/night.png" \
--no-wait --json
テキストから動画(PixVerse)
「pixverse で動画を生成してください:海辺の日没のタイムラプス」
listenhub openapi video pixverse generate \
--capability text_to_video \
--model pixverse \
--prompt "海边日落延时,云层快速移动" \
--quality 720p \
--aspect-ratio 16:9 \
--duration 5 \
--no-wait --json
リップシンク(PixVerse、TTS)
「この動画にリップシンクを追加して、人物にこの文章を話させてください」
listenhub openapi video pixverse generate \
--capability lip_sync \
--source-video-id "abc123" \
--pixverse-json '{"tts":{"speakerId":"speaker_01","content":"大家好,欢迎来到本期节目"}}' \
--quality 720p \
--no-wait --json
リップシンク(PixVerse、音声ファイル)
「この音声を使って動画にリップシンクを追加してください」
listenhub openapi video pixverse generate \
--capability lip_sync \
--source-task-id "task_xyz" \
--audio "https://example.com/voice.mp3" \
--quality 720p \
--no-wait --json