WorkBuddy玩转AI 3D虚拟盲盒:用腾讯云混元3D + TTS Skills 打造会说话的三维收藏品

一、缘起:一个盲盒爱好者的发癫想法
抽盲盒是很多年轻人的喜好,我这个中老年人也不例外。
我桌上常年摆着各式各样的盲盒和手办,通常都是主题系列的比如精灵宝可梦、数码宝贝、奥特曼等等。每次拆盒时那种"不知道会是什么"的期待感,总让人欲罢不能啊!有天晚上我在整理这些小玩意儿,想自己做一个抽奖的游戏该多好。
混元生3D?文生3D、图生3D、草图生3D?
我的脑子里"叮"地一声,恭喜宿主!——,啊不是想岔了,是冒出一个念头:
能不能用 AI实时通过玩家的喜好选择 生成 3D 模型来做"虚拟盲盒"?
想想看——咱们输入一个主题,比如"赛博朋克猫咪",系统像盲盒一样在主题范围内注入随机元素,给你生成一个独一无二的 3D 角色模型。
完全都不知道会搞出来什么造型,是机械耳朵还是霓虹尾巴,全靠运气。再靠 TTS 给角色配一段自我介绍的语音,这样搞每个盲盒就是一个有声音、有故事、有 3D 形象的数字收藏品了!
这个想法让我兴奋了一整晚。第二天就打开WorkBuddy开始动手了。最终效果如下:
二、3D 虚拟盲盒工坊
我有一个伟大的计划,简单来说,用户选择一个主题(或上传一张草图),后台在主题内注入随机"基因"——颜色变体、配件组合、风格微调——然后调用混元3D生成独一无二的3D角色模型。
同时为角色生成姓名、性格、稀有度和背景故事,最后用 TTS 合成角色的"自我介绍"语音。整个体验模拟真实盲盒的"拆箱"过程:选主题、开盒、等开奖。这样内容可以无穷无尽啊。
与物理盲盒不同,每个虚拟盲盒都是 AI 实时生成的,理论上不会有完全相同的两个。而且你不仅能看到 3D 模型,还能听到角色"说话"。我设计了五个主题系列:
| 系列名称 | 风格定位 |
|---|---|
| 赛博朋克 | 霓虹机械、未来都市 |
| 古风仙侠 | 飘逸仙气、东方韵味 |
| 萌宠乐园 | Q弹可爱、治愈系 |
| 星际探索 | 太空科幻、外星生物 |
| 暗黑奇幻 | 哥特暗影、神秘生物 |
除了预设主题,用户也可以输入自定义关键词,甚至上传手绘草图来生成盲盒——草图模式会调用混元3D的 Sketch 生成类型,把涂鸦变成 3D 模型。这个功能在我测试时尤其有趣,我画了个歪歪扭扭的"四不像",结果生成了一个还挺有设计感的小怪兽。
三、技术架构与 Skills 选型
我们首先要和Workbuddy充分沟通设计过程,从小白视角让它一步步摸清我们的需求,指导我们完成。
对话内容提示词如下:
我是个新手小白,啥都不懂。我想做一个盲盒网站,就像抽盲盒那种感觉!点一下按钮,就出来一个3D的小角色,每个都不一样,越稀有的越好看,最好还能让它开口说话做个自我介绍,像抽卡游戏那样有稀有度就更棒啦!你帮我想想办法,一步步教我做呗

WorkBuddy做了很多初级工作,还提示了我们需要用到腾讯的一些skill来获取真实的3D效果,这时继续让它调用它想用的skill就行。

整个应用的架构围绕"盲盒生成流水线"展开,Skills 使用了:hy-3d-generation、tencentcloud-tts、tencentcloud-ocr和tencentcloud-yt-segment-portrait,真正用到的主要是3D,混元的,没有它就没有3D盲盒。TTS 可以让盲盒"会说话",从视觉扩展到听觉,是多模态体验的关键一环。OCR 处理用户上传的图片输入——比如有人拍了一张手写概念图的草图,OCR 能提取文字辅助 prompt 构建。人像分割则用于图片输入场景,把照片里的角色抠出来再喂给图生3D,生成效果比直接传整张图好不少。
| Skill | slug | 在本项目中的角色 |
|---|---|---|
| 混元生3D | hy-3d-generation |
核心引擎,生成3D角色模型(GLB/OBJ) |
| 腾讯云TTS | tencentcloud-tts |
角色语音合成,生成自我介绍音频 |
| 通用文字识别 | tencentcloud-ocr |
图片输入场景的文字提取 |
| 图片人像分割 | tencentcloud-yt-segment-portrait |
图片预处理,角色抠图 |
我使用Workbuddy将四个腾讯云 AI Skill 编排为一条完整的多模态生成流水线,覆盖了从输入解析到三维建模再到语音合成的全链路:

四个 Skill 串联形成闭环:OCR 读图 → 人像分割抠图 → 随机引擎组 prompt → 混元3D 生模型 → TTS 配音,单独每个 Skill 各自为战,组合后实现了"选主题→开盲盒→3D模型亮相+角色语音自我介绍"的完整收藏品体验。
hy-3d-generation(混元生3D) 作为核心引擎,根据盲盒随机引擎组装的 prompt 调用文生3D/草图生3D接口生成 GLB 三维模型,并按稀有度分级选用 3.0/3.1 模型版本、PBR 材质与面数参数(N/R 用 3.0 快速出模,SSR/UR 用 3.1+PBR+80万面数追求极致精度),让稀有度不仅体现在概率上,更体现在模型质量上;
tencentcloud-tts(语音合成) 将系统自动生成的角色自我介绍文本合成为语音,并按稀有度映射不同音色(N→智瑜、SR→智侠、SSR→智美、UR→智白),实现每个盲盒角色"开盒即说话"的多模态体验;
tencentcloud-ocr(通用文字识别) 处理用户上传的图片输入场景——当用户拍下手写概念图或设计草图时,OCR 先提取图中文字辅助构建3D生成 prompt,将非结构化的图片输入转化为可用的文本线索;
tencentcloud-yt-segment-portrait(人像分割) 在草图/图片输入场景中做预处理,将主体从杂乱背景中抠出生成透明 PNG 再喂给图生3D,显著提升了草图模式的生成稳定性和模型质量。
四、环境准备与 Skill 安装
在Workbuddy中可以直接找到并添加这些技能,如下直接搜就行:




完成!可以在对话框中看到我们的技能已经在列表中,可以随时选取添加!
4.1 腾讯云密钥配置
四个 Skill 都需要腾讯云 API 密钥。去 腾讯云 API 密钥管理 页面创建 SecretId 和 SecretKey。
然后在环境变量里配置:
# Windows PowerShell
$env:TENCENTCLOUD_SECRET_ID = "你的SecretId"
$env:TENCENTCLOUD_SECRET_KEY = "你的SecretKey"
# Linux / macOS
export TENCENTCLOUD_SECRET_ID="你的SecretId"
export TENCENTCLOUD_SECRET_KEY="你的SecretKey"
同时需要开通对应的服务:3D 视觉创作(ai3d)、语音合成(tts)、文字识别(ocr)、图像处理(image)。每个服务首次开通都有免费额度,先领取,做这个项目基本够用。
3D这块需要额外买一点资源包不然不太够。毕竟生成一次都非常烧积分。

4.2 Skill 安装
在 SkillHub(https://skillhub.cn)搜索对应 slug 安装。安装后 Skill 的脚本会放在本地目录,后续可以直接在代码里调用。也可以直接 pip install tencentcloud-sdk-python 安装 SDK,手动调用 API。
下面就直接让它继续调用完成开发就行。

整个项目代码量不到 1000 行,借助 Skill 封装将四个腾讯云 API 的对接复杂度大幅降低,将 Skill 协同效能发挥到最佳。
4.3 项目结构
blindbox-workshop/
├── app.py # Flask 主应用
├── engine/
│ ├── random_engine.py # 盲盒随机基因引擎
│ ├── dna_generator.py # 角色 DNA 生成
│ ├── skill_3d.py # 混元3D 调用封装
│ ├── skill_tts.py # TTS 调用封装
│ ├── skill_ocr.py # OCR 调用封装
│ └── skill_segment.py # 人像分割调用封装
├── static/
│ ├── css/style.css
│ └── js/viewer.js # 3D 模型查看器(Three.js)
├── templates/
│ ├── index.html # 主页
│ └── box.html # 盲盒开箱页
└── requirements.txt
五、实现的一些核心要点
5.1 盲盒随机基因引擎
盲盒的灵魂在于"随机"。但纯随机会生成乱七八糟的东西,所以我的做法是:每个主题预设一个"基因池",包含颜色、配件、材质、风格修饰词等维度,每次从池子里随机抽取组合,拼成结构化的 prompt 喂给混元3D。这样既保证结果在主题范围内,又保证每次都有惊喜。
用预设的基因池约束随机范围,用稀有度系统控制 prompt 复杂度。UR 级别的 prompt 会自动加上更多细节描述词,让混元3D生成更精致的模型。实测下来,这种分层 prompt 策略对生成质量的影响非常明显——N 和 UR 的模型精度差距肉眼可见。
5.2 混元3D模型生成
混元3D Skill 安装后,最简单的用法是直接调用它提供的 main.py 脚本。但为了在 Flask 应用里灵活控制,我封装了一个调用层,直接使用腾讯云 SDK:
# engine/skill_3d.py
import json, time, os
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.ai3d.v20250513 import ai3d_client, models
class Hunyuan3DEngine:
def __init__(self):
secret_id = os.getenv("TENCENTCLOUD_SECRET_ID")
secret_key = os.getenv("TENCENTCLOUD_SECRET_KEY")
cred = credential.Credential(secret_id, secret_key)
http_profile = HttpProfile(endpoint="ai3d.tencentcloudapi.com")
client_profile = ClientProfile()
client_profile.httpProfile = http_profile
self.client = ai3d_client.Ai3dClient(cred, "", client_profile)
def generate_from_text(self, prompt: str, rarity: str = "N") -> dict:
"""文生3D,根据稀有度调整参数"""
req = models.SubmitHunyuanTo3DProJobRequest()
# 高稀有度用3.1模型 + PBR + 高面数
if rarity in ("SSR", "UR"):
req.Model = "3.1"
req.EnablePBR = True
req.FaceCount = 800000
else:
req.Model = "3.0"
req.EnablePBR = False
req.FaceCount = 300000
req.Prompt = prompt
req.GenerateType = "Normal"
# 提交任务
resp = self.client.SubmitHunyuanTo3DProJob(req)
job_id = resp.JobId
# 轮询等待结果(通常1~5分钟)
result = self._poll_result(job_id)
return result
def generate_from_sketch(self, image_url: str, prompt: str = "") -> dict:
"""草图生3D"""
req = models.SubmitHunyuanTo3DProJobRequest()
req.ImageUrl = image_url
req.GenerateType = "Sketch"
req.Prompt = prompt
req.Model = "3.0"
resp = self.client.SubmitHunyuanTo3DProJob(req)
return self._poll_result(resp.JobId)
def _poll_result(self, job_id: str, interval: int = 10, timeout: int = 600) -> dict:
"""轮询查询任务状态"""
req = models.QueryHunyuanTo3DProJobRequest()
req.JobId = job_id
elapsed = 0
while elapsed < timeout:
resp = self.client.QueryHunyuanTo3DProJob(req)
status = resp.Status
if status == "DONE":
files = []
for f in resp.ResultFile3Ds:
files.append({
"type": f.Type,
"url": f.Url,
"preview": f.PreviewImageUrl,
})
return {"status": "success", "files": files, "job_id": job_id}
elif status == "FAIL":
return {"status": "fail", "error": resp.ErrorMessage}
time.sleep(interval)
elapsed += interval
return {"status": "timeout", "job_id": job_id}
由于混元3D生成的文件 URL 有效期只有 24 小时。我的做法是拿到 URL 后立即下载 GLB 文件存到本地,在应用里提供本地访问。一开始没注意这个,第二天打开发现模型全 404 了。
另一个值得分享的经验是模型版本和面数的选择。3.0 版本速度快(通常 1-2 分钟),但细节相对粗糙;3.1 版本质量明显更好,但等待时间会到 3-5 分钟。我的策略是 N/R 级别用 3.0 快速出,SR 以上用 3.1 + PBR + 高面数,让稀有度不仅体现在 prompt 上,也体现在模型精度上。这样用户抽到 SSR/UR 时能明显感受到"物有所值"。
5.3 角色 DNA 生成与 TTS 配音
光有 3D 模型还不够,盲盒角色得有"灵魂"。我设计了一个角色 DNA 系统,为每个盲盒生成姓名、稀有度、性格标签和一段自我介绍文本,然后调用 TTS 合成语音搞定。
考虑到用户上传的手绘草图质量参差不齐——有用手机拍的、有光线偏暗的、有背景杂乱的。直接传给混元3D的 Sketch 模式,生成效果很不稳定。我的解决方案是加入人像分割 Skill 做预处理:先用 tencentcloud-yt-segment-portrait 把草图主体从背景中分离出来,生成透明背景的 PNG,再传给3D生成。这一步对草图质量的提升非常明显,尤其是一些背景杂乱的手绘稿。
六、效果展示与体验
完成后效果如下。
打开首页会看到五个主题系列的选择界面。
选中一个后点击"开盒",进入等待页面(约1-3分钟)
…
然后"叮——!"盲盒咔嚓一下打开,3D模型旋转亮相,角色语音响起,旁边展示角色卡片——姓名、稀有度、性格、背景故事。


最后还可以在收藏架上看到已经抽取到的角色。
角色是混元3D生成不仅可以360度自动旋转展示,还能全方位无死角旋转,并且支持导出模型功能,易于鉴赏和二次加工。
我连续测试了 50 次开盒,统计了一些数据:
| 稀有度 | 出现次数 | 平均生成耗时 | 模型质量评价 |
|---|---|---|---|
| N(普通) | 21 | 1.2 min | 基础造型,纹理简单 |
| R(稀有) | 14 | 1.5 min | 增加配件,颜色更丰富 |
| SR(超稀有) | 10 | 2.8 min | 双配件,PBR材质 |
| SSR(传说) | 4 | 3.5 min | 精细细节,粒子特效 |
| UR(神秘) | 1 | 4.2 min | 3.1模型,最高质量 |
整体出率与预设概率基本吻合吧,UR 略高于预期,可能是样本量不够,毕竟说实话烧得都是我的混元3Dtoken啊!
回顾一下
我在做这个项目时候最大的感受是:腾讯云 AI Skills 把多模态 AI 能力的使用门槛拉得非常低。
混元3D、TTS、OCR、人像分割,每一个 Skill 单独拿出来都能做一个独立应用,但组合在一起的化学反应远大于简单相加——3D 让盲盒"有形",TTS 让盲盒"有声",OCR 让盲盒"能读图",人像分割让盲盒"能识人"。
整个项目从想法到可运行的原型,大概花了2天左右。代码量不到 1000 行,如果没有这些封装好的 Skill,从零对接四个腾讯云 API 的复杂度至少要翻几倍。
我觉得Skill 的价值就主要体现在这里了——它不是简单的封装API ,还包括一些用法层面的东西,比如混元3D Skill 里关于模型版本选择、面数配置、生成类型推荐的说明,帮我少走了很多弯路。
后续我打算做几个扩展:比如一是加入"盲盒图鉴"功能,把收集到的角色做成 3D 展示柜;二是可以接入人脸融合 Skill,让用户能把自己的脸贴到 3D 角色上;三是做一个"盲盒交换"功能,不同用户之间可以交易角色。如果说再大胆一点,甚至可以做成一个 3D 虚拟展厅,用 WebXR 在 VR 里看盲盒!等我下个月有闲钱了再继续。
本期的实践就到这里,目标实现,完美收工!谢谢大家收看!
更多推荐




所有评论(0)