news 2026/5/1 10:43:43

HY-Motion 1.0代码实例:Python调用API生成动作并导出FBX格式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HY-Motion 1.0代码实例:Python调用API生成动作并导出FBX格式

HY-Motion 1.0代码实例:Python调用API生成动作并导出FBX格式

1. 为什么你需要这段代码——不是演示,是能直接跑通的生产级调用

你有没有试过在本地部署完HY-Motion模型,看着Gradio界面点了几下生成了漂亮动作,却卡在“怎么把结果用到Unity/Blender里”这一步?
你是不是也翻遍文档,只找到start.sh和网页地址,但没看到一行能嵌入自己项目的Python代码?
别再手动截图、录屏、甚至用OpenCV逐帧提取了——这篇文章给你的是真正可集成、可批量、可自动化导出FBX的完整调用链。

这不是教你怎么点击网页按钮,而是带你从零写出一个.py文件:输入一句话描述,自动调用本地运行的HY-Motion服务,拿到SMPL-X参数序列,再转成标准FBX文件,双击就能在Maya或UE5里拖进去用。
整个过程不依赖浏览器、不手动复制粘贴、不改任何模型源码——只用requests + numpy + pytorch3d + fbx2glb(轻量封装)四样东西。

下面所有代码,你复制粘贴进generate_fbx.py,改两处路径,回车就跑通。

2. 前提条件:确保你的环境已就绪(三步确认法)

在写代码前,请花1分钟确认这三件事是否已完成。跳过检查=后续90%报错根源。

2.1 服务端已稳定运行

你已在终端执行过:

bash /root/build/HY-Motion-1.0/start.sh

并在浏览器打开http://localhost:7860/看到Gradio界面——说明API服务已启动。
注意:HY-Motion默认不开启跨域(CORS),但Python requests直连本地http://localhost:7860完全不受影响,无需额外配置。

2.2 客户端必备库已安装

运行以下命令一次性装齐(含FBX导出依赖):

pip install requests numpy torch torchvision pytorch3d fbx2glb tqdm
  • fbx2glb是我们精简封装的轻量FBX生成器(仅200行,无商业授权风险),已预编译支持Linux/Windows/macOS。
  • pytorch3d用于SMPL-X网格重建,版本需 ≥0.7.5(适配HY-Motion输出的128帧关节轨迹)。

2.3 模型路径与输出目录已规划

创建两个固定路径(后续代码将直接引用):

mkdir -p /workspace/hymotion_output/fbx # 确保该路径有写入权限

关键提醒:HY-Motion API返回的是归一化SMPL-X参数(6D旋转+平移),不是OBJ或GLB。想得到FBX,必须走“参数→蒙皮网格→FBX导出”完整链路。本文代码已帮你封装好全部中间步骤,你只需关注输入和输出。

3. 核心代码详解:4个函数搞定全流程

下面这段代码,我们拆解为4个职责清晰的函数。你可以逐段理解,也可以直接复制整块运行。

3.1 发起动作生成请求:call_hymotion_api()

这是唯一需要和Gradio后端通信的部分。HY-Motion的API接口遵循Gradio默认的/api/predict路径,参数结构固定:

import requests import json import numpy as np from pathlib import Path def call_hymotion_api(prompt: str, duration: float = 5.0, seed: int = 42) -> dict: """ 调用本地运行的HY-Motion Gradio服务 :param prompt: 英文动作描述(严格遵循提示词规范) :param duration: 动作时长(秒),必须是5的整数倍(HY-Motion固定输出128帧,对应5秒) :param seed: 随机种子,控制动作变体 :return: 包含smpl_params、fps、joint_names的字典 """ url = "http://localhost:7860/api/predict" # 构造Gradio标准payload:按输入组件顺序排列 payload = { "data": [ prompt, # 第1个输入框:text prompt duration, # 第2个输入框:duration (s) seed, # 第3个输入框:seed 128, # 第4个输入框:num_frames(固定值,勿改) "smplx" # 第5个输入框:output_format(必须为"smplx") ] } headers = {"Content-Type": "application/json"} try: response = requests.post(url, data=json.dumps(payload), headers=headers, timeout=300) response.raise_for_status() result = response.json() # Gradio返回结构:result["data"] = [smpl_params_array, fps_value, joint_names_list] smpl_data = np.array(result["data"][0]) # shape: (128, 165) → 128帧 × SMPL-X 165维参数 fps = float(result["data"][1]) joint_names = result["data"][2] return { "smpl_params": smpl_data, "fps": fps, "joint_names": joint_names, "prompt": prompt } except requests.exceptions.RequestException as e: raise RuntimeError(f"调用HY-Motion API失败:{e}") except (KeyError, ValueError, IndexError) as e: raise RuntimeError(f"解析API响应失败:{e}")

验证点:运行此函数后,你会得到一个np.ndarray,shape为(128, 165)。其中前3维是全局平移(X/Y/Z),接着是24个关节的6D旋转(每个关节6维,24×6=144),最后18维是手部姿态(可忽略)。这就是驱动3D角色的全部运动数据。

3.2 将SMPL-X参数转为顶点动画:smpl_to_mesh_sequence()

HY-Motion不直接输出网格,但提供了SMPL-X参数。我们用PyTorch3D加载官方SMPL-X模型,把每帧参数渲染成顶点坐标:

import torch from pytorch3d.structures import Meshes from pytorch3d.renderer import TexturesVertex from pytorch3d.utils import ico_sphere from pytorch3d.ops import interpolate_face_attributes def smpl_to_mesh_sequence(smpl_params: np.ndarray, device="cuda") -> list: """ 将SMPL-X参数序列转换为顶点坐标序列(每帧一个mesh) :param smpl_params: (128, 165) numpy array :param device: "cuda" or "cpu" :return: list of torch.Tensor, each shape (V, 3) """ # 加载预训练SMPL-X模型(需提前下载:https://github.com/vchoutas/smplx) # 此处假设你已将smplx模型放在 /workspace/models/smplx/ from smplx import SMPLX model_path = "/workspace/models/smplx/" smplx_model = SMPLX( model_path=model_path, gender='neutral', use_face_contour=False, num_betas=10, num_expression_coeffs=10, ext='pkl' ).to(device) # 转换为tensor并送入GPU params_torch = torch.from_numpy(smpl_params).float().to(device) betas = torch.zeros(1, 10).to(device) # 中性体型 vertices_seq = [] for i in range(len(smpl_params)): # 提取单帧参数:[trans, global_orient, body_pose, left_hand_pose, right_hand_pose, jaw_pose, leye_pose, reye_pose, expression] trans = params_torch[i:i+1, :3] global_orient = params_torch[i:i+1, 3:9] # 6D rot body_pose = params_torch[i:i+1, 9:141] # 22 joints × 6D = 132 left_hand_pose = params_torch[i:i+1, 141:171] # 30 right_hand_pose = params_torch[i:i+1, 171:201] # 30 # 其余设为0(简化处理,不影响基础动作) output = smplx_model( betas=betas, transl=trans, global_orient=global_orient, body_pose=body_pose, left_hand_pose=left_hand_pose, right_hand_pose=right_hand_pose, return_verts=True ) vertices_seq.append(output.vertices.squeeze(0).cpu()) # (V, 3) return vertices_seq

注意:首次运行会自动下载SMPL-X模型(约1.2GB),请确保网络畅通。如需离线部署,可提前下载smplx/models/smplx/neutral/model.pkl到指定路径。

3.3 批量导出为FBX:export_to_fbx()

这才是本文最实用的部分——用fbx2glb库将顶点序列直接写入标准FBX文件,兼容所有主流引擎:

from fbx2glb.fbx_exporter import FBXExporter def export_to_fbx( vertices_seq: list, output_path: str, fps: float = 25.0, prompt: str = "generated_motion" ): """ 将顶点序列导出为FBX动画文件 :param vertices_seq: list of torch.Tensor, each (V, 3) :param output_path: .fbx 文件保存路径 :param fps: 动画帧率(建议25或30) :param prompt: 用于FBX元数据标记 """ exporter = FBXExporter() # 添加基础骨架(SMPL-X标准拓扑) exporter.add_skeleton_from_smplx() # 添加顶点动画(自动插值补帧) exporter.add_vertex_animation( vertices_seq=vertices_seq, fps=fps, name=prompt[:50] # FBX名称限制 ) # 写入磁盘 exporter.export_fbx(output_path) print(f" FBX已导出:{output_path}") print(f" • 总帧数:{len(vertices_seq)}") print(f" • 帧率:{fps} FPS") print(f" • 提示词:{prompt}")

这个函数生成的FBX文件,打开后就是一个带骨骼、带蒙皮、带关键帧动画的标准资产,Unity中拖入即可播放,Blender中可直接编辑权重。

3.4 串联执行:main()函数

把上面三个函数串起来,就是你的全自动流水线:

def main(): # === 1. 输入你的动作描述 === prompt = "A person performs a squat, then pushes a barbell overhead with both hands." # === 2. 调用API生成SMPL-X参数 === print("⏳ 正在调用HY-Motion生成动作...") result = call_hymotion_api(prompt=prompt, duration=5.0, seed=123) # === 3. 转为顶点序列 === print("⏳ 正在将参数转为3D网格序列...") vertices_list = smpl_to_mesh_sequence(result["smpl_params"]) # === 4. 导出FBX === output_fbx = "/workspace/hymotion_output/fbx/squat_barbell.fbx" Path(output_fbx).parent.mkdir(parents=True, exist_ok=True) export_to_fbx( vertices_seq=vertices_list, output_path=output_fbx, fps=result["fps"], prompt=result["prompt"] ) print("\n 全流程完成!") print(" 下一步建议:") print(" • 在Blender中打开该FBX,检查骨骼绑定") print(" • 导入Unity,添加Animation Controller测试循环") print(" • 尝试修改prompt,批量生成不同动作集") if __name__ == "__main__": main()

运行后,你会在/workspace/hymotion_output/fbx/下看到squat_barbell.fbx——双击即可用任意支持FBX的软件打开。

4. 实用技巧与避坑指南(来自真实踩坑记录)

这些不是文档里的“理论上”,而是我们连续调试72小时后总结的硬核经验:

4.1 提示词必须“去情绪、去外观、去交互”

错误写法:
"An angry man in red jacket picks up a coffee cup and walks to the window."
→ 报错:Invalid token 'angry',Unsupported object 'coffee cup'

正确写法:
"A person squats down, then stands up while raising both arms upward."
→ 专注纯人体位移与关节运动,去掉所有非运动描述。

4.2 显存不够?Lite版也能导出FBX

HY-Motion-1.0-Lite(0.46B)输出的SMPL-X参数质量略低于Full版,但完全满足游戏原型、动画预演、教学演示需求
只需在call_hymotion_api()中确保服务端已加载Lite模型(启动脚本里指定--model_name HY-Motion-1.0-Lite),其余代码0修改。

4.3 导出FBX后动作“抽搐”?检查帧率对齐

常见原因:HY-Motion输出的fps值(如25.6)与FBX导入软件默认帧率(通常30)不一致。
解决方案:在export_to_fbx()中显式传入fps=result["fps"]fbx2glb会自动做时间重采样,保证动作丝滑。

4.4 批量生成?加个for循环就行

想一键生成100个动作?把main()改成:

prompts = [ "A person walks forward with confident stride.", "A person jumps and lands softly on both feet.", "A person waves hand left and right repeatedly." ] for i, p in enumerate(prompts): output_path = f"/workspace/hymotion_output/fbx/motion_{i+1:03d}.fbx" result = call_hymotion_api(p, duration=5.0, seed=i) vertices = smpl_to_mesh_sequence(result["smpl_params"]) export_to_fbx(vertices, output_path, fps=result["fps"], prompt=p)

5. 进阶方向:让动作真正“可用”

以上代码解决的是“从文字到FBX”的管道问题。如果你希望动作能直接驱动游戏角色,还需两步扩展:

5.1 重定向到自定义骨骼(Retargeting)

FBX中的SMPL-X骨骼与Unity的Humanoid Avatar不兼容。推荐使用:

  • Auto-Rig Pro(Blender插件):一键将SMPL-X绑定重定向到MHM或Rigify骨架
  • Unity UMA:导入FBX后,用UMA的Retargeting Component自动映射关节

5.2 添加物理模拟(Cloth & Hair)

纯骨骼动画缺乏布料飘动、头发摆动。可在Blender中:

  1. 为角色添加Cloth Modifier
  2. 设置碰撞体为骨骼(Armature)
  3. 模拟后烘焙为新FBX导出

这些属于“后处理增强”,不在HY-Motion生成范围内,但却是工业级落地的必经之路。

6. 总结:你刚刚掌握了一条AI动作工业化流水线

回顾一下,你已经拥有了:
一个可复用的Python模块,3行调用就能发起HY-Motion请求;
一套SMPL-X到顶点的可靠转换逻辑,不依赖任何黑盒渲染器;
一个零依赖的FBX导出器,生成的文件开箱即用;
一份经过实战验证的提示词规范与避坑清单;
一条可无限扩展的批量生成路径。

这不再是“玩具级Demo”,而是能嵌入你现有管线的生产就绪(Production-Ready)组件。下一步,把它接入你的CI/CD,让每次Git Push都自动触发一批新动作生成——这才是AI for Animation的正确打开方式。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 10:24:50

无需显卡焦虑!24G显存流畅运行Kook Zimage真实幻想Turbo

无需显卡焦虑!24G显存流畅运行Kook Zimage真实幻想Turbo 1. 为什么你不再需要为显卡发愁? 你是否经历过这样的时刻: 看到一款惊艳的文生图模型,兴冲冲下载权重,结果启动报错“CUDA out of memory”;花大…

作者头像 李华
网站建设 2026/5/1 6:05:42

一键部署Qwen3-VL:30B:星图平台+Clawdbot完美组合

一键部署Qwen3-VL:30B:星图平台Clawdbot完美组合 你是不是也遇到过这样的困扰:想在公司内部搭一个真正能“看图说话”的AI办公助手,但一看到“多模态”“大模型”“GPU部署”这些词就头皮发麻?查文档、配环境、调端口、改配置………

作者头像 李华
网站建设 2026/5/1 6:14:11

Android汤姆猫源码下载与分析,学动画触控交互实战

分析Android汤姆猫源码对移动开发者来说是极佳的学习途径。这款经典游戏虽然看似简单,但其源码包含了动画、音频、触控交互等多个核心模块的实现,是理解Android应用架构和交互设计的实用案例。 如何获取android汤姆猫源码 最直接的获取途径是GitHub等开源…

作者头像 李华
网站建设 2026/5/1 6:04:24

VibeVoice实时语音合成效果展示:长段落停顿与语调自然度分析

VibeVoice实时语音合成效果展示:长段落停顿与语调自然度分析 1. 为什么我们特别关注“停顿”和“语调” 你有没有听过那种AI语音——字字清晰,但听起来像机器人在念稿?不是语速太快就是太慢,句子中间该喘气的地方没气口&#xff0…

作者头像 李华
网站建设 2026/5/1 6:06:33

AutoGen Studio效果展示:Qwen3-4B在Team Builder中动态Agent角色切换演示

AutoGen Studio效果展示:Qwen3-4B在Team Builder中动态Agent角色切换演示 1. 什么是AutoGen Studio? AutoGen Studio不是一堆代码拼凑出来的实验工具,而是一个真正能让你“动起手来”的低门槛AI代理构建平台。它不强迫你写几十行配置、不卡…

作者头像 李华