关于 tencent-hunyuanvideo
用于选择和操作 Tencent HunyuanVideo 的工作流技能,涵盖 TokenHub、旧版 Tencent Cloud API 和本地开放权重。它指导视频生成,并强调审批关卡、不同服务契约,以及费用、素材和模型文件的安全处理。
主要功能
- 01区分三种部署方式
- 02规划文本与图像生成视频
- 03说明云端提交和轮询
- 04涵盖本地模型配置
- 05设置审批与素材处理保障
适用场景
- 01规划托管视频生成任务
- 02维护旧版 Tencent Cloud 集成
- 03配置本地 HunyuanVideo-1.5
- 04生成前审查费用和素材处理
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ calesthio/ generative-media-skills --skill tencent-hunyuanvideo安装后在 Claude Code 中输入/tencent-hunyuanvideo确认已加载。
附带文件EVAL.md
详细介绍
Tencent HunyuanVideo
采取行动前,先将每个请求归入以下三种契约之一:
- TokenHub
hy-video-1.5— 当前由腾讯云托管的 T2V/I2V 接口,适用于新集成。 - 旧版腾讯云
vclmAPI 3.0 — 较旧的 TC3 签名SubmitHunyuanToVideoJob接口,保留供现有客户使用,同时销售和模型能力正迁移至 TokenHub。 - HunyuanVideo-1.5 开放权重 — 官方 8.3B 本地 T2V/I2V 仓库、检查点、依赖项、基础设施和社区许可证。
不要推断托管模型与公开检查点的字节内容完全相同。不要将开放权重许可证用于云端输出,也不要将腾讯云条款用于已下载的权重。
首先设置执行门槛
在付费请求、上传资产、下载模型、安装环境或启动训练任务之前:
- 说明接口、确切模型/操作或检查点系列、区域/地域、模式、输入、目标分辨率/时长、音频方案、披露信息、预估费用或基础设施占用,以及输出路径和 QA 门槛。
- 要求明确批准。对于托管工作,要求设定金额上限;对于本地工作,要求批准磁盘/网络/GPU 范围并接受许可证。
- 默认所有示例都只生成计划。绝不默默启用后付费、购买积分/并发额度、下载当前约 372 GB 的模型仓库,或联系提示词改写服务。
- 对于耗时较长的工作,在开始前保存提供商请求/任务 ID 或本地修订哈希。提交超时且没有任务 ID 时,状态未知;不要盲目重新提交,因为两个托管接口都没有说明支持幂等键。
选择正确的系列
| 系列 | 用途 | 关键边界 |
|---|---|---|
| TokenHub HY-Video-1.5 | 托管的文本或图像转 5 秒视频 | 自定义 /v1/api/video/submit 和 /query;模型为 hy-video-1.5;当前操作架构仅支持 720p |
旧版 vclm Hunyuan | 现有腾讯云集成 | TC3-HMAC-SHA256、API 版本 2024-05-23、区域 ap-guangzhou,使用操作名称而非模型字段 |
| HunyuanVideo-1.5 | 当前轻量级本地基础模型 | 8.3B;基础生成分辨率为 480p/720p;可单独进行 SR 升至 720p/1080p;支持 T2V/I2V |
| HunyuanVideo(原版) | 旧版本地 13B 基础模型 | 使用独立的检查点/代码;官方测试中,生成 544×960×129f 需要约 45 GB VRAM,生成 720×1280×129f 需要 60 GB |
| HunyuanVideo-Avatar | 音频驱动的人体动画 | 使用独立的仓库/模型;不是 HunyuanVideo-1.5 的音频开关 |
| HunyuanCustom | 主体定制,以及独立的图像/音频/视频条件工作流 | 使用独立的仓库/检查点,并需审核许可证 |
| HunyuanVideo-Foley | 根据视频/文本生成同步音频 | 独立的视频转音频模型;不生成画面 |
不要将腾讯云列出的 YT-Video-2.0、YT-Video-FX、YT-Video-HumanActor、Kling 或 Vidu 接口归类为 HunyuanVideo。它们是不同的腾讯 Youtu 或第三方产品,只是共用一个目录。
为新的托管工作操作 TokenHub
截至 2026-07-10 已核实的事实:
- 国内基础 URL:
https://tokenhub.tencentmaas.com;新加坡/全球基础 URL:https://tokenhub-intl.tencentmaas.com。腾讯表示,调用不能跨越服务已启用的区域/站点。请确认所选账户和站点已启用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。继承自混元操作的字段采用小写蛇形命名。 prompt为必填项,文档要求使用中文正向提示词,去除首尾空白后最多 200 个 UTF-8 字符。- 可选的
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 秒。未公开时长、宽高比、种子、负向提示词、摄像机控制、FPS、编解码器或音频字段。 - 提交示例返回
id、request_id、status: "queued";查询示例返回status: "completed"、进度和data.url。底层旧版描述契约则记录了WAIT/RUN/FAIL/DONE。适配器/状态语法应分别处理。 - 文档说明底层结果 URL 的有效期为 24 小时。请尽快下载、计算哈希并在本地验证。
- 当前 TokenHub 模型列表显示,HY-Video-1.5 的默认并发数为五。旧版
vclm支持一个活动任务、每秒 30 次提交请求和每秒 20 次查询请求。请求速率不等于活动任务并发数。
当前 TokenHub 定价页面对每次 HY-Video-1.5 调用收取 1.5 积分,每积分 1.0 CNY,因此按当前标价估算,每个成功生成的 5 秒任务为 1.5 CNY。折扣、预付积分、免费额度和税费可能影响账单。腾讯表示,生成失败的任务不会消耗积分。提交前请重新获取价格和账单状态;部分 TokenHub 账单明细采用 T+1,因此不要将控制台视为实时硬性限额。旧版 vclm 账单页面所示的 1.2 CNY 积分价格属于旧版服务,不得用于计算 TokenHub 的价格。
腾讯较早的定价表列出了 1080p SKU,但当前的 SubmitHunyuanToVideoJob 架构仅说明支持 720p。除非当前确切的 TokenHub 架构和账户权限均显示支持 1080p,否则不要发送 1080p。
保持 AI 披露标记启用
logo_add 默认值为 1,会添加“AI 生成”标记。将其设为 0,须经控制台审批,允许客户自行提供可见标记。腾讯的常见问题解答指出,用户必须依法合规地标记 AI 生成内容,不得误导观众。除非经审核的替代标记工作流已获批准,否则请保留默认标记;切勿仅为美观而将其禁用。
使用这个以试运行为先的 TokenHub 客户端
这个完整的标准库示例默认规划一个 720p 任务。只有在传入 --execute、设置精确的 TENCENT_APPROVED_DIGEST,且 TENCENT_APPROVE_MAX_CNY >= 1.5 时才会提交。它会在唯一一次 POST 前创建持久化声明,绝不重试结果不明的提交;只有在保存了任务 ID 后才会恢复操作;同时限制查询轮询和结果下载,拒绝覆盖文件、计算产物哈希并验证 MP4。请为提供商的签名下载主机传入一个或多个经审核的 --result-host-suffix 值;执行时若结果主机策略未明确限定范围,则会拒绝执行。
#!/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 区域。请使用 Tencent Cloud 官方 SDK/TC3-HMAC-SHA256,并采用短期凭证和 CAM 操作级权限。不要将 TokenHub Bearer 密钥、小写字段、顶层响应或状态转换为旧版适配器的格式。
新模型销售正在迁移至 TokenHub;旧平台表示将停止增加模型能力并支持新购,但现有购买暂时仍可用。除非 Tencent 为客户提供其他受支持的路径,否则请基于 TokenHub 构建新的集成。
处理云端资产与治理
- 上传前检查图像尺寸、格式、大小、方向、权利和同意情况。优先使用有效期短、公开范围最小的 COS 签名 URL;不要记录该 URL。Base64 可避免使用获取 URL,但会增大请求/日志数据。
- 当前 TokenHub 访问表区分广州/中国大陆资源调度与新加坡/全球调度,并禁止跨站点调用。这本身并不能确定合同中的数据驻留、保留或训练用途。对于受监管或机密材料,请获取当前的 TokenHub 隐私政策、服务协议/DPA、子处理方条款和删除条款。
- 24 小时的结果 URL 代表可用时段,并不能证明提示词/输入/输出数据已删除。请下载结果、计算哈希,并将其移至由客户控制且设有明确生命周期的存储空间。
- 保留 AI 生成内容标注、同意、肖像权、知识产权和品牌授权记录。Tencent 的常见问题解答称,不同用户的输出可能相似;请勿承诺独占性。
- 国际 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 T2V | 480P-T2V 或 480P-T2V-cfg-distill | CFG 蒸馏版仍需 50 步;CFG scale 为 1 |
| 480p I2V | 480P-I2V、CFG-distill 或 I2V step-distill | Step-distill 仅适用于 480p I2V;使用 8 或 12 步(4 步会牺牲画质) |
| 720p T2V | 720P-T2V | 当前仓库表中列出的 720p T2V CFG/稀疏注意力蒸馏模型文件仍标注为“即将推出”;请勿自行编造 |
| 720p I2V | 720P-I2V、CFG-distill 或 sparse CFG-distill | 稀疏注意力仅适用于 720p/H 系列,且需要匹配的检查点 |
| 480→720 或 720→1080 | 单独的 SR step-distilled transformer | 超分辨率在生成后进行;不要将 1080p 称为原生基础检查点 |
完整布局还需要文本/视觉编码器。官方说明目前推荐将 Qwen2.5-VL-7B-Instruct 用作 MLLM,使用 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 导出,时长约五秒。帧数须符合 3D VAE 的要求(4n+1);在确定容量前,先验证 241 帧等更长序列。基础生成支持 480p 或 720p;--sr 是单独的上采样步骤,且当前 CLI 默认启用。
不同加速选项不可互换:
- 标准检查点和 CFG 蒸馏检查点均使用 50 步。CFG 蒸馏会改变引导计算方式,而非步数。
- 只有 480p I2V step-distilled 检查点推荐使用 8 或 12 步。
- 稀疏注意力需要 H 系列 GPU、兼容 720p 的模型文件和 Flex-Block-Attention;启用后会自动选择 CFG 蒸馏模式。
- SageAttention 会自动禁用 Flex-Block-Attention。不要同时启用 Sage 和稀疏注意力路径,并期待两者都生效。
- 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 下载方式;生产环境应使用经过审核的 --include 清单,仅获取兼容任务/SR 所需的组件。不要对不可信路径使用 shell find;请固定工作区,并验证最终清单的覆盖范围。
为保护本地/离线隐私,请禁用提示词改写。原生仓库默认启用改写,但在没有兼容的 vLLM 端点时会跳过。如果有意启用改写,请使用经过审核的自托管端点,记录原始提示词和改写后的提示词,并将改写模型视为另一个数据处理方和版本化依赖项。
部署前应用本地许可证
HunyuanVideo-1.5 不使用 Apache-2.0 许可证或 OSI 许可证。它使用随 2025-11-21 版本发布的 Tencent Hunyuan 社区许可协议。请让法律顾问核查实际锁定的许可证。当前的重要条款包括:
- 许可区域不包括欧盟、英国和韩国。根据本协议,在许可区域之外使用、复制、修改、分发、展示内容,甚至使用输出内容,均未获得许可。未经 Tencent 单独授权,请勿在这些地区部署开放权重或提供其输出内容。
- 如果被许可方的产品/服务在版本发布前一个月的月活跃用户数超过 1 亿,则必须申请单独许可,且在 Tencent 批准前不会获得许可。
- 模型衍生作品包括修改、蒸馏,以及使用权重、中间表示、合成输出或类似模式迁移来训练、以实现相似功能的模型。仅有输出内容不属于模型衍生作品。
- 分发和托管服务部署需履行协议、变更通知、Notice 文件、服务提供方身份、下游使用及非关联关系披露等义务。不得暗示 Tencent 为该服务提供赞助。
- 不得使用 Hunyuan 作品或输出内容改进其他 AI 模型,Hunyuan 及其模型衍生作品除外。
- Tencent 声明不主张对生成的输出内容拥有权利,但不提供所有权、不侵权、质量或适用性保证;运营方仍须承担责任。
- 随附的 AUP 要求公开内容披露其由机器生成,并禁止规避防护措施、有害/欺骗性行为、操纵选举、未经同意的冒充、高风险自动化决策、军事用途、歧视、剥削及未经许可的专业执业。
第三方编码器和库仍受其各自条款约束。采用宽松许可证的依赖项不会改变 Hunyuan 模型的许可证。
编写提示词并评估运动效果
对于本地 1.5,详尽的双语提示词通常优于简短标签。请描述一个连续的时间变化过程:构图和镜头、主体外观、主要动作顺序、次要/环境运动、光线/色彩、物理行为以及最终状态。对于 I2V,应强调运动和变化;输入已经确定了外观。
托管服务的提示词必须符合中文正向提示词不超过 200 个字符的约定。示例:
低机位中景,红色电车在细雨中沿湿润轨道缓慢驶近,车窗暖光倒映在地面,镜头平稳后退保持车头居中,远处行人自然走动,电车最终在站钟下平稳停住,写实电影质感,连续镜头。
不要将声音提示当作 HunyuanVideo-1.5 会生成音频来编写。请将精确文本、标志、手部、面部、反射、接触、快速运动和物体持续性视为需要审核的风险点。
验证每项产物
- 对文件进行完整解码;检查时长、帧数/帧率、尺寸、编解码器/配置文件、色彩元数据和流清单。确认是否静音或存在意外音频,不要想当然。
- 以原生比例检查首帧/中间帧/末帧,并逐秒检查画面,确认提示词/输入一致性、解剖结构、身份、文字/标志保真度、结构稳定性、时间闪烁、镜头运动、物理规律、接触和突兀剪切。
- 对于 I2V,比较首帧及预期身份/构图。对于 SR,比较 SR 前后的结果;若出现凭空生成的纹理、振铃、时间闪烁或宽高比漂移,则应拒绝。
- 记录托管模型/站点、请求和任务 ID、费用预估/实际费用、披露信息、提示词、图像哈希、输出哈希、时间戳和源 URL 的过期时间;或者记录本地 Git/HF/依赖项版本、检查点哈希、硬件、加速/卸载/缓存、种子、原始/改写后的提示词、SR 前后文件及命令。
- 分发前执行安全、同意、肖像权、知识产权、许可区域、政策和合成媒体披露检查。除非批准了符合要求的替代标记,否则保留默认托管 AI 标记。
重新核查一手来源
- TokenHub 视频生成
- TokenHub API 端点和区域
- TokenHub 模型列表
- TokenHub 模型定价
- 提交 Hunyuan 视频操作
- 查询 Hunyuan 视频操作
- 腾讯视频生成计费
- 腾讯披露与输出常见问题
- HunyuanVideo-1.5 官方代码仓库
- HunyuanVideo-1.5 官方模型仓库
- HunyuanVideo-1.5 技术报告
- HunyuanVideo-1.5 许可证和 AUP
- 原始 HunyuanVideo 代码仓库
模型标识符、端点路径、区域/站点可用性、并发数、价格、输入限制、分辨率、时长、结果保留期限、检查点发布情况、代码仓库标记、依赖项、许可证、政策和条款都可能变动。每次生产审批时都应记录核验日期。