Heidi Labs
Hugging FaceAI 领域最新发展约 14 分钟5,652 字

用 NVIDIA Nemotron 开源模型打造万圣节鬼屋

本文目录

用 NVIDIA Nemotron 开源模型打造一座鬼屋#

或者更准确地说……

嘘!现在从我草坪上滚开!

TL;DR: MonsterHouse 是我为万圣节做的一个互动投影。他会聆听来讨糖的孩子们,用一艘脾气暴躁的老海盗船的嗓音回答,而当访客记得讲礼貌时,他就会软化下来。他构建在 NVIDIA Nemotron 语音智能体(Voice Agent)之上,使用了 NVIDIA Nemotron ASR、Nemotron 3.5 Bolt E4B 4GB、Magpie TTS Zeroshot 和 Audio2Face-3D,并且只在一台工作站上运行。

我希望万圣节来我家的孩子们能以有趣而独特的方式与房子互动。房子将掌管一切并分发糖果,但比起吓人,它更多是脾气坏。不知怎的,我的解决方案是给车库门装上一张嘴,然后教它抱怨。

这就成了 MonsterHouse:一座脾气暴躁的老建筑,满口海盗故事,咧嘴燃着火焰,还有一个可疑的软肋——听到“请”字就招架不住。NVIDIA Nemotron 语音智能体提供了对话基础。Nemotron 语音负责聆听,Bolt E4B 是大脑,NVIDIA Magpie TTS Zeroshot 提供实时嗓音,而 NVIDIA Audio2Face-3D 让那张木头嘴开口说话。

鬼屋如何运作#

聆听: NVIDIA Nemotron 3 ASR 将访客的语音转成文本。[nemotron-speech-streaming-en-0.6b.q8_0.gguf ]

思考: NVIDIA Nemotron 3.5 Bolt E4B 4GB 是一个面向对话智能体的开源小型语言模型,负责撰写每一句回复。一个 LoRA 适配器赋予它人格。

说话: NVIDIA Magpie TTS Zeroshot 根据这个角色的一小段参考音频样本,为每句回复配音。

动画: NVIDIA Audio2Face-3D 在 Unreal Engine 5 中把干净的语音转成嘴部动画。

观察: NVIDIA Nemotron 3 Nano Omni 描述服装,而 YOLO 与 ByteTrack 负责统计和跟踪访客。

运行: NVIDIA Nemotron 语音智能体在一台配备 NVIDIA RTX PRO 6000 Blackwell Max-Q 和 NVIDIA RTX PRO 4000 Blackwell 的工作站上统筹一切。

长满木刺的笑容#

嘴巴是最先做出来的。我想象车库门的木板裂开,变成参差不齐的嘴唇;每当他张开那张被诅咒的嘴,来自地狱的熊熊火焰便从门后照亮车道。他看起来必须古老、富有表现力,并且对访客的存在略感冒犯。

一座有满肚子话要说的房子,几副表情。

制作自定义动画绑定是整次搭建中较为耗费人力的环节之一。在把它反复敲打到服帖之后,我就能导出面部表情形状,供 Audio2Face-3D 之后做动画。角色骨骼网格体(SkelMesh)在 Autodesk Maya 中构建,随后导出到 Unreal Engine,并在门后添加了虚拟火焰和特效。没有眼睛、没有眉毛、也不眨眼,他是一个出奇省资源的怪物。

就在搭建角色的各种胡闹进行得如火如荼时,NVIDIA 构建了 Nemotron 语音智能体。原本应该是搭建中最困难的部分,如今变得相当有趣、可迭代而且简单。开箱即用,我就有了聆听、对话和语音的基础。房子已经有了一张嘴。现在他终于能找到点东西来抱怨了。

教它没礼貌#

这座房子需要一个和它脾气一样乖戾的过去,于是我编了一段背景故事:这座房子是用一艘沉没海盗船的木材建成的,被它暴风雨般的过往所萦绕。那些航海风格的抱怨于是有了理由。这就是那艘船,转世成了房地产,而且对此并不十分满意。

这场表演需要一个指南,一条从问候到道别的路径,同时沿途发放糖果。首先,房子会用诸如“我正忙着嘟囔呢,去烦邻居吧!”这样的话把访客打发走。但坚持会让他招架不住。一句“请”可以立刻突破防线,而“谢谢”则能换来温暖的告别。一旦访客赢得了他,我希望他就一直保持被打动。没人想和同一扇车库门谈判两次。

这正是语音智能体真正出彩的地方。你可以选择任何你喜欢的 LLM。因为我希望系统离网运行、完全自包含,所以要考虑内存和算力预算。

这个角色需要的不仅仅是一句“脾气坏一点”的提示词。它必须遵循一套主对话流程,对访客真正说出的内容作出回应,跟踪交互状态,并为流水线的其余部分留出足够的算力。

在测试了十几个模型之后,我最终选择 Bolt E4B 来提供实时对话。它是一个专门为本地对话智能体和互动角色打造的开源小型语言模型,而这恰恰是对一扇会说话的车库门的合理描述。我使用 4 位量化版本(名字里的“4GB”)作为默认回复模型,同时保留 BF16 检查点用于对比。

如果到现在还不明显的话——我在 NVIDIA 工作,因此我能在 Bolt E4B 公开发布前进行测试,并发现它是个稳妥的选择,占用空间比另外几个领先候选——Qwen3 30B-A3B 和 Qwen 3.6 35B-A3B——更小。

它在 Nemotron 语音智能体流水线中工作,把访客说的话转成下一句恰到好处的、不情不愿的回复。

Bolt 提供对话基础。我的提示词、应用逻辑以及在数千段经审核的示例对话上训练出的 LoRA 适配器,把它塑造成这艘特别固执的船。

构建一个超过 5000 轮多轮对话的数据集,意味着我可以为我认可的每个候选模型训练 LoRA。有些训练大约花一小时,有些要两小时。一个本地智能体跑完所有流程并对结果进行基准测试。这个智能体和一个大语言模型先创建并评判了这个数据集。这些工作是在夜里或我做白天工作时进行的。

LoRA 就位后,我会检查回复的连贯性、时机和语气,对模型和适配器在质量、重复和速度上做基准测试,然后听它的表演。房子最终应该让步,但不能变成一个热情洋溢的门房。一点点抵抗正是魅力所在。和一扇车库门没完没了地争吵则不是。

值得等待的声音#

两条捷径,两种输出。预置文本跳过实时对话生成,保存好的音频跳过语音合成。干净语音单独驱动动画,与面向观众的音效分离开来。

鬼屋如果抱怨得太慢,就会失去威严。流水线会在整个回答完成之前就吐出可朗读的文本,因此房子可以在句子的其余部分仍在路上时就开始说话。预先准备好的问候语和糖果笑话覆盖熟悉的互动场景:文本库节省语言模型的工作,缓存录音节省语音合成。就连一个古老的坏脾气家伙也能从排练中受益。

使用 Bolt Q4 与 TTS 时,语音结束到出声的中位延迟 = 1.70 秒

缓存回复时,语音结束到出声的中位延迟 = 0.72 秒

(注:目前语音结束检测会等待 300 毫秒的静音)

NVIDIA Magpie TTS Zeroshot 把文本变成一口纯正的英式英语(Queen's English)。它的零样本(zero-shot)声音条件化使用一小段参考样本,而不是训练过的音色;我提供的样本塑造了这个脾气暴躁的海盗角色。房子有七种情绪,从暴躁、凶恶到愉快、欣喜,而由提示词模板规定、并由 LLM 提供的情绪标签决定每句话如何呈现。由于每种情绪都需要一段不同的 3 到 10 秒声音样本,我在 UI 的工具标签页里加了一个“Sample your Voice”区块。这样我就能用自己最好的快乐海盗或愤怒海盗嗓音,朗读并录下一句样本。到了“开演”时刻,Bolt E4B 决定说什么,Magpie 则把这段文本转成带着恰当喜悦或绝望的语音。

流水线下一个是 Audio2Face-3D,以及我在 Epic 的 Unreal Engine 中创建的 3D 角色场景。默认模型权重在干净、中性的男声或女声上效果最好,不要太低沉,也不要太高(请根据你的使用场景选择合适的性别模型)。我希望房子拥有非常低沉、恶魔般、带混响和厅堂感的嗓音。在这种情况下,由于我的声音样本并没有那种戏剧性的厚重感,这反而是件好事。Audio2Face-3D 从样本中获得干净语音,而第二条音频流会叠加可调节的实时人声效果,通过扬声器播放出来。

为了让一切顺畅运行,我把工作分给两块 GPU:语言与语音模型流水线运行在 NVIDIA RTX PRO 6000 Blackwell Max-Q 上,Unreal Engine 图形与 Audio2Face-3D 运行在 NVIDIA RTX PRO 4000 Blackwell 上。内存不是问题,算力才是。我希望无论智能体流水线在做什么处理,动画都能保持一致的帧率。

语音、动画和特效必须同时到位。一个有说服力的怪物需要的不仅是快速回答;它还需要听起来像是这栋建筑本人在抱怨。在我的案例里,他做到了。同步音频输出的微调选项是可用的。我发现可以设好之后就忘了它。(100 毫秒用于补偿 Audio2Face-3D 的缓冲)

怪物有一张控制台#

不知不觉间,“让房子说话”就需要一个满是控件的界面。我可以试听缓存的台词、调整开场情绪、跟踪对话、改变声音处理方式,并微调嘴部动画。标签页涵盖对话、模型选择、录音、提示词、性能监控和摄像头画面,而一个音板(soundboard)和自定义对话输入框让我可以往他嘴里塞词。还有模型加载控件和一个 Unreal Engine 连接指示灯,因为有时候怪物不是在生闷气,而是断连了。

MonsterHouse 控制台,包含音板、自定义台词、开场情绪和对话流程。

火焰和辉光也加入了表演。可编辑的规则把视觉线索与台词输出绑定:实时线索随语音开始,而录制表演可以跟随一条保存好的时间线。我可以在不重建场景的情况下指挥情绪变化。

实时模式(Live mode)运行讨糖角色。演示模式(Demo mode)说服房子解释他自己。麦克风模式(Microphone mode)让我直接通过房子说话,绕过语音识别、对话生成和语音合成。我干净的嗓音驱动嘴巴;观众听到的是处理后的版本。房子认为这是附身。我认为这是个有用的后备方案。

下一次敲门#

NVIDIA Nemotron 3 Nano Omni 是一个视觉语言模型(VLM),为房子提供视觉上下文。作为一个可选的观察者,它解读摄像头图像并描述可见的服装,让角色有具体的东西可以回应。不想重新发明每一个轮子,我选择了流行的目标检测与跟踪模型 YOLO 和 ByteTrack,来统计和跟踪当前出现在画面中的人。把这两项工作分开,可以让房子注意到一群人,而不必让 Omni 逐帧解说。

为了一个足够荒诞的测试,我给 Omni 看了一段五只穿戏服的羊站在门口的视频。它保存下来的分析识别出了海盗、吸血鬼、女巫、南瓜和幽灵装。这正是我希望房子利用的那类视觉上下文。显然,就连牲畜的万圣节计划都比我的更精心。

一段合成测试回放中,五只毛茸茸的讨糖者。服装标签来自保存的 Omni 分析;边界框和跟踪 ID 仅作示意。

这些羊只是合成测试,并不能证明万圣节之夜取得了成功。真实的车道人群、服装和夜间照明仍需要测试。检测确实会触发自动问候,但我担心识别时兴的服装并给出恰如其分的机智回击,可能还需要一些后训练(post training)。由于房子没有眼睛,他把自己对访客的感知称为回声定位。这一点我由着他。

还有更多事情要做:动画总能改进,完整的表演测试需要真实访客,而糖果有一天会自动发放。我还没有实现最初的目标——把他留下主持万圣节,而我和家人出门去看邻居家的其他鬼怪。但这仍然是一切的意义所在。总有一天,会有一个孩子遇见一座脾气暴躁的老房子,试着付出一点善意,然后发现这栋老木头其实有颗柔软的心。还会递出糖果棒。

打造你自己的不讲理角色#

MonsterHouse 的代码本身没有打包发布,但它用到的每一个 NVIDIA 模型如今都可以获取,而 NVIDIA Nemotron 语音智能体能帮你走完大部分路程。这是我会遵循的路径。

从语音流水线开始#

克隆 NVIDIA Nemotron 语音智能体并运行 Generic Assistant 示例。你会得到一个级联流水线,包含 Nemotron Speech ASR、一个 LLM 和 Magpie TTS,外加语音活动检测和话语结束处理,这样你的角色就知道什么时候该说话。

让 Bolt E4B 当大脑#

语音智能体包含面向云端、服务器和单 GPU 部署的 Bolt E4B 配置。你可以先在 build.nvidia.com 上试用这个模型。对于简短、可直接朗读的回复,试试对话模式(conversational mode),对于更简单的交流,关闭推理。

赋予它人格#

从一段系统提示词和几段相互关联的示例对话开始。把对话状态——比如谁已经说过“请”——保存在你的应用里,而不是要求模型记住它。当提示词不够用时,训练一个 LoRA 适配器;NVIDIA NeMo AutoModel 提供了 Bolt E4B 的 LoRA 配方。

给它一副嗓音#

Magpie TTS Multilingual 是语音智能体的默认选项。若要定制角色,Magpie TTS Zeroshot 可以基于一小段参考样本工作。在 build.nvidia.com 上试用,并申请访问权限以便自行运行。[CONFIRM: access path and link] 只使用你有权使用的声音。

给它一张脸#

NVIDIA Audio2Face-3D 把语音转成你角色的面部动画。喂给它干净的语音,之后再添加特效。

可选:给它眼睛#

语音智能体的 Nemotron Omni Assistant Subagents 示例通过 Nemotron 3 Nano Omni 加入实时摄像头理解。如果你需要人数统计,把它与一个轻量级人员跟踪器配对。

一个缓存回复库加上最常见台词的保存音频,会让即便行动迟缓的怪物也显得敏捷。事实上,如果你恰好受算力限制,完全没理由不做这样一个实时版本:只用 Nemotron 3 ASR、一个 Python 对话路由器,外加全部缓存音频。你可以用 Bolt E4B 和 Magpie 流水线离线生成数百条回复,然后用缓存来演出。我打算对互动南瓜也这么做。

资源#

  • NVIDIA Nemotron Voice Agent(GitHub 与 build.nvidia.com)
  • NVIDIA Nemotron 3.5 Bolt E4B 4GB(Hugging Face 及其技术博客)
  • NVIDIA Nemotron 3 ASR(流式,英语)
  • NVIDIA Magpie TTS Zeroshot
  • NVIDIA Audio2Face-3D
  • NVIDIA Nemotron 3 Nano Omni