跳到主要內容
maxstudioNews
AI 自動化Hugging Face Blog約 9 分鐘

打造會說話的萬聖節鬼屋:NVIDIA Nemotron 開源模型應用實例

作者利用 NVIDIA Nemotron 系列開源模型,為萬聖節打造了一個名為「MonsterHouse」的互動式投影裝置。這座鬼屋能聽懂訪客說話,以脾氣暴躁的海盜船長語氣回應,並在訪客有禮貌時態度軟化。整個系統在單一工作站上運行,展現了多模態 AI 的整合應用。

打造會說話的萬聖節鬼屋:NVIDIA Nemotron 開源模型應用實例
圖片來源:Hugging Face Blog

或者說…

「Boo!現在給我滾出我的草坪!」

總結來說,MonsterHouse 是我為萬聖節創作的一個互動式投影裝置。它會傾聽來訪的「不給糖就搗蛋」小孩說話,以脾氣暴躁的老海盜船語氣回應,並在訪客記得禮貌時態度軟化。

這個裝置基於 NVIDIA Nemotron 語音代理(Voice Agent)建構,整合了 NVIDIA Nemotron ASR、Nemotron 3.5 Bolt E4B 4GB、Magpie TTS Zeroshot 和 Audio2Face-3D,並在單一工作站上運行。

我希望來我家過萬聖節的孩子們能以一種有趣且獨特的方式互動。這棟房子將負責發放糖果,但它的個性會是脾氣暴躁而非嚇人。不知怎的,我的解決方案是給車庫門一張嘴,並教它抱怨。

這就成了 MonsterHouse:一棟脾氣暴躁的老建築,會講海盜故事,有著火熱的笑容,並且對「請」這個詞有著可疑的弱點。NVIDIA Nemotron 語音代理提供了對話基礎。Nemotron Speech 負責聆聽,Bolt E4B 是大腦,NVIDIA Magpie TTS Zeroshot 提供即時語音,而 NVIDIA Audio2Face-3D 則讓木製的嘴巴開口說話。

MonsterHouse 的運作方式

聆聽:NVIDIA Nemotron Speech 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 轉接器。

有些訓練大約需要一個小時,有些則需要幾個小時。一個本地代理運行所有內容並對結果進行基準測試。該代理和一個非常大的 LLM 從一開始就創建並判斷了資料集。這是在晚上或我白天工作時完成的。

LoRA 轉接器到位後,我會檢查回覆的連貫性、時機和語氣,對模型和轉接器進行品質、重複性和速度的基準測試,然後聆聽其表現。房子最終應該會讓步,但不會變成一個開朗的禮賓員。一點點的抵抗是其魅力的一部分。與車庫門無休止的爭論則不是。

值得等待的聲音

兩個捷徑,兩個輸出。預先撰寫的文字跳過新的對話生成,而儲存的音訊則跳過合成。清晰的語音獨立於觀眾效果驅動動畫。

如果鬼屋抱怨太久,它就會失去權威性。管道會在整個答案完成之前釋放可說的文字,因此房子可以在句子的其餘部分仍在生成時就開始說話。預先準備好的問候語和糖果笑話涵蓋了常見的互動:文字庫節省了語言模型的工作,而快取錄音則節省了語音合成。即使是古老的脾氣暴躁者也能從排練中受益。

語音結束到音訊的平均時間(使用 Bolt Q4 和 TTS)為 1.70 秒。

語音結束到快取回應音訊的平均時間為 0.72 秒。

(注意:語音結束偵測目前會等待 300 毫秒的靜音)

NVIDIA Magpie TTS Zeroshot 將文字轉換為標準英語。它的零樣本語音條件化使用簡短的參考樣本而不是訓練過的語音;我的樣本提供了脾氣暴躁的海盜角色。房子有七種情緒,從脾氣暴躁和威脅到有趣和高興,而由提示詞模板指定並由 LLM 提供的情緒標籤則決定了每句話的傳達方式。

由於每種情緒都需要不同的 3-10 秒語音樣本,我在 UI 的工具標籤上添加了一個「錄製您的聲音」區塊。然後我可以用我最好的快樂海盜或憤怒海盜聲音讀取並錄製一行樣本文字。當「開始」時,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 緩衝)。

怪物有一個控制台

在某個時候,「讓房子說話」需要一個充滿控制項的介面。我可以試聽快取語句、調整開場情緒、追蹤對話、改變語音處理方式並調整嘴部動畫。標籤頁涵蓋了對話、模型選擇、錄音、提示詞、效能監控和攝影機畫面,而音效板和自訂對話欄位則讓我可以為它輸入文字。還有模型載入控制項和 Unreal Engine 連線指示器,因為有時候怪物不是在鬧脾氣,而是斷線了。

MonsterHouse 控制台,包含音效板、自訂語句、開場情緒和對話流程。

火焰和光芒也加入了表演。可編輯的規則將視覺線索與語音傳遞綁定:即時線索隨語音開始,而錄製的表演則可以遵循儲存的時間軸。我可以在不重建場景的情況下指導情緒的變化。即時模式運行「不給糖就搗蛋」的角色。演示模式說服房子解釋自己。麥克風模式讓我可以透過房子直接說話,繞過語音辨識、對話生成和語音合成。我的清晰語音驅動嘴巴;觀眾聽到的是經過處理的版本。房子認為這是被附身了。我認為這是一個有用的備用方案。

下一個敲門聲

NVIDIA Nemotron 3 Nano Omni 是一個 VLM,為房子提供了視覺上下文。作為一個可選的觀察者,它解釋攝影機圖像並描述可見的服裝,以便角色可以對特定事物做出反應。為了避免重複造輪子,我選擇了流行的物件偵測和追蹤模型 YOLO 和 ByteTrack 來計算和追蹤目前視野中的人物。將這些工作分開,讓房子可以在不要求 Omni 敘述每一幀的情況下注意到一群人。

為了進行一個適當荒謬的測試,我給 Omni 播放了一段五隻穿著服裝的羊在門口的影片。它儲存的分析識別出海盜、吸血鬼、女巫、南瓜和幽靈服裝。這正是我希望房子使用的視覺上下文。顯然,即使是牲畜也有比我更精心的萬聖節計畫。

在合成測試重播中,五隻毛茸茸的「不給糖就搗蛋」訪客。服裝標籤來自儲存的 Omni 分析;方框和追蹤 ID 僅供說明。

這些羊是合成測試,而不是萬聖節夜晚成功的證據。真實的車道群體、服裝和夜間照明仍需要測試。偵測確實會觸發自動問候,但我擔心時尚服裝識別和適當機智的回應可能需要一些後續訓練。由於房子沒有眼睛,它將其訪客意識稱為「迴聲定位」。我讓它保留這個說法。

還有更多工作要做:動畫總是可以改進,完整的效能測試需要真實的訪客,並且糖果總有一天會自動提供。我尚未達到最初的目標,即讓它在萬聖節自行運行,而我則可以和家人一起去拜訪其他鄰居的鬼怪。但這仍然是所有這一切的重點。總有一天,一個孩子會遇到一棟脾氣暴躁的老房子,嘗試一點善意,並發現這塊老木頭有一個軟肋。而且它會發放糖果。

Share

覺得值得一看?分享給朋友。

以上為 AI 自動翻譯導讀。原文版權歸 Hugging Face Blog 所有, 建議透過「閱讀原文」前往原始網站,以取得最完整資訊並支持原作者。

Newsletter

不用每天追,AI 重點每週寄給你

43 個來源、每 2 小時更新,太多看不完。電子報每週挑最值得看的幾則,附上 Max 的看法。

每週一封。Email 只用來寄電子報,每封信都能一鍵退訂。