棧構(gòu)建本地化語音助手:從Whisper到Qwen的實踐指南)
1. 項目概述從“Speak2Me”看語音交互的平民化實踐“Speak2Me”這個名字聽起來就帶著一股子親切感仿佛在說“來跟我說說話”。這其實是我最近折騰的一個個人項目核心目標(biāo)很簡單打造一個能聽、能說、能簡單思考的本地化語音助手。它不是要挑戰(zhàn)Siri或者小愛同學(xué)而是想解決一個更具體、更私人的痛點——在不想碰鍵盤鼠標(biāo)、或者雙手被占用的場景下比如做飯、做手工、開車時能通過最自然的語音快速查詢信息、控制電腦、或者只是進行一段簡單的對話。市面上成熟的語音助手很多但它們要么依賴云端有隱私和數(shù)據(jù)安全的顧慮要么功能龐大復(fù)雜定制性差。而“Speak2Me”的出發(fā)點就是輕量、可控、完全本地運行。它不追求百科全書式的知識庫而是聚焦于幾個高頻、實用的場景比如“今天天氣怎么樣”、“打開我的音樂播放列表”、“記一下明天下午三點開會”、“講個笑話”。通過這個項目我想驗證的是利用當(dāng)前開源的語音技術(shù)和輕量級語言模型一個普通開發(fā)者能否在個人電腦上搭建一個響應(yīng)迅速、功能實用的語音交互入口。這個項目適合誰呢首先是對語音技術(shù)和AI應(yīng)用感興趣的開發(fā)者你可以把它當(dāng)作一個絕佳的練手項目涵蓋語音識別ASR、自然語言理解NLU、文本轉(zhuǎn)語音TTS全鏈路。其次是那些注重隱私、又希望提升生活或工作效率的極客用戶。最后它甚至可以作為一些嵌入式設(shè)備或智能家居中樞的語音交互原型。整個過程我會把重點放在“如何選擇工具”、“如何讓各個模塊協(xié)同工作”以及“如何優(yōu)化體驗”這些實實在在的坑上而不是空談理論。2. 核心架構(gòu)設(shè)計與技術(shù)選型思路搭建一個完整的語音交互系統(tǒng)可以拆解為三個核心環(huán)節(jié)語音輸入轉(zhuǎn)文字Speech-to-Text, STT、文字理解與處理Natural Language Processing, NLP、文字結(jié)果轉(zhuǎn)語音輸出Text-to-Speech, TTS。“Speak2Me”采用的就是這個經(jīng)典流水線。技術(shù)選型的核心原則是在保證可用性的前提下優(yōu)先選擇開源、可本地部署、資源消耗相對較低的方案。2.1 語音識別STT模塊平衡精度與速度語音識別是入口它的準(zhǔn)確度和延遲直接決定了第一印象。我們有幾個主流選擇云端API如Google Speech-to-Text, Whisper API識別率最高尤其是對中英文混合場景但需要網(wǎng)絡(luò)有延遲和費用問題不符合我們“完全本地”的初衷。本地大型模型如OpenAI WhisperWhisper是開源領(lǐng)域的標(biāo)桿識別精度接近商用水平支持多語言。但它模型較大小型號也有1GB左右推理需要一定的GPU資源或較長的CPU時間對于要求實時響應(yīng)的語音助手來說直接使用可能延遲偏高。專用本地輕量模型如Vosk、Coqui STT。它們專為嵌入式或離線場景優(yōu)化模型小可壓縮到幾十MB速度快但精度特別是在噪音環(huán)境或口音識別上可能稍遜于Whisper。我的選擇與理由為了兼顧實時性和精度我采用了“雙階段”策略。喚醒階段使用一個極其輕量的關(guān)鍵詞檢測Keyword Spotting模型比如Porcupine或Snowboy雖然已不維護但有離線方案持續(xù)監(jiān)聽“小X小X”這樣的喚醒詞。一旦檢測到才進入高精度識別階段。在高精度識別階段我選擇了faster-whisper這個項目。它是Whisper的CTranslate2實現(xiàn)利用模型量化INT8和Transformer算子優(yōu)化在CPU上也能實現(xiàn)接近實時的轉(zhuǎn)錄速度比原版快4倍以上而精度損失極小。這完美解決了本地部署下速度與精度的矛盾。注意喚醒詞模型需要針對目標(biāo)詞進行訓(xùn)練或選擇預(yù)訓(xùn)練模型。如果追求極致的隱私和零數(shù)據(jù)傳輸可以全程使用Vosk等完全離線方案但需要接受其可能在復(fù)雜語句識別上稍弱的現(xiàn)實。2.2 自然語言處理NLP核心輕量級語言模型的本地部署識別出的文字需要被理解。傳統(tǒng)做法是意圖識別Intent Classification和槽位填充Slot Filling這需要大量的標(biāo)注數(shù)據(jù)和模型訓(xùn)練。對于個人項目而言成本太高。如今有了更通用的解決方案小型化的大型語言模型LLM。我們的目標(biāo)不是進行復(fù)雜的創(chuàng)作或邏輯推理而是理解用戶指令并做出結(jié)構(gòu)化響應(yīng)。因此一個7B70億甚至更小參數(shù)的模型經(jīng)過指令微調(diào)Instruct-tuning后完全足夠。可選方案有Llama 2/3 7B ChatMeta開源生態(tài)豐富有大量的量化版本GGUF格式。ChatGLM3-6B清華開源中英文雙語表現(xiàn)均衡對中文場景優(yōu)化更好。Qwen1.5-7B-Chat阿里通義千問開源版本中文能力強勁。Phi-2/3微軟出品的小尺寸模型27億參數(shù)號稱“小身材有大智慧”在常識推理和語言理解上表現(xiàn)驚人非常適合資源受限的本地場景。我的選擇與理由經(jīng)過實測我最終選擇了Qwen1.5-7B-Chat的4位量化Q4_K_MGGUF版本。理由如下第一它對中文指令的理解和遵循能力非常出色符合中文用戶的主要場景。第二GGUF格式搭配llama.cpp項目可以在純CPU上甚至樹莓派高效運行內(nèi)存占用控制在5GB左右現(xiàn)代臺式機或筆記本毫無壓力。第三其社區(qū)活躍工具鏈成熟。通過設(shè)計清晰的系統(tǒng)提示詞System Prompt我可以讓它嚴格按格式輸出JSON方便后續(xù)程序解析執(zhí)行。例如系統(tǒng)提示詞會規(guī)定“你是一個本地語音助手。請將用戶的指令分類為query查詢信息、control控制設(shè)備、chat閑聊。如果是query請直接給出簡潔答案如果是control請解析出設(shè)備名和動作以JSON格式輸出...”2.3 語音合成TTS模塊尋找自然的聲音最后一步是把LLM返回的文字答案讀出來。TTS的選擇同樣豐富系統(tǒng)內(nèi)置TTS如Windows的SAPImacOS的say命令。優(yōu)點是零配置極度輕量但聲音機械感強體驗不佳。開源神經(jīng)TTS如Coqui TTS、VITS。聲音自然度遠超傳統(tǒng)方法可以訓(xùn)練特定音色但模型推理需要GPU支持才能實時且配置稍復(fù)雜。本地化邊緣TTS方案這是我的推薦。pyttsx3庫可以跨平臺調(diào)用系統(tǒng)語音引擎。更優(yōu)的選擇是VITS-fast-fine-tuning項目提供的輕量級預(yù)訓(xùn)練模型或者使用像Edge-TTS這樣的庫雖然它調(diào)用的是微軟Edge瀏覽器的在線接口但聲音質(zhì)量高且對于個人使用隱私風(fēng)險可接受。為了徹底離線我選擇了Coqui TTS中預(yù)訓(xùn)練的VCTK模型它在CPU上合成一小段語音也只需一兩秒音質(zhì)足夠清晰自然。技術(shù)棧匯總喚醒Porcupine (離線)語音識別faster-whisper (本地)語言模型Qwen1.5-7B-Chat-GGUF (本地 llama.cpp推理)語音合成Coqui TTS / pyttsx3 (本地)膠水層Python3. 系統(tǒng)搭建與核心環(huán)節(jié)實現(xiàn)確定了技術(shù)組件接下來就是讓它們跑起來。這里我以macOS/Linux環(huán)境為例Windows環(huán)境類似主要區(qū)別在于一些依賴包的安裝。3.1 環(huán)境準(zhǔn)備與依賴安裝首先創(chuàng)建一個干凈的Python虛擬環(huán)境是個好習(xí)慣。python -m venv speak2me_env source speak2me_env/bin/activate # Windows: speak2me_env\Scripts\activate然后安裝核心依賴。由于我們用的都是開源庫大部分可以通過pip安裝但llama.cpp需要單獨編譯。# 安裝基礎(chǔ)包 pip install faster-whisper pip install coqui-tts pip install pvporcupine # Porcupine的Python封裝 pip install pyaudio # 音頻采集可能需要根據(jù)系統(tǒng)額外安裝portaudio # 安裝llama.cpp的Python綁定 pip install llama-cpp-pythonllama.cpp的安裝稍微復(fù)雜一點因為它需要編譯C代碼以支持硬件加速如Apple Silicon的Metal或CUDA。# 方法一直接pip安裝預(yù)編譯輪子可能不含所有后端 pip install llama-cpp-python # 方法二從源碼編譯開啟Metal支持Apple Silicon Mac推薦 CMAKE_ARGS-DLLAMA_METALon pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir # 方法三從源碼編譯開啟CUDA支持NVIDIA GPU CMAKE_ARGS-DLLAMA_CUBLASon pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir3.2 喚醒與錄音模塊實現(xiàn)我們需要一個循環(huán)持續(xù)監(jiān)聽麥克風(fēng)檢測喚醒詞。這里用Porcupine示例。import pvporcupine import pyaudio import struct # 初始化Porcupine使用預(yù)構(gòu)建的英文喚醒詞模型關(guān)鍵詞設(shè)為“Alexa” porcupine pvporcupine.create(keywords[alexa]) # 也可以使用porcupine.KEYWORDS查看內(nèi)置詞 pa pyaudio.PyAudio() audio_stream pa.open( rateporcupine.sample_rate, channels1, formatpyaudio.paInt16, inputTrue, frames_per_bufferporcupine.frame_length ) print(Listening for wake word Alexa...) try: while True: pcm audio_stream.read(porcupine.frame_length) pcm struct.unpack_from(h * porcupine.frame_length, pcm) keyword_index porcupine.process(pcm) if keyword_index 0: print(Wake word detected! Starting recording...) # 喚醒后開始錄制后續(xù)的語音指令例如錄制3秒鐘 # 這里跳轉(zhuǎn)到錄音函數(shù) recorded_audio record_after_wakeup(3.0) # 自定義函數(shù) # 將recorded_audio傳遞給STT模塊 break except KeyboardInterrupt: print(Stopping...) finally: audio_stream.close() pa.terminate() porcupine.delete()record_after_wakeup函數(shù)需要實現(xiàn)一個固定時長的錄音或者更智能的“端點檢測”VAD在用戶說話開始和結(jié)束時自動控制錄音。可以使用webrtcvad庫來實現(xiàn)簡單的VAD。3.3 語音識別faster-whisper調(diào)用拿到錄音的音頻數(shù)據(jù)通常是WAV格式的字節(jié)流或文件路徑后調(diào)用faster-whisper進行轉(zhuǎn)錄。from faster_whisper import WhisperModel # 加載模型指定模型大小和設(shè)備。base模型在精度和速度間取得較好平衡。 # 使用int8量化以進一步降低內(nèi)存和提升速度。 model WhisperModel(base, devicecpu, compute_typeint8) # 或 devicecuda # 假設(shè)audio_path是錄制的音頻文件路徑 segments, info model.transcribe(audio_path, beam_size5, languagezh) # faster-whisper返回的是分段segments的生成器 full_text .join([segment.text for segment in segments]) print(fRecognized: {full_text})關(guān)鍵參數(shù)解析model_size: 可選tiny,base,small,medium,large-v2等。base是性價比之選。compute_type:int8量化在CPU上性價比極高精度損失可忽略。beam_size: 集束搜索大小影響識別精度和速度5是個常用值。language: 指定語言能提升識別準(zhǔn)確率如zh中文en英文。3.4 語言模型llama.cpp交互將識別出的文本full_text結(jié)合我們預(yù)設(shè)的系統(tǒng)提示詞發(fā)送給本地運行的LLM。首先你需要從Hugging Face等平臺下載量化好的GGUF模型文件例如qwen1.5-7b-chat-q4_k_m.gguf。from llama_cpp import Llama # 加載模型 llm Llama( model_path./models/qwen1.5-7b-chat-q4_k_m.gguf, n_ctx2048, # 上下文長度 n_threads8, # 使用的CPU線程數(shù) n_gpu_layers0, # 如果使用Metal/CUDA這里指定卸載到GPU的層數(shù)如30 ) # 構(gòu)建消息 system_prompt 你是一個本地語音助手請用簡潔、口語化的中文回答用戶。請將指令分類并處理 1. 查詢信息query如天氣、時間、計算、定義等。直接給出答案。 2. 設(shè)備控制control如“打開音樂”、“調(diào)亮燈光”。請以JSON格式輸出包含intent:control, device:音樂, action:打開。 3. 閑聊對話chat進行友好、簡短的對話。 如果無法理解或無法處理請回答“我還沒學(xué)會這個呢”。 messages [ {role: system, content: system_prompt}, {role: user, content: full_text} ] # 生成回復(fù) response llm.create_chat_completion(messages, max_tokens256, temperature0.1) # temperature調(diào)低使輸出更確定減少廢話 assistant_reply response[choices][0][message][content] print(fLLM Reply: {assistant_reply})現(xiàn)在assistant_reply可能是直接的回答也可能是一段JSON。我們需要一個簡單的解析器來處理。3.5 響應(yīng)解析與執(zhí)行根據(jù)LLM的輸出決定是直接播報文本還是執(zhí)行控制命令。import json import subprocess import tts_module # 假設(shè)這是你封裝的TTS模塊 def process_response(response_text): # 嘗試解析JSON判斷是否為控制指令 try: data json.loads(response_text) if data.get(intent) control: device data.get(device) action data.get(action) # 這里映射到具體的執(zhí)行函數(shù) execute_control(device, action) # 執(zhí)行后可以合成一個確認語音 tts_module.speak(f已{action}{device}) return except json.JSONDecodeError: # 不是JSON則認為是直接回復(fù)或閑聊內(nèi)容 pass # 對于查詢結(jié)果或閑聊直接播報 tts_module.speak(response_text) def execute_control(device, action): # 這里是具體的控制邏輯可以是調(diào)用系統(tǒng)API、發(fā)送HTTP請求到智能家居網(wǎng)關(guān)等 if device 音樂 and action 打開: # 例如在macOS上用open命令打開音樂App subprocess.run([open, -a, Music]) elif device 燈光 and action 調(diào)亮: # 假設(shè)你有一個智能燈的本地HTTP API # requests.post(http://light-bridge/api/light/brightness, json{value: 80}) print(f模擬控制{device} {action})3.6 語音合成Coqui TTS輸出最后用TTS把要說的文本讀出來。這里用Coqui TTS的簡單示例。from TTS.api import TTS # 初始化TTS使用預(yù)訓(xùn)練的英文模型如需中文需另尋或微調(diào)模型 tts TTS(model_nametts_models/en/vctk/vits, progress_barFalse, gpuFalse) # 使用CPU def speak(text): # 生成語音并播放 output_path /tmp/output.wav tts.tts_to_file(texttext, speakertts.speakers[0], file_pathoutput_path) # 使用系統(tǒng)音頻播放器播放例如afplay (macOS) subprocess.run([afplay, output_path])實操心得Coqui TTS的VCTK模型音質(zhì)不錯但第一次加載模型和推理速度較慢。對于追求瞬時響應(yīng)的場景可以在程序啟動時就預(yù)加載TTS模型。或者可以考慮使用更輕量的pyttsx3作為備選犧牲一點音質(zhì)換取零延遲的體驗。pyttsx3的使用非常簡單import pyttsx3; engine pyttsx3.init(); engine.say(text); engine.runAndWait()。4. 系統(tǒng)集成與優(yōu)化實踐把上述所有模塊串聯(lián)起來就構(gòu)成了“Speak2Me”的主循環(huán)。但一個可用的系統(tǒng)遠不止于此還需要考慮健壯性、用戶體驗和性能優(yōu)化。4.1 主循環(huán)與狀態(tài)管理一個典型的交互循環(huán)狀態(tài)機包括休眠監(jiān)聽 - 喚醒 - 錄音含VAD- 識別 - 理解 - 執(zhí)行/合成 - 播報 - 返回休眠。我們需要用清晰的代碼結(jié)構(gòu)來管理這個狀態(tài)。import threading import queue class Speak2MeAssistant: def __init__(self): self.wake_word_detector PorcupineWrapper() # 封裝好的喚醒模塊 self.asr_engine FasterWhisperASR() # 封裝好的ASR self.llm_engine LocalLLMEngine() # 封裝好的LLM self.tts_engine TTSWrapper() # 封裝好的TTS self.command_queue queue.Queue() # 用于線程間通信 self.is_listening False def start(self): # 啟動喚醒詞監(jiān)聽線程 wake_thread threading.Thread(targetself._wake_loop, daemonTrue) wake_thread.start() # 主線程處理命令隊列 while True: audio_data self.command_queue.get() text self.asr_engine.transcribe(audio_data) if text: response self.llm_engine.chat(text) self.tts_engine.speak(response) # 處理完成后可以設(shè)置一個標(biāo)志允許再次進入喚醒狀態(tài) self.is_listening False def _wake_loop(self): while True: if not self.is_listening: detected self.wake_word_detector.listen() if detected: self.is_listening True print(喚醒開始錄音...) # 開始錄音錄音結(jié)束將數(shù)據(jù)放入command_queue audio self.record_with_vad() self.command_queue.put(audio)4.2 性能優(yōu)化關(guān)鍵點模型加載優(yōu)化所有模型Whisper, LLM, TTS在第一次加載時都非常慢。解決方案是服務(wù)化或預(yù)熱。可以將LLM模型單獨作為一個本地HTTP服務(wù)例如使用llama.cpp的server模式或text-generation-webuiASR和TTS也類似。主程序通過HTTP API調(diào)用這樣模型常駐內(nèi)存響應(yīng)速度極快。音頻處理優(yōu)化使用numpy數(shù)組操作替代Python原生循環(huán)處理音頻數(shù)據(jù)。確保錄音采樣率、聲道數(shù)與模型要求匹配避免不必要的重采樣。LLM上下文與提示詞工程LLM的上下文長度n_ctx直接影響內(nèi)存占用和速度。對于語音助手1024或2048通常足夠。精心設(shè)計的系統(tǒng)提示詞System Prompt是控制LLM行為、減少無效輸出的最關(guān)鍵手段。要明確、簡潔并通過示例Few-shot引導(dǎo)它輸出固定格式。異步處理將錄音、識別、LLM推理、語音合成放在不同的線程或異步任務(wù)中避免阻塞UI或主循環(huán)。例如在播報當(dāng)前回答的同時可以已經(jīng)開始監(jiān)聽下一輪喚醒。4.3 提升實用性的功能擴展基礎(chǔ)框架跑通后可以添加更多實用功能本地知識庫RAG讓助手能回答關(guān)于你個人文檔、筆記的問題。使用LangChain、LlamaIndex等框架將本地文檔切片、向量化存儲用ChromaDB或FAISS當(dāng)用戶查詢時先檢索相關(guān)文檔片段再連同問題一起送給LLM生成答案。技能插件系統(tǒng)設(shè)計一個插件架構(gòu)將“查天氣”、“控制智能家居”、“記筆記”等功能模塊化。LLM解析出意圖后分發(fā)到對應(yīng)的插件執(zhí)行。這樣功能易于擴展和維護。多輪對話與上下文記憶在LLM調(diào)用時不僅發(fā)送當(dāng)前query還附帶之前幾輪的對話歷史讓助手能進行連貫的多輪對話。需要注意管理上下文長度避免無限增長。離線信息查詢集成離線版的維基百科KiwiX、離線詞典等實現(xiàn)真正的全離線信息檢索。5. 常見問題與排查技巧實錄在實際搭建和運行過程中你一定會遇到各種各樣的問題。下面是我踩過的一些坑和解決方案。5.1 音頻采集相關(guān)問題問題PyAudio安裝失敗或無法找到麥克風(fēng)設(shè)備。排查PyAudio依賴系統(tǒng)級的PortAudio庫。在Ubuntu上先運行sudo apt-get install portaudio19-dev python3-pyaudio。在macOS上用Homebrew安裝brew install portaudio pip install pyaudio。在Windows上可能需要從Christoph Gohlke的非官方Windows二進制包頁面下載對應(yīng)Python版本的PyAudio.whl文件進行安裝。技巧使用pyaudio.PyAudio().get_device_count()和get_device_info_by_index()列出所有音頻設(shè)備確認麥克風(fēng)索引是否正確。問題錄音有噪音或識別率低。排查檢查錄音環(huán)境噪音。可以在錄音后使用librosa或pydub庫進行簡單的預(yù)處理如降噪noise reduction、增益normalization。技巧端點檢測VAD至關(guān)重要。一個優(yōu)秀的VAD能精準(zhǔn)抓取人聲片段剔除靜音和噪音大幅提升識別準(zhǔn)確率并減少后續(xù)處理負擔(dān)。webrtcvad庫非常高效但只支持8000, 16000, 32000, 48000 Hz的16位單聲道PCM數(shù)據(jù)需要與你ASR模型的輸入格式對齊。5.2 模型推理相關(guān)問題問題llama.cpp加載模型時報錯或速度極慢。排查1 - 內(nèi)存不足檢查GGUF模型文件大小和系統(tǒng)可用內(nèi)存。7B的Q4模型約4GB運行時需要額外約2-4GB內(nèi)存。確保系統(tǒng)有足夠空閑內(nèi)存。排查2 - 編譯選項不對如果你有GPU但未啟用加速速度會慢。重新編譯安裝時確認CMAKE_ARGS設(shè)置正確。對于Apple Silicon Mac-DLLAMA_METALon是必須的。使用llama_cpp的llama.print_system_info()可以查看當(dāng)前的構(gòu)建配置和加速后端。技巧如果CPU運行慢嘗試調(diào)整n_threads參數(shù)通常設(shè)置為物理核心數(shù)。對于超線程CPU設(shè)置為邏輯核心數(shù)可能更好需要實測。問題LLM回答不遵循指令總是輸出無關(guān)內(nèi)容。排查這幾乎都是提示詞Prompt工程問題。系統(tǒng)提示詞不夠強硬或清晰。技巧明確指令在系統(tǒng)提示詞開頭就用“你必須”、“你只能”、“嚴格遵守以下格式”等強約束詞。結(jié)構(gòu)化輸出示例在提示詞中直接給出1-2個完美的輸入輸出示例Few-shot Learning。調(diào)整生成參數(shù)降低temperature如0.1提高top_p如0.95減少隨機性。設(shè)置repeat_penalty如1.1來抑制重復(fù)。后處理如果LLM輸出了JSON但混有額外解釋文字可以用正則表達式如r\{.*\}嘗試提取第一個JSON對象。5.3 集成與延遲問題問題從喚醒到播報回答整體延遲感覺很高5秒。排查需要給每個模塊打時間戳定位瓶頸。import time start time.time() text asr.transcribe(audio) # ASR print(fASR耗時: {time.time()-start:.2f}s) start time.time() resp llm.chat(text) # LLM print(fLLM耗時: {time.time()-start:.2f}s)優(yōu)化策略ASR延遲換用更小的Whisper模型如tiny或base或嘗試faster-whisper的beam_size1貪婪解碼以速度換精度。LLM延遲這是主要瓶頸。使用更小的模型如Phi-3-mini或更強的量化如Q3_K_S。將LLM部署為獨立服務(wù)避免每次加載。流水線優(yōu)化采用異步流水線。當(dāng)ASR識別到一半如果置信度已經(jīng)很高就可以開始流式地將部分文本發(fā)送給LLM進行“預(yù)測”實現(xiàn)端到端的部分流式處理但這實現(xiàn)較復(fù)雜。問題如何實現(xiàn)“打斷”功能即用戶在助手說話時說出新的指令。方案這是一個高級功能。需要在語音播報TTS的同時并行運行一個輕量的語音活動檢測VAD。一旦檢測到用戶開始說話立即停止當(dāng)前的TTS播放并清空處理管道開始新的指令處理流程。這涉及到多線程/進程的同步和音頻設(shè)備的搶占是實現(xiàn)“自然對話”體驗的關(guān)鍵一步。5.4 資源占用與部署問題項目同時運行ASR、LLM、TTS內(nèi)存和CPU占用太高。策略按需加載不是所有模塊都需要常駐內(nèi)存。例如可以在檢測到喚醒詞后再加載ASR模型LLM推理完成后就卸載如果使用服務(wù)化則無此問題。模型量化始終使用量化后的模型GGUF Q4, Q3, 甚至IQ2。這是降低資源占用的最有效手段。硬件選擇如果追求極致體驗一塊入門級的NVIDIA GPU如GTX 1660, RTX 3060或Apple Silicon Mac的統(tǒng)一內(nèi)存會帶來質(zhì)的飛躍。對于樹莓派等嵌入式設(shè)備則必須選擇VoskASR和Phi-2LLM這類為邊緣計算優(yōu)化的模型。經(jīng)過以上步驟一個功能完整、完全本地運行的“Speak2Me”語音助手就初具雛形了。它可能沒有商業(yè)產(chǎn)品那么華麗但每一個環(huán)節(jié)都透明、可控并且可以根據(jù)你的需求任意定制。從“嘿Siri”到“嘿我的電腦”這種將前沿AI技術(shù)落地為個人工具的過程帶來的成就感是獨一無二的。你可以從控制電腦播放音樂開始逐步教它管理你的日歷、回答本地文檔的問題甚至連接家中的智能設(shè)備真正打造一個屬于你自己的智能交互中心。