mcpField
T
tencent-hunyuanvideo

tencent-hunyuanvideo

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

tencent-hunyuanvideo について

Tencent HunyuanVideoをTokenHub、旧Tencent Cloud API、ローカルのオープンウェイトから選び、運用するためのワークフロースキルです。動画生成を案内し、承認手順や契約の違い、費用・素材・モデルファイルの安全な扱いを整理します。

主な機能

  1. 013種類の利用形態を区別
  2. 02テキスト・画像からの動画生成を計画
  3. 03クラウドへの送信と状態確認を説明
  4. 04ローカルモデルのセットアップを案内
  5. 05承認と素材管理の安全策を設定

活用シーン

  1. 01マネージド動画生成ジョブの計画
  2. 02旧Tencent Cloud連携の保守
  3. 03ローカルHunyuanVideo-1.5の構築
  4. 04生成前の費用と素材管理の確認

インストール

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

$npx skills add https://github.com/calesthio/generative-media-skills --skill tencent-hunyuanvideo

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

同梱ファイルEVAL.md

詳細

Tencent HunyuanVideo

操作を行う前に、リクエストを次の3つの契約のいずれかに分類してください。

  1. TokenHub hy-video-1.5 — 新規統合向けの、現在のマネージド型 Tencent Cloud T2V/I2V インターフェース。
  2. レガシー Tencent Cloud vclm API 3.0 — 既存顧客向けに維持されている、旧式の TC3 署名付き SubmitHunyuanToVideoJob インターフェース。営業体制とモデル機能は TokenHub へ移行中です。
  3. HunyuanVideo-1.5 オープンウェイト — 公式の 8.3B ローカル T2V/I2V リポジトリ、チェックポイント、依存関係、インフラストラクチャ、コミュニティライセンス。

マネージドモデルが公開チェックポイントとバイト単位で同一だと推測しないでください。クラウド出力にオープンウェイトのライセンスを適用したり、ダウンロードしたウェイトに Tencent Cloud の規約を適用したりしないでください。

まず実行前の確認を行う

有料リクエスト、アセットのアップロード、モデルのダウンロード、環境のインストール、トレーニングジョブの実行前に、次の内容を明示してください。

  • 対象のサーフェス、正確なモデル/操作またはチェックポイント系列、リージョン/地域、モード、入力、目標の解像度/長さ、音声の計画、開示事項、見積もり料金またはインフラストラクチャの規模、出力先パス、QA ゲート。
  • 明示的な承認を求めてください。ホスト型の作業では金額の上限を必須とし、ローカルの作業では承認済みのディスク/ネットワーク/GPU の使用範囲とライセンスの受諾を必須とします。
  • 提供するすべての例は、デフォルトで計画のみを実行してください。従量課金の有効化、クレジット/同時実行枠の購入、約 372 GB に及ぶ現行モデルリポジトリのダウンロード、プロンプト書き換えサービスへの連絡を、明示せずに実行しないでください。
  • 長時間の処理を始める前に、プロバイダーのリクエスト/ジョブ ID、またはローカルのリビジョンハッシュを保存してください。ジョブ ID が返されないまま送信がタイムアウトした場合は状態不明です。どちらのホスト型サーフェスにも冪等性キーの記載がないため、盲目的に再送信しないでください。

正しい系列を選ぶ

系列用途主な境界
TokenHub HY-Video-1.5テキストまたは画像から 5 秒の動画を生成するマネージドモデル独自の /v1/api/video/submit および /query を使用。モデルは hy-video-1.5。現行のアクションスキーマでは 720p のみ公開
レガシー vclm Hunyuan既存の Tencent Cloud 統合TC3-HMAC-SHA256、API バージョン 2024-05-23、リージョン ap-guangzhou。モデルフィールドではなくアクション名を使用
HunyuanVideo-1.5現行の軽量ローカル基盤モデル8.3B。480p/720p の基本生成に対応。720p/1080p への SR は別途実行。T2V/I2V
HunyuanVideo (original)レガシーのローカル 13B 基盤モデルチェックポイント/コードは別。公式テストでは 544×960×129f で約 45 GB、720×1280×129f で 60 GB の VRAM が必要
HunyuanVideo-Avatar音声駆動の人物アニメーションリポジトリ/モデルは別。HunyuanVideo-1.5 の音声スイッチではありません
HunyuanCustom被写体のカスタマイズと、画像/音声/動画を条件とする別個のワークフローリポジトリ/チェックポイントが別途必要。ライセンスを確認
HunyuanVideo-Foley動画/テキストから同期音声を生成動画から音声を生成する別モデル。映像は生成しません

Tencent Cloud が掲載している YT-Video-2.0、YT-Video-FX、YT-Video-HumanActor、Kling、Vidu のエンドポイントを HunyuanVideo として振り分けないでください。これらは同じカタログに掲載されている、Tencent Youtu またはサードパーティの別製品です。

新たにホストする作業で TokenHub を運用する

2026-07-10 に確認した最新情報:

  • 国内のベース URL は https://tokenhub.tencentmaas.com、シンガポール/グローバルのベース URL は https://tokenhub-intl.tencentmaas.com です。Tencent によると、呼び出しはサービスで有効になっているリージョン/サイトをまたいで実行できません。カタログから利用可能だと推測するのではなく、選択したアカウントとサイトで hy-video-1.5 が有効になっていることを確認してください。
  • Authorization: Bearer <API key> で認証します。動画エンドポイントは POST /v1/api/video/submit と POST /v1/api/video/query です。OpenAI 互換と説明されていますが、Chat Completions ではなく、動画用のカスタムパスです。
  • 送信時は model: "hy-video-1.5" を指定し、クエリ時は同じモデルと返された id を指定します。Hunyuan アクションから引き継がれたフィールドには、小文字のスネークケースを使用します。
  • prompt は必須で、中国語のポジティブプロンプトとして文書化されており、前後の空白を除いて UTF-8 で 200 文字までです。
  • オプションの image には url または base64 を指定できます。URL 入力は最大 10 MB、base64 は最大 8 MB です。形式は JPG/JPEG、PNG、WebP、BMP、TIFF です。縦横それぞれ 50~5000 ピクセル、アスペクト比は 1:4~4:1 である必要があります。
  • リンク先のアクションスキーマが現在受け付けるのは resolution: "720p" のみで、デフォルトは 720p です。料金の説明では、結果の長さは 5 秒固定とされています。duration、aspect、seed、negative prompt、camera-control、FPS、codec、audio のフィールドは公開されていません。
  • 送信例は id、request_id、status: "queued" を返します。クエリ例は status: "completed"、progress、data.url を返します。一方、基盤となる旧 describe 契約では WAIT/RUN/FAIL/DONE が文書化されています。アダプターとステータス表記体系は分けてください。
  • 基盤となる結果 URL の有効期間は 24 時間と文書化されています。速やかにダウンロードし、ハッシュを計算して、ローカルで検証してください。
  • 現在の TokenHub モデル一覧では、HY-Video-1.5 のデフォルト同時実行数は 5 です。旧 vclm では、アクティブなジョブは 1 件、送信リクエストは 30 件/秒、クエリリクエストは 20 件/秒です。リクエストレートはアクティブなジョブの同時実行数ではありません。

現在の TokenHub 料金ページでは、HY-Video-1.5 の呼び出し 1 回につき 1.5 クレジット、1 クレジットあたり 1.0 CNY とされています。そのため、日付時点のリスト価格に基づく見積もりは、5 秒のジョブが正常に完了するごとに 1.5 CNY です。割引、プリペイドクレジット、無料枠、税金により、請求額は変わる場合があります。Tencent によると、生成に失敗したジョブではクレジットは消費されません。送信前に料金と請求状況を再取得してください。TokenHub の一部の内訳は T+1 で反映されるため、コンソールをリアルタイムのハードストップとして扱わないでください。旧 vclm の請求ページに記載された 1.2 CNY のクレジット価格は、その旧サービスに適用されるものであり、TokenHub の料金計算には使用しないでください。

Tencent の旧料金表には 1080p の SKU が記載されていますが、現在の SubmitHunyuanToVideoJob スキーマで指定できるのは 720p のみです。現在の TokenHub スキーマとアカウントの利用資格の両方で確認できるまで、1080p を送信しないでください。

AI 生成の表示を有効にしておく

logo_add のデフォルト値は 1 で、「AI generated」マークが追加されます。これを 0 に設定するには、顧客が目に見えるラベルを自ら付与することについて、コンソールでの承認が必要です。Tencent の FAQ では、ユーザーは法令に準拠した AI 生成ラベルを付与する必要があり、視聴者を誤解させてはならないとされています。審査済みの代替ラベル運用が承認されない限り、デフォルトのマークを維持してください。見た目だけを理由に無効にしてはなりません。

まずドライランを行う TokenHub クライアントを使う

この標準ライブラリのみを使った完全なサンプルは、デフォルトで720pのジョブを計画します。送信するのは、--execute、正確に一致するTENCENT_APPROVED_DIGEST、およびTENCENT_APPROVE_MAX_CNY >= 1.5がそろった場合のみです。許可された唯一のPOSTの前に永続的な申請を作成し、送信が曖昧な場合は再試行せず、ジョブIDが保存された後にのみ再開し、クエリのポーリングと結果のダウンロードに上限を設け、上書きを拒否し、成果物のハッシュを計算してMP4を検証します。プロバイダーの署名付きダウンロードホストとして、レビュー済みの--result-host-suffixを1つ以上指定してください。実行時に、制限のない結果ホストポリシーは拒否されます。

#!/usr/bin/env python3
import argparse, hashlib, ipaddress, json, os, random, socket, subprocess, tempfile, time
from pathlib import Path
from urllib.error import HTTPError, URLError
from urllib.parse import urljoin, urlparse
from urllib.request import HTTPRedirectHandler, Request, build_opener, urlopen

BASES = {
    "cn": "https://tokenhub.tencentmaas.com",
    "intl": "https://tokenhub-intl.tencentmaas.com",
}
ESTIMATE_CNY = 1.5  # verified 2026-07-10; re-check before use
MAX_JSON = 1_000_000
MAX_VIDEO = 2_000_000_000

class RetryableQuery(Exception):
    def __init__(self, delay, message): self.delay, self.message = delay, message

def read_json(response):
    raw = response.read(MAX_JSON + 1)
    if len(raw) > MAX_JSON: raise RuntimeError("response JSON exceeds 1 MB")
    return json.loads(raw.decode("utf-8"))

def request_json(req, timeout=45, retryable_query=False):
    try:
        with urlopen(req, timeout=timeout) as r:
            return read_json(r)
    except HTTPError as e:
        if retryable_query and e.code in (429, 500, 502, 503, 504):
            try: delay = min(30.0, max(1.0, float(e.headers.get("Retry-After", "5"))))
            except ValueError: delay = 5.0
            raise RetryableQuery(delay, f"query HTTP {e.code}")
        raise RuntimeError(f"provider HTTP {e.code}; inspect restricted provider logs")
    except URLError as e:
        if retryable_query:
            raise RetryableQuery(5.0, "query transport failure")
        raise RuntimeError("transport failure; submission state may be unknown")

def write_state(path, value, create=False):
    data = (json.dumps(value, ensure_ascii=True, indent=2) + "\n").encode()
    if create:
        with path.open("xb") as f:
            f.write(data); f.flush(); os.fsync(f.fileno())
        return
    fd, temp_name = tempfile.mkstemp(prefix=path.name + ".", dir=path.parent)
    try:
        with os.fdopen(fd, "wb") as f:
            f.write(data); f.flush(); os.fsync(f.fileno())
        os.replace(temp_name, path)
    finally:
        try: os.unlink(temp_name)
        except FileNotFoundError: pass

def approved_https(url, suffixes):
    u = urlparse(url)
    host = (u.hostname or "").rstrip(".").lower()
    if u.scheme != "https" or not host or u.username or u.password or u.port not in (None, 443):
        raise RuntimeError("result URL must be credential-free HTTPS on port 443")
    if not any(host == s or host.endswith("." + s) for s in suffixes):
        raise RuntimeError("result host is outside the approved suffixes")
    for item in socket.getaddrinfo(host, 443, type=socket.SOCK_STREAM):
        if not ipaddress.ip_address(item[4][0]).is_global:
            raise RuntimeError("result host resolved to a non-public address")
    return url

class NoRedirect(HTTPRedirectHandler):
    def redirect_request(self, req, fp, code, msg, headers, newurl): return None

def download(url, suffixes, part):
    opener = build_opener(NoRedirect)
    for _ in range(4):
        approved_https(url, suffixes)
        try:
            response = opener.open(Request(url, headers={"Accept":"video/*"}), timeout=120)
        except HTTPError as e:
            if e.code in (301, 302, 303, 307, 308) and e.headers.get("Location"):
                url = urljoin(url, e.headers["Location"]); continue
            raise RuntimeError(f"download HTTP {e.code}")
        with response, part.open("xb") as f:
            length = response.headers.get("Content-Length")
            if length and int(length) > MAX_VIDEO: raise RuntimeError("output exceeds 2 GB safety cap")
            content_type = response.headers.get_content_type()
            if not (content_type.startswith("video/") or content_type == "application/octet-stream"):
                raise RuntimeError(f"unexpected result content type: {content_type}")
            digest, total = hashlib.sha256(), 0
            while True:
                chunk = response.read(1024 * 1024)
                if not chunk: break
                total += len(chunk)
                if total > MAX_VIDEO: raise RuntimeError("output exceeds 2 GB safety cap")
                digest.update(chunk); f.write(chunk)
            f.flush(); os.fsync(f.fileno())
        return digest.hexdigest(), total
    raise RuntimeError("too many download redirects")

def main():
    p = argparse.ArgumentParser()
    p.add_argument("--prompt", required=True)
    p.add_argument("--site", choices=BASES, default="cn")
    p.add_argument("--image-url")
    p.add_argument("--output", type=Path, default=Path("hy-video-1.5.mp4"))
    p.add_argument("--result-host-suffix", action="append", default=[])
    p.add_argument("--max-wait", type=int, default=1800)
    p.add_argument("--execute", action="store_true")
    a = p.parse_args()
    prompt = a.prompt.strip()
    if not prompt or len(prompt) > 200: p.error("prompt must contain 1–200 characters")
    payload = {"model":"hy-video-1.5","prompt":prompt,"resolution":"720p","logo_add":1}
    if a.image_url:
        u = urlparse(a.image_url)
        if u.scheme != "https" or not u.hostname or u.username or u.password:
            p.error("image URL must be credential-free HTTPS")
        payload["image"] = {"url": a.image_url}
    output = a.output.resolve()
    suffixes = sorted({s.strip(".").lower() for s in a.result_host_suffix if s.strip(".")})
    manifest = {
        "provider": "Tencent TokenHub", "site": a.site,
        "submit": BASES[a.site] + "/v1/api/video/submit",
        "query": BASES[a.site] + "/v1/api/video/query",
        "payload": payload,
        "estimated_cny": ESTIMATE_CNY,
        "price_verified": "2026-07-10", "maximum_submit_calls": 1,
        "submission_retry": "never after transmission", "output": str(output),
        "result_host_suffixes": suffixes,
        "note": "confirm account/site entitlement and current price before execute",
    }
    digest = hashlib.sha256(json.dumps(manifest, sort_keys=True, separators=(",", ":")).encode()).hexdigest()
    plan = {"approval_digest": digest, **manifest}
    print(json.dumps(plan, ensure_ascii=True, indent=2))
    if not a.execute: return
    if not suffixes: raise SystemExit("at least one reviewed --result-host-suffix is required")
    if output.exists(): raise SystemExit(f"refusing overwrite: {output}")
    if not output.parent.is_dir(): raise SystemExit("output parent must already exist")
    if os.environ.get("TENCENT_APPROVED_DIGEST") != digest:
        raise SystemExit("TENCENT_APPROVED_DIGEST must exactly match this dry-run plan")
    approved = float(os.environ.get("TENCENT_APPROVE_MAX_CNY", "0"))
    if approved < ESTIMATE_CNY: raise SystemExit("TENCENT_APPROVE_MAX_CNY must be at least 1.5")
    key = os.environ.get("TENCENT_TOKENHUB_API_KEY")
    if not key: raise SystemExit("TENCENT_TOKENHUB_API_KEY is required")
    state_path = output.with_suffix(output.suffix + ".job.json")
    if state_path.exists():
        saved = json.loads(state_path.read_text(encoding="utf-8"))
        if saved.get("approval_digest") != digest: raise SystemExit("state belongs to a different plan")
        job_id = saved.get("id")
        if not job_id: raise SystemExit("submission is CLAIMED/UNKNOWN; reconcile with Tencent, never resubmit")
    else:
        saved = {"approval_digest":digest,"status":"CLAIMED","site":a.site,"id":None}
        write_state(state_path, saved, create=True)  # durable claim before paid POST
        headers = {"Authorization":f"Bearer {key}","Content-Type":"application/json"}
        submit = Request(manifest["submit"], data=json.dumps(payload).encode(), method="POST", headers=headers)
        try: job = request_json(submit)
        except Exception:
            saved["status"] = "UNKNOWN_AFTER_SUBMIT"; write_state(state_path, saved)
            raise SystemExit("submit outcome unknown; reconcile with Tencent, never resubmit")
        job_id = job.get("id")
        if not job_id:
            saved["status"] = "UNKNOWN_NO_JOB_ID"; write_state(state_path, saved)
            raise SystemExit("submit returned no job id; reconcile with Tencent, never resubmit")
        saved.update({"status":"SUBMITTED","id":str(job_id),"request_id":job.get("request_id")})
        write_state(state_path, saved)
    headers = {"Authorization":f"Bearer {key}","Content-Type":"application/json"}
    deadline = time.monotonic() + a.max_wait
    while time.monotonic() < deadline:
        time.sleep(5 + random.random())
        q = Request(manifest["query"], data=json.dumps({"model":"hy-video-1.5","id":job_id}).encode(), method="POST", headers=headers)
        try: state = request_json(q, retryable_query=True)
        except RetryableQuery as e:
            print(e.message); time.sleep(e.delay + random.random()); continue
        status = str(state.get("status", "")).lower()
        if status == "completed": break
        if status in ("failed", "error", "cancelled"):
            saved["status"] = status.upper(); write_state(state_path, saved)
            raise SystemExit(f"provider terminal status: {status}; inspect restricted provider logs")
    else: raise SystemExit(f"poll timeout; resume id {job_id}; do not resubmit")
    result_url = (state.get("data") or {}).get("url")
    if not result_url: raise SystemExit("completed job has no result URL")
    part = output.with_suffix(output.suffix + ".part")
    if part.exists(): raise SystemExit(f"refusing overwrite: {part}")
    sha256, size = download(result_url, suffixes, part)
    try:
        subprocess.run(["ffprobe","-v","error","-show_streams","-show_format",str(part)], check=True)
        subprocess.run(["ffmpeg","-v","error","-i",str(part),"-f","null","-"], check=True)
    except Exception:
        saved["status"] = "VALIDATION_FAILED"; write_state(state_path, saved); raise
    part.replace(output)
    saved.update({"status":"DELIVERED","sha256":sha256,"bytes":size})
    write_state(state_path, saved)
    print(json.dumps({"output":str(output),"sha256":sha256,"bytes":size}))

if __name__ == "__main__": main()

プロジェクト専用のAPIキーを用意し、ソース、コマンド履歴、状態ファイル、ログには記載しないでください。TokenHubのリクエストログを有効にする場合は、生のプロンプト/入力/出力が意図的に必要な場合を除き、監査用メタデータのみを選択してください。Tencentによると、呼び出しログにはこれらすべてが含まれる可能性があり、別途CLSの費用と保持期間が発生します。ログへのアクセスとライフサイクルを明示的に設定してください。

必要な場合に限り、レガシーアダプターを維持する

レガシーAPIでは、https://vclm.tencentcloudapi.com、アクションSubmitHunyuanToVideoJobまたはDescribeHunyuanToVideoJob、バージョン2024-05-23を使用し、現在ドキュメントに記載されているリージョンはap-guangzhouのみです。短期間有効な認証情報と、CAMの操作レベル権限を使用し、Tencent Cloud SDK/TC3-HMAC-SHA256を利用してください。TokenHubのBearerキー、小文字のフィールド、トップレベルのレスポンス、ステータスをレガシーアダプターに変換しないでください。

新しいモデルの販売はTokenHubへ移行中です。旧プラットフォームは、既存の購入は一時的に引き続き利用できるものの、モデル機能の追加と新規購入のサポートを終了するとしています。Tencentから別のサポート対象経路を提示されない限り、新しい連携はTokenHub向けに構築してください。

クラウドアセットとガバナンスを管理する

  • アップロード前に、画像の寸法、形式、サイズ、向き、権利、同意を確認してください。短期間のみ有効で、公開範囲を最小限にしたCOS署名付きURLを優先し、ログに記録しないでください。Base64を使えば取得URLは不要になりますが、リクエスト/ログのデータ量は増加します。
  • 現行のTokenHubアクセス表では、広州/中国本土のリソーススケジューリングとシンガポール/グローバルのスケジューリングが区別され、サイト間の呼び出しは禁止されています。これだけで、契約上のデータレジデンシー、保持期間、トレーニングでの利用が確立されるわけではありません。規制対象の情報や機密情報を扱う場合は、現行のTokenHubプライバシーポリシー、サービス契約/DPA、サブプロセッサーおよび削除に関する条項を入手してください。
  • 24時間の結果URLは利用可能な期間を示すものであり、プロンプト/入力/出力データが削除された証明ではありません。結果をダウンロードしてハッシュを計算し、ライフサイクルを明示したうえで顧客が管理するストレージに移してください。
  • AI生成物であることの表示、同意、肖像、知的財産、ブランドに関する確認を維持してください。TencentのFAQによると、出力はユーザー間で類似する可能性があります。独占性を約束しないでください。
  • 国際SLAでは、計算方法と除外条件に基づくサービス可用性99.5%が説明されています。これをジョブ単位の成功率、レイテンシ、キュー、モデル品質の保証として解釈しないでください。

HunyuanVideo-1.5をローカルで実行する

公式のTencent-Hunyuan/HunyuanVideo-1.5リポジトリとtencent/HunyuanVideo-1.5モデルリポジトリを使用してください。変更不可能なGitとHugging Faceのリビジョンを固定してください。現在のHFのmainツリーは全体で約372 GBです。以前にレビューされたリビジョンは約338 GBだったため、固定したリビジョンのツリーを確認し、ダウンロード前に正確なファイルマニフェストを承認してください。

互換性のあるアーティファクトを選択する
タスクベースアーティファクト高速化の制約
480p T2V480P-T2V または 480P-T2V-cfg-distillCFG 蒸留済みでも 50 ステップが必要です。CFG スケールは 1 です
480p I2V480P-I2V、CFG-distill、または I2V step-distillStep-distill は 480p I2V 専用です。8 または 12 ステップを使用してください(4 ステップでは品質が低下します)
720p T2V720P-T2V現在のリポジトリの表に記載された 720p T2V CFG/sparse 蒸留済みアーティファクトは、まだ「近日公開」でした。存在しないものを作り上げないでください
720p I2V720P-I2V、CFG-distill、または sparse CFG-distillSparse attention は 720p/H シリーズ専用で、一致するチェックポイントが必要です
480→720 または 720→1080SR 専用の step-distilled transformer超解像は生成後に行います。1080p をネイティブのベースチェックポイントと呼ばないでください

全体の構成には、テキスト/ビジョンエンコーダーも必要です。現在、公式手順では MLLM として Qwen2.5-VL-7B-Instruct、Google ByT5-small と ModelScope Glyph-SDXL-v2、ならびにゲート付き FLUX.1-Redux-dev の SigLIP コンポーネントを推奨しています。これらにはそれぞれ異なるライセンスやアクセス条件があります。それぞれのライセンスと条件を確認し、バージョンを固定してください。Hunyuan のライセンスがこれらにも適用されると決めつけないでください。

ハードウェア要件は正確に見積もる

公式の推論に必要な最低構成は、NVIDIA CUDA、Linux、Python 3.10 以降、そしてモデルオフロード使用時の 14 GB VRAM です。これは、すべての解像度/長さ/アクセラレーターでの動作を保証するものではなく、トレーニング要件でもありません。オフロードによりシステム RAM と転送時間への負荷が増します。グループオフロードを重ねて使用すると、RAM 使用量が大幅に増える場合があります。小規模な受け入れテストを実行し、実際の GPU/RAM/ディスクのピーク使用量とレイテンシを記録してください。

ネイティブ CLI のデフォルトは 121 フレームで、公式 Diffusers の例では 24 fps で出力します(約 5 秒)。3D VAE と互換性のあるフレーム数(4n+1)を使用し、241 フレームなどの長いシーケンスは、必要なリソースを確保する前に検証してください。ベース生成でサポートされるのは 480p または 720p です。--sr は別個のアップスケーリング処理で、現在の CLI ではデフォルトで有効です。

高速化の選択肢は相互に置き換えられません。

  • 標準チェックポイントと CFG 蒸留済みチェックポイントでは、50 ステップを使用します。CFG 蒸留で変わるのはガイダンスの計算方法であり、ステップ数ではありません。
  • 8 または 12 ステップを推奨するのは、480p I2V の step-distilled チェックポイントのみです。
  • Sparse attention には、H シリーズ GPU、720p 対応アーティファクト、および Flex-Block-Attention が必要です。有効にすると、CFG 蒸留済みの動作が自動的に選択されます。
  • SageAttention を有効にすると、Flex-Block-Attention は自動的に無効になります。Sage と sparse の両方のパスを有効にして、両方が同時に機能すると期待しないでください。
  • FP8 GEMM では、sgl-kernel==0.3.18 と、文書化された量子化タイプを指定した --use_fp8_gemm を使用します。本番環境で使用する前に、ハードウェア/カーネル/チェックポイントの互換性と品質をテストしてください。
  • DeepCache/TeaCache/TaylorCache によって速度が向上する場合がありますが、計算パスが変わります。キャッシュを使わないゴールデンシードと比較してベンチマークを行い、キャッシュの設定を正確に記録してください。

HunyuanVideo-1.5 は、T2V/I2V パイプラインの一部として、サポート対象の音声トラックを生成しません。音声は別途計画してください。動画から音声を生成するワークフローには、別途ライセンスが適用される HunyuanVideo-Foley を使用してください。音声で駆動する人物の生成には、HunyuanVideo-Avatar/HumanActor を使用してください。

ダウンロード前にメタデータを監査する
git ls-remote https://github.com/Tencent-Hunyuan/HunyuanVideo-1.5.git HEAD
curl -fsS https://huggingface.co/api/models/tencent/HunyuanVideo-1.5 > hunyuanvideo-1.5-metadata.json
# Review territory, license, files, sizes, dependencies, disk, GPU, and approved revisions.

明示的な承認を得た後、変更されないリビジョンと、レビュー済みのマニフェストを使用してください。この完全な例は、公式の広範なダウンロード手順を示しています。現在のツリーは、エンコーダー、環境、出力を除いて約 372 GB で、リビジョンによってサイズが変わる場合があります。

git clone https://github.com/Tencent-Hunyuan/HunyuanVideo-1.5.git
cd HunyuanVideo-1.5
git checkout <reviewed-git-commit>
python3 -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
hf download tencent/HunyuanVideo-1.5 --revision <reviewed-hf-commit> --local-dir ./ckpts
hf download Qwen/Qwen2.5-VL-7B-Instruct --revision <reviewed-qwen-commit> --local-dir ./ckpts/text_encoder/llm
hf download google/byt5-small --revision <reviewed-byt5-commit> --local-dir ./ckpts/text_encoder/byt5-small
modelscope download --model AI-ModelScope/Glyph-SDXL-v2 --revision <reviewed-glyph-revision> --local_dir ./ckpts/text_encoder/Glyph-SDXL-v2
hf download black-forest-labs/FLUX.1-Redux-dev --revision <reviewed-flux-commit> --local-dir ./ckpts/vision_encoder/siglip
find ckpts -type f -not -path '*/.cache/*' -print0 | sort -z | xargs -0 -r sha256sum > CHECKPOINTS.sha256
test ! -e outputs/t2v-480.mp4
torchrun --nproc_per_node=1 generate.py \
  --model_path ./ckpts --image_path none --resolution 480p --aspect_ratio 16:9 \
  --video_length 121 --num_inference_steps 50 --seed 42 \
  --prompt 'A slow eye-level dolly follows a red tram through light rain; wet rails reflect warm windows, pedestrians remain distant, and the tram stops smoothly under a station clock, continuous realistic shot.' \
  --negative_prompt 'flicker, warped rails, duplicate tram, abrupt cut, illegible text' \
  --rewrite false --cfg_distilled true --sr false --output_path outputs/t2v-480.mp4
ffprobe -v error -show_streams -show_format outputs/t2v-480.mp4
ffmpeg -v error -i outputs/t2v-480.mp4 -f null -

プレースホルダーのリビジョンは、レビュー済みの変更されない ID に置き換える必要があります。この公式レイアウトの例では、HF からの広範なダウンロードを意図的に行っています。本番環境では、互換性のあるタスク/SR コンポーネントのみを取得できるよう、レビュー済みの --include マニフェストを使用してください。信頼できないパスに対してシェルの find を使用しないでください。ワークスペースを固定し、生成されたマニフェストで必要な項目が網羅されていることを確認してください。

ローカル/オフライン環境でのプライバシー保護のため、プロンプトの書き換えを無効にしてください。ネイティブリポジトリではデフォルトで書き換えが有効ですが、互換性のある vLLM エンドポイントがない場合はスキップされます。書き換えを意図的に有効にする場合は、レビュー済みのセルフホスト可能なエンドポイントを使用し、元のプロンプトと書き換え後のプロンプトを記録してください。また、書き換えモデルも、別のデータ処理者であり、バージョン管理が必要な依存関係として扱ってください。

デプロイ前に現地のライセンスを適用する

HunyuanVideo-1.5 は Apache-2.0 ライセンスでも OSI ライセンスでもありません。2025-11-21 のリリースに付属する Tencent Hunyuan Community License Agreement が適用されます。実際に固定されているライセンスを弁護士に確認してください。現在の重要な条件は次のとおりです。

  • ライセンス対象地域には、欧州連合、英国、韓国は含まれません。本契約では、対象地域外での使用、複製、変更、配布、表示、さらには出力もライセンスされていません。別途 Tencent のライセンスを取得せずに、オープンウェイトをデプロイしたり、その出力を対象地域で提供したりしないでください。
  • バージョンのリリース前月に、製品/サービスの月間アクティブユーザー数が 1 億人を超えていたライセンシーは、別途ライセンスを申請する必要があり、Tencent の承認を受けるまでライセンスの許諾は得られません。
  • モデル派生物には、変更、蒸留、およびウェイト、中間表現、合成出力、または類似のパターン転移を用いて、同様の動作をするように訓練されたモデルが含まれます。出力だけではモデル派生物に該当しません。
  • 配布およびホスト型サービスとしてのデプロイには、本契約、変更通知、通知ファイル、提供者の身元、下流での使用、および非提携に関する開示義務が伴います。Tencent がサービスを後援していると示唆しないでください。
  • Hunyuan Works またはその出力を、Hunyuan/そのモデル派生物以外の AI モデルの改善に使用することはできません。
  • Tencent は生成された出力に対する権利を主張しませんが、権原、非侵害、品質、または適合性を保証しません。運用者は引き続き責任を負います。
  • 組み込まれている AUP では、公開コンテンツに機械生成であることを開示するよう求めており、ガードレールの回避、有害行為/欺瞞行為/選挙操作、本人の同意を得ないなりすまし、重大な影響を伴う自動意思決定、軍事利用、差別、搾取、および無資格での専門業務を禁止しています。

サードパーティのエンコーダーとライブラリには、それぞれ独自の条件が適用されます。寛容なライセンスの依存関係を使用しても、Hunyuan モデルのライセンスが変更されるわけではありません。

動きのプロンプトを作成して評価する

ローカル版 1.5 では、詳細なバイリンガルプロンプトは、通常、短いタグよりも優れた結果をもたらします。時間的な進行を一つに絞って記述します。構図とカメラ、被写体の外見、主要な動作の順序、副次的な動き/環境の動き、照明/色、物理的な挙動、最終状態を含めてください。I2V では動きと変化を重視してください。入力によって外見はすでに定まっています。

ホスト型プロンプトは、中国語のポジティブプロンプト 200 文字という契約上の制限内に収める必要があります。例:

ローアングルのミディアムショット。赤い路面電車が小雨の中、濡れた線路に沿ってゆっくり近づきます。車窓の暖かな光が地面に映り、カメラは安定して後退しながら車両の先頭を中央に保ちます。遠くでは歩行者が自然に歩き、路面電車は最終的に駅の時計の下で滑らかに停車します。写実的な映画の質感、ワンカット。

HunyuanVideo-1.5 が音声を生成するかのように、音の指示を記述しないでください。正確なテキスト、ロゴ、手、顔、反射、接触、急速な動き、物体の永続性は、すべて確認が必要なリスクとして扱ってください。

すべての成果物を検証する

  1. ファイルを完全にデコードし、再生時間、フレーム数/レート、寸法、コーデック/プロファイル、色のメタデータ、ストリーム一覧を検査します。何も確認せずに決めつけず、無音または予期しない音声がないことを確認してください。
  2. プロンプト/入力との整合性、解剖学的な自然さ、同一性、テキスト/ロゴの忠実性、構造の安定性、時間的なちらつき、カメラの動き、物理的な挙動、接触、急なカットについて、最初/中間/最後のフレームと、ネイティブスケールでの各秒のフレームを確認します。
  3. I2V では、最初のフレームと意図した同一性/構図を比較します。SR では、SR 前と SR 後を比較し、生成されたテクスチャ、リンギング、時間的なちらつき、アスペクト比のずれがあれば却下します。
  4. ホスト型の場合は、モデル/サイト、リクエスト ID とジョブ ID、推定/実際の料金、開示情報、プロンプト、画像ハッシュ、出力ハッシュ、タイムスタンプ、ソース URL の有効期限を記録します。ローカルの場合は、Git/HF/依存関係のリビジョン、チェックポイントのハッシュ、ハードウェア、アクセラレーション/オフロード/キャッシュ、シード、元のプロンプト/書き換え後のプロンプト、SR 前後のファイル、コマンドを記録します。
  5. 配布前に、安全性、同意、肖像、知的財産、対象地域、ポリシー、合成メディアの開示に関する審査基準を適用します。適合する置き換えが承認されるまでは、ホスト型の AI マークを既定のまま維持してください。

公式情報源を再確認する

モデル識別子、エンドポイントパス、リージョンおよびサイトの提供状況、同時実行数、料金、入力上限、解像度、長さ、結果の有効期間、チェックポイントの公開状況、リポジトリのフラグ、依存関係、ライセンス、ポリシー、利用規約は変更される可能性があるものとして扱ってください。本番環境で承認するたびに、確認日を記録してください。

コメント