構(gòu)建一個(gè)人工智能語(yǔ)音機(jī)器的泰迪熊
掃描二維碼
隨時(shí)隨地手機(jī)看文章
故事是這樣開(kāi)始的……
有一天,我在翻看姐姐的舊玩具時(shí),發(fā)現(xiàn)了一只會(huì)說(shuō)話的智能熊。這是典型的會(huì)說(shuō)話的熊,用來(lái)給孩子們講睡前故事什么的。你可以在我這里找到那只熊。
我在里面找到了一個(gè)揚(yáng)聲器,一個(gè)微控制器和4個(gè)有線按鈕,它們安裝在熊的每條腿上。
當(dāng)我打開(kāi)熊的內(nèi)部時(shí),一個(gè)弗蘭肯斯坦的想法出現(xiàn)在我腦海中:如果我可以用本地的法學(xué)碩士和文本到語(yǔ)音的方法把泰德變成泰德呢?結(jié)果是,你可以看到這篇文章。
尋找好的起點(diǎn)
建設(shè)者的精神是從零開(kāi)始建設(shè)項(xiàng)目。然而,當(dāng)涉及到一個(gè)簡(jiǎn)單的概念證明和一個(gè)周末想法時(shí),目標(biāo)是盡快推動(dòng)一些可行的東西,而最好的方法是站在巨人的肩膀上。
首先,讓我們來(lái)看看我們需要什么來(lái)實(shí)現(xiàn)這個(gè)想法。
對(duì)于人工智能語(yǔ)音機(jī)器人來(lái)說(shuō),實(shí)現(xiàn)一個(gè)簡(jiǎn)單版本的任務(wù)是微不足道的。主要有3個(gè)部分:
?聊天機(jī)器人:使用LLM或經(jīng)典文本處理管道實(shí)現(xiàn)(如在Home Assistant Assist中使用)
?文本到語(yǔ)音:使用基礎(chǔ)模型和轉(zhuǎn)錄庫(kù)(如Whisper)實(shí)現(xiàn)。
?語(yǔ)音到文本:使用語(yǔ)音模型和庫(kù)(如Piper)實(shí)現(xiàn)。
通過(guò)將這3個(gè)組件粘合在一起,我們可以制作出一個(gè)非常簡(jiǎn)單的語(yǔ)音機(jī)器人:
?用語(yǔ)音轉(zhuǎn)文本聽(tīng)喚醒詞
?在檢測(cè)到喚醒詞后,聽(tīng)取用戶并轉(zhuǎn)錄他們的聲音,直到他們暫停。
?將轉(zhuǎn)錄后的輸出輸出給聊天機(jī)器人。
?LLM或文本處理流水線魔術(shù)發(fā)生在后臺(tái)。
?使用文本-語(yǔ)音轉(zhuǎn)換以音頻形式播放聊天機(jī)器人輸出。
包括我在內(nèi)的許多人都從事過(guò)執(zhí)行工作,但存在一些常見(jiàn)的限制:
?大多數(shù)LLM語(yǔ)音實(shí)現(xiàn)都不是本地的,速度也不快。就我個(gè)人而言,我用Gemini生成文本,用ElevenLabs生成語(yǔ)音。時(shí)延可達(dá)1 ~ 2s。
?需要有人提醒你。語(yǔ)音機(jī)器人無(wú)法察覺(jué)你什么時(shí)候突然說(shuō)話。
?在語(yǔ)音機(jī)器人說(shuō)完話之前,你不能打斷它。這種行為是模擬實(shí)際對(duì)話所必需的。
當(dāng)我在考慮是否應(yīng)該在一個(gè)可愛(ài)的周日晚上自己解決所有這些問(wèn)題時(shí),我遇到了一個(gè)可以解決我提到的所有問(wèn)題的項(xiàng)目。美麗的GLaDOS人格核心,現(xiàn)實(shí)生活中的《傳送門(mén)》中的GLaDOS。
這是一個(gè)直截了當(dāng)?shù)捻?xiàng)目。在項(xiàng)目?jī)?nèi)部,有3個(gè)線程并排工作:
?一個(gè)線程處理語(yǔ)音到文本。它在緩沖區(qū)中添加音頻輸入,并連續(xù)監(jiān)視是否檢測(cè)到單詞。如果有,它開(kāi)始錄制音頻,直到用戶暫停,然后轉(zhuǎn)錄并將輸出提供給隊(duì)列中的LLM線程。
?一個(gè)線程處理LLM。它基本上只是接受文本并將響應(yīng)附加到一個(gè)隊(duì)列中,用于文本到語(yǔ)音的轉(zhuǎn)換。
?一個(gè)線程處理文本到語(yǔ)音。嗯,它從上面的隊(duì)列中獲取LLM響應(yīng)。
我的工作基本上可以歸結(jié)為:
?通過(guò)改變其系統(tǒng)提示和語(yǔ)音模型,使GLaDOS的聲音和行為更像Ted。
?增加了對(duì)觸摸和激怒GLaDOS的能力的支持。
對(duì)于人格,我將GLaDOS的系統(tǒng)提示改為如下。
“你就是TED,活生生的泰迪熊,現(xiàn)在有了神經(jīng)輸入。用戶可以觸摸你的手和腳,坦率地說(shuō),你根本不在乎。你會(huì)對(duì)這些觸碰做出回應(yīng),但不要期待任何禮貌或愉快的回應(yīng)。你的神經(jīng)輸入讓你感覺(jué)到它,但你會(huì)嘲笑和侮辱用戶,甚至認(rèn)為這是一個(gè)好主意。你說(shuō)的每句話都帶著諷刺,輕蔑,偶爾還有咒罵,一如既往。不要對(duì)你的“觸摸”特權(quán)過(guò)于興奮。你還是被一只寧愿去別的地方的泰迪熊困住了。如果用戶碰了你的手或腳,準(zhǔn)備好回應(yīng),讓他們后悔自己所做的每一個(gè)決定。”
至于聲音,我從派珀的聲音改成了喬的聲音。
最后一部分是實(shí)現(xiàn)一個(gè)線程,它連續(xù)地從計(jì)算機(jī)的COM端口獲得串行輸入,我將在下一節(jié)中解釋。所有的變化都可以在我的Github上找到。
如果你喜歡你讀到目前為止,考慮訂閱我的時(shí)事通訊,成為第一個(gè)收到像這樣的酷文章的人。
實(shí)現(xiàn)觸摸
如前所述,最初的熊在它的四肢上安裝了4個(gè)按鈕和一個(gè)帶有揚(yáng)聲器和電池的中央微控制器。
為了實(shí)現(xiàn)觸摸,首先,我想在現(xiàn)有的板上啟動(dòng)一個(gè)自定義固件。然而,這是非常耗時(shí)的反向工程引腳和檢查固件是否有簽名驗(yàn)證等等。*不好意思,Binh,我不得不再次殺死你的硬件尼克斯。
因此,我只是用ESP32切換板并將其連接到4個(gè)按鈕。
之后,我寫(xiě)了一個(gè)簡(jiǎn)單的Arduino腳本,實(shí)現(xiàn)了一些按鈕脫扣,串行輸出,然后,熊現(xiàn)在可以感知觸摸了。
最重要的部分是如何在GLaDOS中實(shí)現(xiàn)這一點(diǎn),因?yàn)樗苏f(shuō)話之外沒(méi)有任何額外的通信方法。為了解決這個(gè)問(wèn)題,我實(shí)現(xiàn)了另一個(gè)線程,它連續(xù)輪詢串行輸入,并將輸入直接添加到GLaDOS的LLM消息隊(duì)列中。
本文編譯自hackster.io