基于Vosk與Reachy SDK的離線語音控制機械臂系統(tǒng)設計與實現(xiàn)
1. 從“會動的玩具”到“能對話的伙伴”Reachy Mini的語音控制探索最近在搗鼓一個挺有意思的項目核心是把一個叫Reachy Mini的桌面機器人通過語音指令來控制它的SO-ARM機械臂。乍一聽這像是個高級玩具或者一個簡單的“聲控開關(guān)”。但實際做下來我發(fā)現(xiàn)這背后其實是一個相當?shù)湫偷摹败浻布f(xié)同”與“人機交互”的微型實驗場。它遠不止是讓機械臂動起來那么簡單而是涉及到如何讓一個物理實體理解并執(zhí)行人類的自然語言指令這個過程充滿了工程上的細節(jié)和思考。Reachy Mini本身是一個開源的、模塊化的機器人平臺它的SO-ARM是一條具有7個自由度的仿生機械臂靈活性很高。而“語音控制”這四個字拆解開來其實就是“語音識別”“指令解析”“動作執(zhí)行”的完整鏈路。我的目標不是做一個復雜的、能理解千言萬語的AI而是實現(xiàn)一套穩(wěn)定、可靠、延遲低的本地化語音控制流程讓Reachy Mini能成為你桌面上一個真正“聽話”的助手幫你遞個小工具、擺個pose甚至完成一些簡單的協(xié)同操作。這篇文章我會把我從零搭建這套系統(tǒng)的完整過程、踩過的坑、以及一些優(yōu)化心得記錄下來。無論你是機器人愛好者、嵌入式開發(fā)者還是對人機交互感興趣的朋友相信都能從中找到一些可以直接“抄作業(yè)”的實操細節(jié)和避坑指南。我們不止講“怎么做”更會深入聊聊“為什么這么做”以及“還有哪些可以做得更好”。2. 項目核心架構(gòu)與工具選型為什么是它們在動手寫第一行代碼之前花時間在架構(gòu)設計上是絕對值得的。一個清晰的架構(gòu)能讓你在后續(xù)開發(fā)中少走很多彎路。對于“Reachy Mini語音控制SO-ARM”這個目標我將其分解為三個核心層感知層、決策層和執(zhí)行層。感知層負責“聽”和“聽懂”。這里我們需要一個語音識別引擎。市面上選擇很多比如云端的科大訊飛、百度語音或者本地的Vosk、Whisper。我最終選擇了Vosk。原因有幾個首先它完全離線運行無需網(wǎng)絡隱私性好延遲極低本地處理幾乎無感。其次它模型小巧資源占用少非常適合在樹莓派或類似Reachy Mini主控這樣的邊緣設備上運行。最后它支持多種語言并且社區(qū)活躍。雖然它的識別精度在復雜環(huán)境下可能略遜于大型云端模型但對于我們預設的、在相對安靜環(huán)境下的簡短指令詞如“拿起”、“向左”、“回家”Vosz的準確率完全夠用且穩(wěn)定性是云端方案無法比擬的。決策層是大腦負責把識別出的文字轉(zhuǎn)換成Reachy Mini能理解的指令。這部分完全由我們自定義。我們需要定義一個“指令詞典”并編寫一個“指令解析器”。例如當Vosk識別出“手臂抬起”時解析器需要將其映射為一個具體的動作函數(shù)調(diào)用比如arm.move_to(pose_lifted)。這里的關(guān)鍵在于設計一套簡潔、無歧義的指令集并處理好可能的模糊匹配和糾錯。執(zhí)行層就是Reachy Mini本身及其SDK。Reachy官方提供了完善的Python SDKreachy-sdk它封裝了與機器人硬件通信的所有細節(jié)。我們通過SDK可以輕松地控制每個關(guān)節(jié)的角度、速度或者讓機械臂移動到某個預設的笛卡爾空間坐標。這一層對我們來說是黑盒我們只需要學會如何正確、安全地調(diào)用它的API。整個數(shù)據(jù)流是這樣的麥克風采集音頻 - Vosk模型識別為文本 - 自定義指令解析器處理文本 - 生成對應的Reachy SDK函數(shù)調(diào)用 - 通過USB/網(wǎng)絡發(fā)送指令給Reachy Mini主控 - 機械臂執(zhí)行動作。這個鏈路看起來簡單但每個環(huán)節(jié)都有優(yōu)化空間。注意工具選型沒有絕對的對錯只有適合與否。如果你的應用場景需要極高的識別率且不介意網(wǎng)絡延遲和隱私問題云端方案是可行的。但考慮到機器人控制的實時性和可靠性本地離線方案是我認為更優(yōu)的基石。3. 環(huán)境搭建與依賴部署一步一坑的實戰(zhàn)記錄理論清晰了接下來就是實戰(zhàn)。我的開發(fā)環(huán)境是一臺Ubuntu 20.04的PC通過USB連接到Reachy Mini。機器人系統(tǒng)已經(jīng)預裝了Reachy OS。我們的工作主要是在PC上完成邏輯處理然后通過SDK控制機器人。3.1 Reachy SDK安裝與初體驗首先需要在開發(fā)機上安裝Reachy的SDK。官方推薦使用pip安裝。pip install reachy-sdk安裝完成后最重要的第一步是測試連接。這里我遇到了第一個坑權(quán)限問題。直接運行示例連接代碼可能會報錯提示無法訪問USB設備如果你使用USB連接或網(wǎng)絡端口。from reachy_sdk import ReachySDK try: reachy ReachySDK(hostlocalhost) # USB連接時host通常是localhost或127.0.0.1 print(fConnected to Reachy! Part names: {[part.name for part in reachy.parts]}) except Exception as e: print(fConnection failed: {e})解決方案你需要將你的用戶添加到dialout組USB串口設備所屬組并重新登錄。sudo usermod -a -G dialout $USER然后你需要確保Reachy Mini的reachy_sdk_server服務正在運行。通過SSH登錄到Reachy Mini默認密碼是reachy檢查服務狀態(tài)ssh reachyreachy.local # 假設機器人主機名是reachy.local sudo systemctl status reachy-sdk-server如果服務未運行啟動它sudo systemctl start reachy-sdk-server sudo systemctl enable reachy-sdk-server # 設置開機自啟連接成功后你可以嘗試讓機械臂動一下比如讓某個關(guān)節(jié)運動。這里有一個至關(guān)重要的安全注意事項在讓機械臂做大范圍運動前務必確保機械臂周圍有足夠的空間并且你隨時可以按下機器人身上的急停按鈕。先讓關(guān)節(jié)緩慢移動一個小角度。# 連接成功后獲取右臂對象 right_arm reachy.r_arm # 獲取肩部俯仰關(guān)節(jié)不同版本關(guān)節(jié)名可能略有不同請查閱文檔 shoulder_pitch right_arm.shoulder_pitch # 讓該關(guān)節(jié)以10度/秒的速度運動到30度的位置 shoulder_pitch.goal_position 30.0 shoulder_pitch.torque_limit 0.3 # 設置較低的扭矩限制動作更柔和安全 # 等待動作完成簡單示例實際應用需要更完善的等待邏輯 import time time.sleep(2.0)3.2 Vosz離線語音識別引擎部署接下來是語音部分。安裝Vosz相對簡單但模型下載需要一點技巧。pip install voskVosz的核心是聲學模型和語言模型。對于中文我們需要下載對應的模型。Vosz官網(wǎng)提供了多種規(guī)模的模型模型越大精度越高但資源消耗也越大。對于我們的指令詞場景小型模型足矣。# 創(chuàng)建一個目錄存放模型 mkdir -p ~/models/vosk cd ~/models/vosk # 下載小型中文模型約40MB wget https://alphacephei.com/vosk/models/vosk-model-small-cn-0.22.zip unzip vosk-model-small-cn-0.22.zip現(xiàn)在我們可以寫一個最簡單的腳本來測試語音識別。這個腳本會實時監(jiān)聽麥克風并打印識別結(jié)果。import sys import os import json from vosk import Model, KaldiRecognizer import pyaudio # 1. 加載模型 model_path os.path.expanduser(~/models/vosk/vosk-model-small-cn-0.22) if not os.path.exists(model_path): print(fModel not found at {model_path}) sys.exit(1) model Model(model_path) # 2. 配置音頻流 p pyaudio.PyAudio() stream p.open(formatpyaudio.paInt16, channels1, rate16000, inputTrue, frames_per_buffer4000) stream.start_stream() # 3. 創(chuàng)建識別器 rec KaldiRecognizer(model, 16000) rec.SetWords(True) # 可選返回每個詞的時間戳 print(開始語音識別請說話...按CtrlC停止) try: while True: data stream.read(2000, exception_on_overflowFalse) if len(data) 0: break if rec.AcceptWaveform(data): # 識別出一句完整的話 result json.loads(rec.Result()) text result.get(text, ) if text: print(f識別結(jié)果: {text}) else: # 部分結(jié)果可以用于實時反饋如顯示“正在聆聽...” partial json.loads(rec.PartialResult()) # print(partial.get(partial, )) except KeyboardInterrupt: print(\n停止識別) finally: stream.stop_stream() stream.close() p.terminate()運行這個腳本對著麥克風說“你好世界”或“打開手臂”你應該能看到控制臺打印出識別出的文字。如果遇到pyaudio安裝問題在Ubuntu上可以嘗試sudo apt-get install portaudio19-dev python3-pyaudio。4. 核心橋梁指令解析器的設計與實現(xiàn)語音識別出來了文字如何變成機械臂的動作這就是指令解析器的任務。設計一個好的解析器直接決定了整個系統(tǒng)的易用性和魯棒性。4.1 定義指令集與動作映射首先我們需要定義一個有限的、清晰的指令集。不要試圖一開始就理解所有自然語言那是ChatGPT干的事。我們做的是“命令與控制”。我的指令集設計如下基礎動作指令對應機械臂的預設位姿?;丶?復位讓機械臂運動到安全的初始姿態(tài)。就緒運動到一個便于開始工作的中間姿態(tài)。展示做一個展示性的動作如揮手。方向控制指令用于微調(diào)。向上/向下/向左/向右/向前/向后控制末端執(zhí)行器或某個關(guān)節(jié)沿某個方向移動一小段距離。任務指令結(jié)合場景。拿起筆執(zhí)行一個抓取桌上筆的序列動作。放下松開夾持器如果安裝了并復位。每一個指令在代碼中都對應一個具體的函數(shù)。例如class ReachyController: def __init__(self, reachy): self.reachy reachy self.arm reachy.r_arm # 假設我們控制右臂 # 定義一些預設位姿角度制。這些值需要你根據(jù)實際機械臂校準。 self.pose_home {shoulder_pitch: 0.0, shoulder_roll: 0.0, arm_yaw: 0.0, elbow_pitch: -90.0, hand_roll: 0.0, hand_yaw: 0.0, wrist_pitch: 0.0} self.pose_ready {shoulder_pitch: 45.0, shoulder_roll: 0.0, arm_yaw: 0.0, elbow_pitch: -90.0, hand_roll: 0.0, hand_yaw: 0.0, wrist_pitch: 0.0} def go_home(self): 移動機械臂到初始位置 for joint_name, angle in self.pose_home.items(): joint getattr(self.arm, joint_name) joint.goal_position angle joint.torque_limit 0.4 print(指令執(zhí)行回家) def go_ready(self): 移動機械臂到就緒位置 for joint_name, angle in self.pose_ready.items(): joint getattr(self.arm, joint_name) joint.goal_position angle joint.torque_limit 0.4 print(指令執(zhí)行就緒) def move_direction(self, direction, step5.0): 向指定方向微調(diào)末端。這是一個簡化示例實際需用逆解算或坐標控制。 # 這里為了簡單我們直接控制某個關(guān)節(jié)作為示例 if direction 向上: self.arm.wrist_pitch.goal_position step elif direction 向下: self.arm.wrist_pitch.goal_position - step # ... 其他方向 print(f指令執(zhí)行向{direction}移動)4.2 文本匹配與模糊處理識別出的文本不可能百分之百準確。“手臂回家”可能被識別成“手臂回價”。因此解析器需要有一定的容錯能力。我采用了“關(guān)鍵詞匹配”結(jié)合“相似度計算”的方法。首先為每個指令定義一組可能的關(guān)鍵詞或同義詞。command_keywords { go_home: [回家, 復位, 初始位置, 原點], go_ready: [就緒, 準備, 待命], move_up: [向上, 往上, 抬高], move_down: [向下, 往下, 降低], # ... 其他指令 }然后當識別出一句話后我們遍歷所有指令的關(guān)鍵詞列表計算這句話中是否包含這些關(guān)鍵詞。為了提高容錯可以使用簡單的字符串包含檢查或者更高級的使用difflib.SequenceMatcher計算相似度。import difflib def parse_command(text, command_keywords, threshold0.6): 解析語音文本返回最匹配的命令。 :param text: 識別出的文本 :param command_keywords: 指令關(guān)鍵詞字典 :param threshold: 相似度閾值低于此值則認為不匹配 :return: (command_name, matched_keyword) 或 (None, None) best_match None best_score 0 matched_keyword None for cmd, keywords in command_keywords.items(): for kw in keywords: # 使用簡單包含檢查快速 if kw in text: return cmd, kw # 或者使用相似度檢查更魯棒但稍慢 # score difflib.SequenceMatcher(None, kw, text).ratio() # if score best_score and score threshold: # best_score score # best_match cmd # matched_keyword kw # 如果使用相似度檢查則返回 best_match # return best_match, matched_keyword # 如果使用包含檢查且未找到則返回None return None, None在實際應用中我推薦先做快速的關(guān)鍵詞包含檢查如果匹配不上再對剩余文本進行相似度計算以平衡響應速度和容錯能力。5. 系統(tǒng)集成與主循環(huán)讓一切運轉(zhuǎn)起來現(xiàn)在我們把語音識別、指令解析和機器人控制這三塊拼圖整合起來。主程序的結(jié)構(gòu)是一個事件循環(huán)語音監(jiān)聽線程持續(xù)從麥克風獲取音頻送入Vosz識別器。當識別出一句完整的話rec.AcceptWaveform返回True就將識別文本放入一個線程安全的隊列中。主控制線程從隊列中取出文本調(diào)用指令解析器。如果解析出有效指令則調(diào)用對應的ReachyController方法執(zhí)行動作。狀態(tài)反饋可以在控制臺或一個簡單的GUI上顯示當前狀態(tài)如“聆聽中...”、“已識別回家”、“執(zhí)行中...”。這里有一個重要的細節(jié)機器人動作執(zhí)行是阻塞的。如果你直接在主線程中調(diào)用go_home()它會發(fā)送目標位置并立即返回但機械臂需要時間運動。如果你在它運動過程中又發(fā)送了新指令可能會造成沖突。因此需要一種簡單的動作隊列或狀態(tài)機機制。一個簡單的實現(xiàn)是使用一個current_action狀態(tài)變量和action_queue隊列。import threading import queue import time class VoiceControlSystem: def __init__(self, reachy): self.reachy reachy self.controller ReachyController(reachy) self.cmd_queue queue.Queue() self.is_busy False # 機械臂是否正在執(zhí)行動作 self.running True # 初始化語音識別 self.model Model(~/models/vosk/vosk-model-small-cn-0.22) self.rec KaldiRecognizer(self.model, 16000) self.audio_interface pyaudio.PyAudio() self.stream self.audio_interface.open(formatpyaudio.paInt16, channels1, rate16000, inputTrue, frames_per_buffer4000) self.stream.start_stream() def audio_listening_thread(self): 語音監(jiān)聽線程 print(語音監(jiān)聽線程啟動) while self.running: data self.stream.read(2000, exception_on_overflowFalse) if len(data) 0: continue if self.rec.AcceptWaveform(data): result json.loads(self.rec.Result()) text result.get(text, ).strip() if text: print(f[語音識別] {text}) self.cmd_queue.put(text) # 將識別結(jié)果放入隊列 # 可以在這里處理PartialResult做實時反饋 def command_processing_thread(self): 指令處理線程 print(指令處理線程啟動) while self.running: try: # 等待隊列中的指令超時時間設為0.5秒以便循環(huán)檢查running標志 text self.cmd_queue.get(timeout0.5) except queue.Empty: continue if self.is_busy: print(f系統(tǒng)忙忽略指令: {text}) continue cmd, _ parse_command(text, command_keywords) if cmd: print(f[指令解析] 執(zhí)行命令: {cmd}) self.execute_command(cmd) else: print(f[指令解析] 無法理解: {text}) def execute_command(self, cmd_name): 執(zhí)行命令并設置忙碌狀態(tài) self.is_busy True try: if cmd_name go_home: self.controller.go_home() elif cmd_name go_ready: self.controller.go_ready() elif cmd_name move_up: self.controller.move_direction(向上) # ... 其他命令 # 等待動作完成這里簡化處理實際應根據(jù)關(guān)節(jié)位置反饋判斷 time.sleep(2.0) # 根據(jù)動作復雜程度調(diào)整 except Exception as e: print(f執(zhí)行命令 {cmd_name} 時出錯: {e}) finally: self.is_busy False def run(self): 啟動系統(tǒng) listen_thread threading.Thread(targetself.audio_listening_thread, daemonTrue) process_thread threading.Thread(targetself.command_processing_thread, daemonTrue) listen_thread.start() process_thread.start() print(語音控制系統(tǒng)已啟動。) try: while self.running: time.sleep(0.1) except KeyboardInterrupt: print(\n正在關(guān)閉系統(tǒng)...) self.running False self.stream.stop_stream() self.stream.close() self.audio_interface.terminate() listen_thread.join(timeout1.0) process_thread.join(timeout1.0) print(系統(tǒng)已關(guān)閉。) # 主程序入口 if __name__ __main__: # 1. 連接機器人 reachy ReachySDK(hostlocalhost) # 2. 創(chuàng)建并運行語音控制系統(tǒng) vcs VoiceControlSystem(reachy) vcs.run()這個架構(gòu)雖然簡單但已經(jīng)具備了核心功能異步的語音監(jiān)聽、指令隊列、簡單的忙狀態(tài)管理。運行這個程序你就可以通過說出“回家”、“就緒”、“向上”等指令來控制Reachy Mini的機械臂了。6. 深度優(yōu)化與避坑指南從“能用”到“好用”項目跑通只是第一步。要讓這個系統(tǒng)穩(wěn)定、可靠、用戶體驗好還需要大量的優(yōu)化工作。下面是我在實戰(zhàn)中總結(jié)的幾個關(guān)鍵點和踩過的坑。6.1 語音識別優(yōu)化降噪與喚醒詞背景噪聲是離線語音識別最大的敵人。在辦公室環(huán)境下鍵盤聲、空調(diào)聲、旁人談話聲都會干擾識別。Vosz小型模型的抗噪能力有限。解決方案硬件層面使用指向性麥克風能顯著減少環(huán)境噪聲。USB接口的會議麥克風是個不錯的選擇。軟件層面在音頻送入Vosz前進行預處理。一個簡單有效的方法是靜音檢測VAD。只有檢測到人聲時才將音頻數(shù)據(jù)送入識別器可以避免大量無意義的背景噪聲被識別成亂碼。Python的webrtcvad庫可以很方便地實現(xiàn)這一點。設置喚醒詞像智能音箱一樣先說一個喚醒詞如“小雷”再說指令。這能極大降低誤觸發(fā)率。實現(xiàn)方式是在指令解析器中首先檢查文本是否以喚醒詞開頭如果是則剝離喚醒詞后再解析后續(xù)指令。# 簡單的喚醒詞檢查 WAKE_WORD 小雷 def check_wake_word(text): if text.startswith(WAKE_WORD): return text[len(WAKE_WORD):].strip() # 返回去除喚醒詞后的指令部分 return None # 在主處理循環(huán)中 cleaned_text check_wake_word(text) if cleaned_text: # 解析 cleaned_text cmd, _ parse_command(cleaned_text, command_keywords) # ... 執(zhí)行命令 else: # 不是喚醒詞開頭的指令可以選擇忽略或記錄日志 pass6.2 機械臂運動控制優(yōu)化平滑與安全直接給關(guān)節(jié)設置目標角度機械臂會以最大速度“沖”過去動作生硬且危險。解決方案使用軌跡規(guī)劃Reachy SDK提供了更高級的goto方法可以指定目標位姿和運動時間SDK內(nèi)部會進行平滑插值。務必使用這種方式代替直接設置goal_position。from reachy_sdk.trajectory import goto # 定義目標位姿字典格式鍵為關(guān)節(jié)名值為目標角度 home_pose {joint.name: 0 for joint in reachy.r_arm.joints} # 舉例實際角度需校準 # 在3秒內(nèi)平滑運動到home_pose goto({reachy.r_arm: home_pose}, duration3.0)設置合理的扭矩限制在goto或操作單個關(guān)節(jié)時始終設置一個保守的torque_limit如0.3-0.5。這相當于給機械臂一個“力量上限”一旦遇到意外阻力超過這個限制電機就會停止避免損壞物體或傷及自身。實現(xiàn)急停和暫停在主循環(huán)中監(jiān)聽鍵盤事件如空格鍵一旦觸發(fā)立即調(diào)用reachy.turn_off_smoothly()或?qū)⑺嘘P(guān)節(jié)的torque_limit設為0讓機械臂軟癱。這是安全底線。6.3 指令解析的進階上下文與參數(shù)提取最初的指令集是簡單的“動詞”。但更自然的交互可能是“向左移動一點”或“抬起五厘米”。這就需要解析器能提取指令中的參數(shù)。實現(xiàn)思路使用正則表達式或更簡單的字符串分割來提取關(guān)鍵詞和數(shù)值。import re def parse_command_with_args(text): # 模式1方向 量詞 如“向左一點”“向上五厘米” pattern1 re.compile(r(向上|向下|向左|向右|向前|向后)(移動)?(一點|一些|(\d)(厘米|度)?)?) match pattern1.search(text) if match: direction match.group(1) amount match.group(4) # 數(shù)字部分 unit match.group(5) # 單位部分 step 5.0 # 默認步長 if amount: step float(amount) if unit 厘米: # 這里需要將厘米轉(zhuǎn)換為關(guān)節(jié)角度或坐標偏移涉及運動學此處簡化 step step * 0.5 # 假設一個換算系數(shù) return {cmd: move_direction, args: {direction: direction, step: step}} # 模式2基礎指令 if 回家 in text: return {cmd: go_home} # ... 其他基礎指令匹配 return None這樣當你說“向左三厘米”時系統(tǒng)就能理解并執(zhí)行一個精確的微調(diào)。這大大提升了控制的精細度和自然度。6.4 多線程與資源管理陷阱在集成系統(tǒng)中多線程是必須的但也容易出錯。我遇到的一個典型問題是在語音監(jiān)聽線程中直接調(diào)用機器人控制函數(shù)。這會導致音頻流因等待機器人動作而阻塞產(chǎn)生丟幀或異常。黃金法則語音采集和識別線程只負責生產(chǎn)指令文本將其放入隊列。一個獨立的控制線程從隊列中消費指令并負責調(diào)用所有涉及硬件IO如機器人SDK、GPIO的操作。這樣能保證音頻流的實時性和硬件控制的線程安全。另一個坑是資源清理。程序退出時必須確保音頻流被正確關(guān)閉機器人關(guān)節(jié)扭矩被安全關(guān)閉reachy.turn_off_smoothly()。否則麥克風可能被占用導致下次啟動失敗機械臂也可能保持在上電狀態(tài)。7. 項目總結(jié)與未來展望回顧整個項目從連接機器人、調(diào)試語音識別到設計指令系統(tǒng)、解決多線程問題最后進行各種優(yōu)化是一個完整的軟硬件集成開發(fā)流程。最大的收獲不是讓機械臂動了起來而是在這個過程中對系統(tǒng)魯棒性和用戶體驗細節(jié)有了更深的理解。一個演示時能跑通的Demo和一個可以穩(wěn)定運行半小時不出錯的系統(tǒng)中間隔著無數(shù)個細節(jié)的打磨。例如加入喚醒詞后誤觸發(fā)率下降了90%使用軌跡規(guī)劃代替直接位置控制后動作變得流暢優(yōu)雅實現(xiàn)了簡單的指令隊列和忙狀態(tài)檢測后再也不會出現(xiàn)指令覆蓋導致的機械臂抽搐。這些都不是核心功能但卻是產(chǎn)品化不可或缺的部分。這個項目還有巨大的擴展空間。比如視覺反饋接入一個USB攝像頭使用OpenCV做簡單的物體識別。指令可以升級為“夾住那個紅色的方塊”實現(xiàn)真正的“手眼協(xié)同”。更自然的交互集成一個本地運行的小型LLM如Phi-3 mini讓解析器不再依賴固定的關(guān)鍵詞而是能理解“把那個東西往左邊挪一挪”這樣的模糊指令。圖形化界面用PyQt或Web技術(shù)做一個控制面板實時顯示機械臂姿態(tài)、攝像頭畫面、識別日志并提供手動控制滑塊方便調(diào)試和演示。通過這個項目Reachy Mini從一個“會動的模型”真正變成了一個可以通過自然語言交互的智能體原型。它驗證了離線語音技術(shù)在機器人控制上的可行性也為更復雜的人機協(xié)作應用打下了一個堅實、可復用的基礎。如果你也有一臺Reachy Mini不妨按照這個思路試一試相信你會在動手實現(xiàn)的過程中獲得比我文字描述更多的樂趣和啟發(fā)。

相關(guān)新聞

一臺Mac也能跑Kimi K3!128GB內(nèi)存硬塞1.6TB權(quán)重

一臺Mac也能跑Kimi K3!128GB內(nèi)存硬塞1.6TB權(quán)重

Kimi K3 開放完整權(quán)重后,不少人都躍躍欲試。2.8 萬億參數(shù)、官方 MXFP4 權(quán)重,擁有了這些,你就可以自己搗鼓這個規(guī)模巨大的模型,可以部署到本地?,F(xiàn)實情況真有這么簡單嗎?有人總結(jié),運行 Kimi K3 其實很容易&a…

2026/8/2 10:25:21 閱讀更多
【數(shù)據(jù)分享】80 + 年連續(xù)觀測!1942–2025 全國 400 + 氣象站長時序觀測ISD-Lite 數(shù)據(jù)集(溫壓濕風云雨全要素)

【數(shù)據(jù)分享】80 + 年連續(xù)觀測!1942–2025 全國 400 + 氣象站長時序觀測ISD-Lite 數(shù)據(jù)集(溫壓濕風云雨全要素)

一、數(shù)據(jù)前言 市面上零散氣象站點素材普遍存在時序斷裂、站點篩選繁瑣、原始文件雜亂、多年份整合難度大等問題,本次整理一套 NOAA-NCDC 官方整編 ISD-Lite 氣象數(shù)據(jù)集,單獨篩選全國(含港澳臺)站點并按年份分包整理完畢,省去批量篩選、原始 FTP 爬取的繁瑣操作,可直接用于…

2026/8/2 11:45:24 閱讀更多
BetterNCM安裝器:3步解鎖網(wǎng)易云音樂的無限潛能

BetterNCM安裝器:3步解鎖網(wǎng)易云音樂的無限潛能

BetterNCM安裝器:3步解鎖網(wǎng)易云音樂的無限潛能 【免費下載鏈接】BetterNCM-Installer 一鍵安裝 Better 系軟件 項目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾幻想過,一個簡單的音樂播放器能夠變身成為功能強大的音樂…

2026/8/2 11:45:24 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應用材料(Applied Materials)公司生產(chǎn)的一款用于半導體設備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機,適用于自動化設備及通用機械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/2 2:52:49 閱讀更多