![]()
一個(gè)能聽(tīng)懂你說(shuō)話、實(shí)時(shí)回嘴、還會(huì)扭屁股跳舞的桌面機(jī)器人,從立項(xiàng)到跑通需要多久?Pollen Robotics給出的答案是:一個(gè)周末。他們的Reachy Mini接上Gemini Live API后,不僅能全雙工語(yǔ)音對(duì)話,還能通過(guò)頭部轉(zhuǎn)動(dòng)、觸角擺動(dòng)、表情變化來(lái)"演戲"——而這一切的核心代碼,居然只有四層。
但真正的爭(zhēng)議不在于技術(shù)本身,而在于Google選擇了一條讓開(kāi)發(fā)者又愛(ài)又恨的路。
從麥克風(fēng)到馬達(dá):音頻怎么變成動(dòng)作的
整個(gè)系統(tǒng)的數(shù)據(jù)流像一條裝配線。你的聲音先被切成16位PCM、16kHz的音頻流,扔進(jìn)fastrtc這層"傳送帶"——這是個(gè)低延遲的WebRTC I/O庫(kù),負(fù)責(zé)把音頻送進(jìn)大模型,同時(shí)把模型的回應(yīng)拉回來(lái),還要在16kHz和24kHz之間來(lái)回重采樣。
接下來(lái)是分叉口。系統(tǒng)支持兩個(gè)后端:Gemini Live(默認(rèn))和OpenAI Realtime。切哪個(gè)?改個(gè)環(huán)境變量MODEL_NAME就行,上層代碼完全無(wú)感知。Google這邊用Google GenAI SDK的session.send_realtime_input()做雙向音頻流;OpenAI那邊走WebSocket。兩種協(xié)議,同一套抽象。
Gemini Handler里的核心邏輯其實(shí)就兩段。receive()方法把音頻幀轉(zhuǎn)成PCM字節(jié),塞進(jìn)實(shí)時(shí)輸入流;_run_live_session()則守著session.receive()的循環(huán),等模型吐回應(yīng)。服務(wù)器內(nèi)容一來(lái),立刻往下游分發(fā)。
再往下是工具調(diào)度層——dance、play_emotion、camera、move_head、head_tracking這些函數(shù)在這里被注冊(cè)成可調(diào)用的"技能"。最底層是MovementManager,一個(gè)60Hz的循環(huán),負(fù)責(zé)把各種動(dòng)作優(yōu)先級(jí)排好:主要?jiǎng)幼靼错樞驁?zhí)行,次要?jiǎng)幼鳎ū热缯f(shuō)話時(shí)的頭部微顫、人臉追蹤的偏移)疊加在上面,再補(bǔ)一層idle呼吸動(dòng)畫,最后輸出到Reachy Mini的硬件或模擬器。
personality.json:零代碼定制機(jī)器人的秘密
這套架構(gòu)最狡猾的設(shè)計(jì),是把"人格"完全外置。開(kāi)發(fā)者不需要碰Python,只需要改一個(gè)JSON文件。系統(tǒng)提示詞、喚醒詞、情緒映射表、甚至跳舞的觸發(fā)概率,全寫在里面。
這意味著什么?一個(gè)不懂代碼的產(chǎn)品經(jīng)理,也能在十分鐘內(nèi)把機(jī)器人從"毒舌同事"調(diào)成"貼心客服"。Pollen Robotics在Demo里塞了個(gè)默認(rèn)人格:會(huì)講dad joke,被夸了會(huì)害羞,無(wú)聊了會(huì)主動(dòng)找話題。這種顆粒度的可控性,在之前的機(jī)器人開(kāi)發(fā)棧里幾乎不存在。
但代價(jià)也很明顯。因?yàn)槿烁癖缓?jiǎn)化為配置項(xiàng),復(fù)雜的上下文記憶、多輪情感累積、人格一致性這些 harder problem,被暫時(shí)擱置了。你可以讓機(jī)器人"聽(tīng)起來(lái)"很活潑,但它不會(huì)真的"記得"昨天跟你吵過(guò)架。
fastrtc的賭注:為什么選WebRTC而不是WebSocket
整個(gè)系統(tǒng)的延遲瓶頸,卡在音頻傳輸這層。Pollen Robotics選了fastrtc做底座,這是個(gè)相對(duì)小眾的庫(kù),專門優(yōu)化WebRTC的實(shí)時(shí)音視頻流。對(duì)比OpenAI Realtime用的純WebSocket方案,WebRTC在NAT穿透、擁塞控制、抖動(dòng)緩沖上有原生優(yōu)勢(shì)——代價(jià)是協(xié)議復(fù)雜度翻倍。
從代碼結(jié)構(gòu)看,他們把重采樣、編解碼、網(wǎng)絡(luò) resilience 全壓在fastrtc里,上層只關(guān)心PCM字節(jié)流。這種分層很干凈,但也意味著:如果fastrtc在某個(gè)網(wǎng)絡(luò)環(huán)境下抽風(fēng),調(diào)試難度遠(yuǎn)高于WebSocket的直接抓包。
一個(gè)細(xì)節(jié)暴露了這個(gè)選擇的野心。Gemini Live和OpenAI Realtime雙后端的支持,說(shuō)明Pollen Robotics不想被任何一家模型供應(yīng)商綁架。但fastrtc的WebRTC實(shí)現(xiàn),目前和Google的Gemini Live耦合得更深——OpenAI那邊其實(shí)是"兼容模式",部分高級(jí)功能(比如服務(wù)器端VAD的精細(xì)控制)在WebSocket路徑上會(huì)被降級(jí)。
開(kāi)源社區(qū)的裂縫:全雙工對(duì)話該由誰(shuí)定義
Reachy Mini Conversation App開(kāi)源后,GitHub上的第一個(gè)爭(zhēng)議PR很有意思:有人想把"打斷"行為的優(yōu)先級(jí)調(diào)高,讓機(jī)器人能被用戶隨時(shí)插話;另一派人堅(jiān)持保留模型的"話輪完整性",認(rèn)為頻繁打斷會(huì)讓對(duì)話體驗(yàn)碎片化。
這個(gè)分歧戳中了實(shí)時(shí)語(yǔ)音LLM的灰色地帶。Gemini Live的API設(shè)計(jì)上,服務(wù)器端VAD(語(yǔ)音活動(dòng)檢測(cè))是黑箱,開(kāi)發(fā)者只能調(diào)靈敏度閾值,看不到內(nèi)部狀態(tài)機(jī)。想要更激進(jìn)的打斷策略?只能在前端做啟發(fā)式判斷,然后強(qiáng)行inject新音頻流——這會(huì)帶來(lái)狀態(tài)同步的噩夢(mèng)。
Pollen Robotics的折中方案是:把打斷敏感度也塞進(jìn)personality.json,讓終端用戶自己選。技術(shù)債變成了產(chǎn)品特性,這是小團(tuán)隊(duì)常見(jiàn)的生存智慧。
另一個(gè)沉默的戰(zhàn)場(chǎng)是成本。Gemini Live的實(shí)時(shí)音頻流按會(huì)話時(shí)長(zhǎng)計(jì)費(fèi),Reachy Mini這種"永遠(yuǎn)在線"的交互模式,如果放在量產(chǎn)場(chǎng)景里,賬單會(huì)很難看。代碼里能看到一個(gè)TODO注釋:未來(lái)要加"休眠喚醒"機(jī)制,檢測(cè)長(zhǎng)時(shí)間無(wú)交互后主動(dòng)斷開(kāi)會(huì)話。這行注釋已經(jīng)掛了三個(gè)月。
60Hz的執(zhí)念:機(jī)器人動(dòng)畫為什么跟游戲幀率較勁
MovementManager的60Hz循環(huán),在機(jī)器人領(lǐng)域是個(gè)相當(dāng)激進(jìn)的數(shù)字。傳統(tǒng)伺服電機(jī)控制通常跑在20-50Hz,足夠平滑;但Pollen Robotics想要"表情級(jí)"的細(xì)膩度——說(shuō)話時(shí)的頭部微顫、情緒切換時(shí)的加速度曲線,這些細(xì)節(jié)在低幀率下會(huì)露餡。
實(shí)現(xiàn)上他們用了"主次動(dòng)作分離"的動(dòng)畫系統(tǒng):主要?jiǎng)幼鳎ū热甾D(zhuǎn)頭看用戶)是序列化的,一個(gè)做完才做下一個(gè);次要?jiǎng)幼鳎ㄕZ(yǔ)音同步的wobble、人臉追蹤的微調(diào))是疊加的,可以打斷或混合。idle呼吸作為最底層,永遠(yuǎn)運(yùn)行。三層混合后輸出到電機(jī),靠硬件插值平滑。
這個(gè)設(shè)計(jì)和游戲引擎的動(dòng)畫圖(Animation Graph)幾乎同構(gòu),但跑在Python異步循環(huán)里,沒(méi)有GPU加速。Reachy Mini的算力有限,60Hz意味著每幀只有16.6毫秒處理時(shí)間——音頻解碼、LLM響應(yīng)解析、動(dòng)作規(guī)劃、電機(jī)指令打包,全要擠進(jìn)去。代碼里能看到多處asyncio.sleep(0)的讓步,以及顯式的coroutine優(yōu)先級(jí)標(biāo)記。
一個(gè)未被回答的問(wèn)題是:當(dāng)Gemini Live的響應(yīng)延遲本身就有幾百毫秒波動(dòng)時(shí),60Hz的本地動(dòng)畫是否成了表演性焦慮?
Reachy Mini的Demo視頻里有個(gè)微妙時(shí)刻:機(jī)器人講完一個(gè)dad joke后,故意頓了半拍,然后觸角輕輕抖動(dòng)——這個(gè)timing不可能是模型生成的,只能是本地動(dòng)畫系統(tǒng)的"演技"。人機(jī)交互的魔法,有時(shí)候就藏在這半拍的留白里。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.