mcpField
C
chanjing-avatar

chanjing-avatar

github.com/chanjing-aiクリエイティブ・メディア22107 回インストール6 日前に更新
リポジトリ

chanjing-avatar について

蝉镜 Avatar Open API を使って、リップシンクしたデジタルアバター動画を作成するスキルです。テキストまたは音声を使うワークフロー向けに、メディアのアップロード、タスク作成、状態確認、結果リンク取得用の Python スクリプトを備えています。

主な機能

  1. 01動画と音声素材のアップロード
  2. 02テキストまたは音声駆動のリップシンクタスク作成
  3. 03動画解像度と音声パラメーターの設定
  4. 04タスク状態のポーリングと結果リンク取得
  5. 05タスク完了コールバックへの対応

活用シーン

  1. 01アバター動画にテキスト読み上げのリップシンクを追加
  2. 02既存の音声素材と動画素材を同期
  3. 03複数のリップシンクタスクの進捗確認
  4. 04完了した動画のダウンロードリンク取得

インストール

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

$npx skills add https://github.com/chanjing-ai/chan-skills --skill chanjing-avatar

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

manifest.yaml
scripts/
_auth.py
create_task.py
get_upload_url.py
poll_task.py
upload_file.py

詳細

Chanjing Avatar(リップシンク)

機能の説明

蝉镜 Avatar Open API を呼び出します。音声・動画素材のアップロード、リップシンクタスクの作成、ポーリング、結果リンクの取得を行います。スクリプトは Python の HTTP/アップロードクライアントで、ffmpeg/ffprobe には依存しません。

実行時の依存関係

  • python3 と同じリポジトリ内の scripts/*.py
  • ffmpeg/ffprobe によるゲートなし

環境変数と機械可読な宣言

  • 環境変数のキー名と説明:manifest.yaml(environment セクション)および本文
  • 変数、認証情報、コンプライアンス関連の permissions、clientPermissions、agentPolicy:manifest.yaml

実行コマンド

  • ClawHub(slug はレジストリに準拠):clawhub run chanjing-avatar
  • このリポジトリ:python skills/chanjing-avatar/scripts/create_task.py …(手順は本文の 使用方法 を参照)

登録と審査(単一の信頼できる情報源)

主要な認証情報、アップロード/ダウンロードの境界、ブラウザーの動作などについては、manifest.yaml を参照してください。本記事の 使用方法 以降では API の手順を説明します。

このスキルを使用する場面

ユーザーが、口の動きが同期したリップシンク動画(デジタルアバター動画)の作成を必要としている場合に、このスキルを使用します。

Chanjing Avatar は次の機能をサポートしています。

  • テキストまたは音声によるリップシンク
  • TTS 用の複数のシステム音声
  • 動画解像度のカスタマイズ
  • タスクステータスのポーリングとコールバック

このスキルの使用方法

前提条件:このスキルを実行する前に、必ず chanjing-credentials-guard を通じて AK/SK と Token の検証を完了してください。認証情報と審査項目の照合については manifest.yaml を参照してください。

セキュリティと認証情報(参照)

manifest.yaml の credentials と clientPermissions(ローカルアップロード、結果 URL、ブラウザーの動作を含む)を参照してください。コンプライアンスについては、トップレベルの permissions を参照してください。

複数の API を呼び出す必要があります。すべての API で共通のドメインは「https://open-api.chanjing.cc」です。 すべてのリクエストは json 形式で通信します。 このタスク全体を通して、テキストのエンコードとデコードには UTF-8 を使用してください。

  1. 後続のすべての API 呼び出しに必要な access_token を取得します
  2. ファイル管理 API を使用して動画/音声ファイルをアップロードし、file_id を取得します
  3. これらの file_id を使用して、動画と音声/テキストを指定したリップシンクタスクを作成します
  4. タスク詳細照会 API をポーリングするか、タスクリスト API を使用してステータスを確認します
  5. ステータスが完了になったら、レスポンス内の URL を使用して生成された動画をダウンロードします
AccessToken の取得

~/.chanjing/credentials.json から app_id と secret_key を読み取ります。有効な Token がない場合は、次を呼び出します。

POST /open/v1/access_token
Content-Type: application/json

リクエストボディ(ローカルに設定された app_id、secret_key を使用):

{
  "app_id": "<从 credentials.json 读取>",
  "secret_key": "<从 credentials.json 读取>"
}

レスポンスの例:

{
  "trace_id": "8ff3fcd57b33566048ef28568c6cee96",
  "code": 0,
  "msg": "success",
  "data": {
    "access_token": "1208CuZcV1Vlzj8MxqbO0kd1Wcl4yxwoHl6pYIzvAGoP3DpwmCCa73zmgR5NCrNu",
    "expire_in": 1721289220
  }
}

レスポンスフィールドの説明:

第1階層のフィールド第2階層のフィールド説明
codeレスポンスステータスコード
msgレスポンスメッセージ
dataレスポンスデータ
access_token有効期間は1日です。以前のトークンは無効になります
expire_inトークンの有効期限

レスポンスステータスコードの説明

コード説明
0成功
400パラメーターの形式が無効です
40000パラメーターエラー
50000システム内部エラー
メディアファイルのアップロード(ファイル管理)

リップシンクタスクを作成する前に、ファイル管理 API を使用して動画(および任意の音声)ファイルを必ずアップロードし、file_id を取得してください。

ドキュメント全文はこちらです:ファイル管理。

手順1:アップロード URL の取得
GET /open/v1/common/create_upload_url
access_token: {{access_token}}

クエリパラメーター:

キー例説明
servicelip_sync_video / lip_sync_audioファイルの用途です。駆動用動画には lip_sync_video を、音声駆動の場合は音声に lip_sync_audio を使用します。
name1.mp4拡張子を含む元のファイル名

レスポンスには sign_url、mime_type、file_id が含まれます。sign_url を使用して HTTP PUT でファイルをアップロードし、Content-Type には返された mime_type を設定します。PUT の完了後、ファイルの準備ができるまでファイル詳細 API をポーリングしてください(一定時間待てばよいと仮定しないでください)。返された file_id は、以下の video_file_id/audio_file_id に使用するため保存してください。

ポーリング: access_token を指定して GET /open/v1/common/file_detail?id={{file_id}} を呼び出し、レスポンスの data.status が成功を示すまでポーリングします(例:status === 2)。その後でのみ、タスク作成 API に file_id を使用してください。

リップシンクタスクの作成

リップシンク動画の作成タスクを送信します。後でポーリングするための動画 ID が返されます。

POST /open/v1/video_lip_sync/create
access_token: {{access_token}}
Content-Type: application/json

リクエストボディの例(TTS 駆動):

{
  "video_file_id": "e284db4d95de4220afe78132158156b5",
  "screen_width": 1080,
  "screen_height": 1920,
  "callback": "https://example.com/openapi/callback",
  "model": 0,
  "audio_type": "tts",
  "tts_config": {
    "text": "君不见黄河之水天上来,奔流到海不复回。",
    "audio_man_id": "C-f2429d07554749839849497589199916",
    "speed": 1,
    "pitch": 1
  }
}

リクエストボディの例(音声駆動):

{
  "video_file_id": "e284db4d95de4220afe78132158156b5",
  "screen_width": 1080,
  "screen_height": 1920,
  "model": 0,
  "audio_type": "audio",
  "audio_file_id": "audio_file_id_from_file_management"
}

リクエストフィールドの説明:

パラメーター名型必須説明
video_file_idstringはいFile Management の動画ファイル ID(data.file_id)。mp4、mov、webm に対応
screen_widthintいいえ画面の幅。デフォルトは 1080
screen_heightintいいえ画面の高さ。デフォルトは 1920
backwayintいいえ再生終了時の再生順:1-通常、2-逆再生。デフォルトは 1
drive_modestringいいえ駆動モード:""-通常、"random"-ランダムフレーム。デフォルトは ""
callbackstringいいえ非同期通知用のコールバック URL
modelintいいえモデルのバージョン:0-基本、1-高品質。デフォルトは 0
audio_typestringいいえ音声の種類:"tts"-テキスト駆動、"audio"-音声駆動。デフォルトは "tts"
tts_configobjectはい(tts の場合)audio_type="tts" の場合の TTS 設定
tts_config.textstringはい(tts の場合)合成するテキスト
tts_config.audio_man_idstringはい(tts の場合)音声 ID
tts_config.speednumberいいえ話速:0.5~2。デフォルトは 1
tts_config.pitchnumberいいえピッチ。デフォルトは 1
audio_file_idstringはい(audio の場合)audio_type="audio" の場合の File Management の音声ファイル ID(data.file_id)。mp3、m4a、wav に対応
volumeintいいえ音量:1~100。デフォルトは 100

レスポンスの例:

{
  "trace_id": "8d10659438827bd4d59eaa2696f9d391",
  "code": 0,
  "msg": "success",
  "data": "9499ed79995c4bdb95f0d66ca84419fd"
}

レスポンスフィールドの説明:

フィールド説明
codeレスポンスのステータスコード
msgレスポンスメッセージ
data後続のポーリングに使用する動画 ID
タスクリストの取得

リップシンクタスクの一覧を取得します。

POST /open/v1/video_lip_sync/list
access_token: {{access_token}}
Content-Type: application/json

リクエストボディ:

{
  "page": 1,
  "page_size": 10
}

リクエストフィールドの説明:

パラメーター型必須説明
pageintいいえページ番号。デフォルトは 1
page_sizeintいいえページサイズ。デフォルトは 10

レスポンスの例:

{
  "trace_id": "8d10659438827bd4d59eaa2696f9d391",
  "code": 0,
  "msg": "success",
  "data": {
    "list": [
      {
        "id": "9499ed79995c4bdb95f0d66ca84419fd",
        "status": 20,
        "progress": 100,
        "msg": "success",
        "video_url": "https://res.chanjing.cc/xxx/lip-sync/9499ed79995c4bdb95f0d66ca84419fd.mp4",
        "preview_url": "https://res.chanjing.cc/xxx/lip-sync/9499ed79995c4bdb95f0d66ca84419fd.jpg",
        "duration": 300,
        "create_time": 1738636800
      }
    ],
    "page_info": {
      "page": 1,
      "size": 10,
      "total_count": 1,
      "total_page": 1
    }
  }
}

レスポンスフィールドの説明:

第 1 レベルのフィールド第 2 レベルのフィールド説明
codeレスポンスのステータスコード
msgレスポンスメッセージ
dataレスポンスデータ
listタスクリスト
id:動画 ID
status:タスクのステータス(0-保留中、10-生成中、20-成功、30-失敗)
progress:進行状況 0~100
msg:タスクメッセージ
video_url:動画のダウンロード URL
preview_url:カバー画像の URL
duration:動画の長さ(ミリ秒)
create_time:作成時刻(Unix タイムスタンプ)
page_infoページネーション情報
タスク詳細の取得

タスクが完了するまで、次の API をポーリングしてステータスを確認します。

GET /open/v1/video_lip_sync/detail
access_token: {{access_token}}

クエリパラメーター:

パラメーター説明
id動画 ID

例:GET /open/v1/video_lip_sync/detail?id=9499ed79995c4bdb95f0d66ca84419fd

レスポンスの例:

{
  "trace_id": "8d10659438827bd4d59eaa2696f9d391",
  "code": 0,
  "msg": "success",
  "data": {
    "id": "9499ed79995c4bdb95f0d66ca84419fd",
    "status": 20,
    "progress": 100,
    "msg": "success",
    "video_url": "https://res.chanjing.cc/xxx/lip-sync/9499ed79995c4bdb95f0d66ca84419fd.mp4",
    "preview_url": "https://res.chanjing.cc/xxx/lip-sync/9499ed79995c4bdb95f0d66ca84419fd.jpg",
    "duration": 300,
    "create_time": 1738636800
  }
}

レスポンスフィールドの説明:

第 1 レベルのフィールド第 2 レベルのフィールド説明
codeレスポンスのステータスコード
msgレスポンスメッセージ
dataレスポンスデータ
id動画 ID
statusタスクのステータス:0-保留中、10-生成中、20-成功、30-失敗
progress進行状況 0~100
msgタスクメッセージ
video_url動画のダウンロード URL
preview_urlカバー画像の URL
duration動画の長さ(ミリ秒)
create_time作成時刻(Unix タイムスタンプ)
コールバック通知

コールバック URL が指定されている場合、タスクの完了時にシステムから POST リクエストが送信されます。

{
  "trace_id": "8d10659438827bd4d59eaa2696f9d391",
  "code": 0,
  "msg": "success",
  "data": {
    "id": "9499ed79995c4bdb95f0d66ca84419fd",
    "status": 20,
    "progress": 100,
    "msg": "success",
    "video_url": "https://res.chanjing.cc/xxx/lip-sync/9499ed79995c4bdb95f0d66ca84419fd.mp4",
    "preview_url": "https://res.chanjing.cc/xxx/lip-sync/9499ed79995c4bdb95f0d66ca84419fd.jpg",
    "duration": 300,
    "create_time": 1738636800
  }
}

スクリプト

この Skill が提供するスクリプト(skills/chanjing-avatar/scripts/)は、chanjing-credentials-guard と同じ設定ファイル(~/.chanjing/credentials.json)を使用して Token を取得します。

スクリプト説明
get_upload_url.pyアップロードリンクを取得し、sign_url、mime_type、file_id を出力します
upload_file.pyローカルファイルをアップロードし、準備が完了するまで file_detail をポーリングした後、file_id を出力します
create_task.pyリップシンクタスク(TTS または音声駆動)を作成し、動画タスク ID を出力します
poll_task.pyタスクが完了するまでポーリングし、video_url を出力します

例(プロジェクトルートまたは skill ディレクトリで実行します):

# 1. 上传驱动视频,得到 video_file_id
VIDEO_FILE_ID=$(python skills/chanjing-avatar/scripts/upload_file.py --service lip_sync_video --file ./my_video.mp4)

# 2. 创建 TTS 对口型任务(需先通过 list_common_audio 获取 audio_man_id)
TASK_ID=$(python skills/chanjing-avatar/scripts/create_task.py \
  --video-file-id "$VIDEO_FILE_ID" \
  --text "君不见黄河之水天上来" \
  --audio-man-id "C-f2429d07554749839849497589199916")

# 3. 轮询直到完成,得到视频下载链接
python skills/chanjing-avatar/scripts/poll_task.py --id "$TASK_ID"

音声駆動の場合:まず音声をアップロードして audio_file_id を取得し、次に create_task.py --video-file-id <id> --audio-file-id <audio_file_id> を実行します。

レスポンスステータスコードの説明

Code説明
0レスポンス成功
10400AccessToken の検証に失敗しました
40000パラメーターエラー
40001RPM/QPS の上限を超えています
50000システム内部エラー

コメント