跳到正文
RadarAI· Hugging Face 社区博客(混合发现)·· 2 小时前AI 评分38

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

AI 导读

开发者基于 NVIDIA Nemotron Voice Agent 搭建万圣节互动投影 MonsterHouse,由 Nemotron ASR 听、Nemotron 3.5 Bolt E4B 4GB 对话、Magpie TTS Zeroshot 发声、Audio2Face-3D 驱动嘴部动画,全部跑在一台工作站上。

正文 · AI 翻译

Hugging Face 社区博客·2026-10-31 01:57· 28 分钟前AI 评分49

nemotron-halloween

AI 导读

开发者基于 NVIDIA Nemotron Voice Agent 搭建万圣节互动投影 MonsterHouse,由 Nemotron ASR 负责听、Nemotron 3.5 Bolt E4B 4GB 负责对话、Magpie TTS Zeroshot 负责发声、Audio2Face-3D 驱动嘴部动画,全部跑在一台工作站上。

正文 · 原文

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

更确切地说……

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

BlogThumbnail

TL;DR:MonsterHouse 是我为万圣节制作的互动投影。它会倾听“不给糖就捣蛋”的孩子们,用一艘脾气暴躁的老海盗船的嗓音回应,而当访客记得讲礼貌时,它又会软化下来。它基于 NVIDIA Nemotron Voice Agent 构建,搭配 NVIDIA Nemotron ASR、Nemotron 3.5 Bolt E4B 4GB、Magpie TTS Zeroshot 和 Audio2Face-3D,并且运行在一台工作站上。

我希望万圣节来我家做客的孩子们能以有趣而独特的方式互动。这座房子要负责发糖,但脾气暴躁多过吓人。不知怎的,我的解决方案是给车库门装上一张嘴,并教它抱怨。

于是就有了 MonsterHouse:一座脾气暴躁的老建筑,满口海盗故事,咧着火焰般的笑容,还有一个对“请”字毫无抵抗力的可疑弱点。NVIDIA Nemotron Voice Agent 提供对话基础。Nemotron Speech 负责听,Bolt E4B 是大脑,NVIDIA Magpie TTS Zeroshot 是实时嗓音,NVIDIA Audio2Face-3D 让那张木头嘴开口说话。

Monster House 的工作原理

满是木刺的咧嘴笑

嘴是第一个做出来的。我想象着木质车库门的木板裂成参差不齐的嘴唇,每当他张开那张被诅咒的嘴,地狱的熊熊火焰便从门后照亮车道。他需要看起来古老、富有表现力,并且对访客的存在略感不悦。

fireMouth一座有满肚子话要说的房子的几种表情。

制作自定义动画绑定是这次搭建中较为费力的部分之一。在把它反复折腾到服帖之后,我就能导出 Audio2Face-3D 之后可以驱动的面部表情形状。角色 SkelMesh 在 Autodesk Maya 中构建,然后导出到 Unreal Engine,在门后添加了虚拟火焰和特效。没有眼睛、没有眉毛、也不眨眼,他出人意料地是个省成本的怪物。

在打造这个角色的种种琐事进行的同时,NVIDIA 构建了 Nemotron Voice Agent。原本应该是构建中最困难的部分,现在变得相当有趣、可迭代且轻松。我开箱即拥有了聆听、对话和语音的基础。这座房子已经有了嘴巴。现在他终于可以找到一些可以抱怨的事情了。

教坏规矩

这座房子需要一个和它性格一样暴躁的过去,所以我设计了一个背景故事:这座房子是用一艘沉没的海盗船的木材建造的,被其暴风雨般的过去所困扰。那些航海式的抱怨现在有了理由。这就是那艘船,转世成了房地产,而且对此并不完全满意。

表演需要一个指南,一条从问候到告别的路径,同时沿途提供奖励。首先,房子会用“我正忙着抱怨呢,去烦邻居吧!”之类的话打发访客。但坚持会让他软化。一句“请”可以立即突破,而“谢谢”则能赢得温暖的告别。一旦访客赢得了他,我希望他能保持被赢得的状态。没人想和同一扇车库门谈判两次。

这就是 Voice Agent 真正出彩的地方。你可以选择任何你喜欢的 LLM。因为我希望系统离线且完全自包含,所以我有内存和计算预算。

这个角色需要的不仅仅是一个说“脾气暴躁”的提示。它必须遵循主对话流程,回应访客实际说的话,跟踪遭遇状态,并为管道的其余部分留出足够的计算资源。

在测试了十多个模型后,我选择了 Bolt E4B 来提供实时对话。它是一个开放的小型语言模型,专为本地对话代理和交互式角色而构建,这恰好是对一扇会说话的车库门的合理描述。我使用 4 位量化版本(名称中的“4GB”)作为默认响应模型,并提供 BF16 检查点 用于比较。

如果到现在还不明显的话,我在 NVIDIA 工作,因此我能够在 Bolt E4B 公开发布之前进行测试,并发现它是一个可靠的选择,比其他领跑者——Qwen3 30B-A3B 和 Qwen 3.6 35B-A3B——的占用更小。

它在 Nemotron Voice Agent 管道内工作,将访客说的话转化为下一个恰如其分的不情愿的回复。

Bolt 提供了对话基础。我的提示、应用逻辑以及在数千个经过审查的示例对话上训练的 LoRA 适配器,将其塑造成这艘特定的固执之船。

创建一个包含超过 5000 个多轮对话的数据集意味着我可以为我感觉足够好、可以作为选项的每个模型训练 LoRA。有些训练了大约一个小时,有些则花了几个小时。一个本地代理运行一切并对结果进行基准测试。那个代理和一个非常大的 LLM 最初创建并评判了数据集。这发生在晚上或我做日常工作的时候。

有了 LoRA,我检查回复的连续性、时机和语气,对模型和适配器的质量、重复和速度进行基准测试,然后聆听表演。房子最终应该让步,但不会变成一个愉快的礼宾员。一点抵抗是魅力的一部分。与车库门无休止的争论则不是。

值得等待的声音

image两条捷径,两种输出。预置文本跳过全新的对话生成,已保存的音频跳过语音合成。干净语音单独驱动动画,与观众音效分开处理。

如果抱怨得太久,鬼屋就会失去威严。流水线在完整回答尚未生成完毕前就发布可朗读文本,因此房子可以在句子剩余部分还在传输时就开始说话。预先准备的问候语和糖果笑话覆盖了常见互动:文本库节省了语言模型的工作量,缓存录音节省了语音合成。就连一个古老的脾气暴躁者也能从排练中受益。

median end-of-speech-to-audio with Bolt Q4 & TTS = 1.70 seconds
median end-of-speech-to-audio cached responses = 0.72 seconds
(note: speech-end detection currently waits for 300 ms of silence )

NVIDIA Magpie TTS Zeroshot 将文本转换为女王英语。其零样本语音条件使用短参考样本而非训练过的声音;我的样本提供了脾气暴躁的海盗角色。房子有七种情绪,从暴躁、威胁到愉悦、欣喜,由提示模板指定、由 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 上。内存不是问题,算力才是。我希望无论智能体流水线在做什么处理,动画都能保持一致的帧率。

语音、动画和效果必须同步到位。一个有说服力的怪物需要的不仅仅是一个快速回答;它需要听起来像是这栋建筑在抱怨。在我的情况下,他确实做到了。同步音频输出的调整是可用的。我发现我可以设置一次就不用再管了。(100ms 补偿 Audio2Face-3D 的缓冲)

怪物有一个控制台

在这一过程中,“让房子说话”需要一个充满控件的界面。我可以试听缓存台词、调整开场情绪、跟踪对话、更改声音处理和调整嘴部动画。选项卡涵盖对话、模型选择、录音、提示词、性能监控和摄像头画面,音板与自定义对话字段让我可以把话塞进他嘴里。还有模型加载控件和 Unreal Engine 连接指示器,因为有时候怪物不是在生闷气。他是断开了连接。

imageMonsterHouse 控制台,带有音板、自定义台词、开场情绪和对话流程。

火焰与光效也加入了表演。可编辑规则将视觉提示与输出绑定:实时提示从语音开始,而录制的表演可以跟随保存的时间线。我可以直接引导情绪变化,而无需重建场景。

实时模式运行“不给糖就捣蛋”角色。演示模式说服房子解释自己。麦克风模式让我直接通过房子说话,绕过识别、对话生成和语音合成。我清晰的原声驱动嘴部动作;观众听到的是处理后的版本。房子认为这是附身。我认为这是一个有用的备用方案。

下一次敲门

NVIDIA Nemotron 3 Nano Omni 是一个 VLM,为房子提供视觉上下文。作为可选的观察者,它解读摄像头图像并描述可见的服装,让角色有具体的东西可以回应。我不想重新发明每一个轮子,因此选择了流行的目标检测与跟踪模型 YOLO 和 ByteTrack 来统计和跟踪当前视野中的人。将这些任务分开,让房子能注意到一群人,而无需让 Omni 描述每一帧。

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

image合成测试回放中五只毛茸茸的“不给糖就捣蛋”访客。服装标签来自保存的 Omni 分析;框和跟踪 ID 仅为示意。

这些羊是合成测试,并非万圣节之夜成功的证据。真实的车道人群、服装和夜间照明仍需测试。检测确实会触发自动问候,但我担心流行服装识别和恰到好处的机智回应可能需要一些后训练。由于房子没有眼睛,他称自己的访客感知为回声定位。这一点我就让他保留吧。

还有更多要做:动画总能改进,完整的性能测试需要真实访客,糖果终有一天会自动提供。我还没有达到最初的目标——让他负责万圣节,而我带着家人去看其他街区的鬼怪。但这仍然是这一切的意义所在。总有一天,一个孩子会遇到一座脾气暴躁的老房子,尝试一点善意,然后发现老木头也有柔软的一面。而且还会发糖果棒。

打造你自己的不合理角色

MonsterHouse 代码本身并未打包发布,但它使用的每一个 NVIDIA 模型如今都可用,而 NVIDIA Nemotron Voice Agent 能帮你完成大部分工作。这是我会遵循的路径。

  1. 从语音流水线开始。克隆 NVIDIA Nemotron Voice Agent 并运行 Generic Assistant 示例。你会得到一个级联流水线,包含 Nemotron Speech ASR、一个 LLM 和 Magpie TTS,外加语音活动检测和话语结束处理,让你的角色知道何时说话。
  2. 让 Bolt E4B 成为大脑。Voice Agent 包含面向云、服务器和单 GPU 部署的 Bolt E4B 配置。你可以先在 build.nvidia.com 上试用该模型。尝试对话模式以获得简短、适合语音的回复,并对简单交流禁用推理。
  3. 赋予它个性。从系统提示和几段已连接的示例对话开始。把对话状态(例如谁已经说过“请”)保存在你的应用里,而不是让模型去记住。当提示不够用时,训练一个 LoRA 适配器;NVIDIA NeMo AutoModel 提供了适用于 Bolt E4B 的 LoRA 配方。
  4. 赋予它声音。Magpie TTS Multilingual 是 Voice Agent 的默认选项。若要自定义角色,Magpie TTS Zeroshot 可基于一段简短的参考样本工作。在 build.nvidia.com 上试用,并申请访问权限以自行运行。[CONFIRM: access path and link] 仅使用你已获授权使用的声音。
  5. 赋予它面孔。NVIDIA Audio2Face-3D 可将语音转换为角色的面部动画。向它输入干净的语音,之后再添加效果。
  6. 可选:赋予它眼睛。Voice Agent 的 Nemotron Omni Assistant Subagents 示例通过 Nemotron 3 Nano Omni 增加了实时网络摄像头理解能力。如果你需要计数,可搭配一个轻量级的人员跟踪器。

为最常用的台词准备缓存响应库和预存音频,能让即使反应慢的怪物也显得迅速。事实上,如果你恰好受限于算力,完全可以做一个 Live 版本,只使用 Nemotron Speech ASR、一个 Python 对话路由器和全部缓存音频。你可以用 Bolt E4B 和 Magpie 流水线离线生成数百条响应,然后在演出时使用缓存。我会为互动南瓜这样做。

资源

来源:Hugging Face 社区博客 · huggingface.co

来源:RadarAI · aihot.news