
一開始,我做 Amayo AI(小雨 · 本機 AI 語音與對話代理) 的原因其實很單純。
我只是想知道:
我們能不能在不呼叫任何雲端 API、完全保護隱私的前提下,在自己的 Mac 上跑出一個反應流暢、有聲音、有視覺的實時 AI 語音女友?
現在市面上很多 AI 語音助手或賽博女友專案,看似體驗很順,但背後打開網絡抓包,大半都是呼叫 OpenAI API、ElevenLabs 語音合成,或是串接各種付費雲端服務。
但如果我們想要的是:
- 數據 100% 留在本機,不經過任何第三方伺服器?
- 不必擔心雲端 API 扣款、Token 額度爆表或服務斷線?
- 充分發揮 Apple Silicon (M1/M2/M3/M4) 的 Unified Memory 與 MLX/MPS 硬體加速?
- 擁有完整的架構控制權,能隨時更換 LLM 人設、聲音模型或視覺驅動?
這就是我開發 Amayo AI 並將其完整開源的契機。
📐 系統架構:Realtime Voice Agent 是如何運作的?
很多人以為 AI 語音對話系統很複雜,但把它的外殼拆開來看,核心本質就是一個高效協調的流水線 (Pipeline):
┌───────────────────────── 瀏覽器 UI (web/index.html) ─────────────────────────┐
│ 影像生成預覽 免持/按鈕語音對話 文字對話視窗 Avatar 視覺視窗 │
└─────────┬────────────────────┬────────────────────┬──────────────────┬──────┘
│ │ │ │
▼ ▼ ▼ ▼
┌───────────────────────── FastAPI 後端 (app/main.py) ─────────────────────────┐
│ /api/generate-image /api/voice/respond /api/chat /api/avatar │
│ /api/transcribe /api/tts GET /health /api/status │
│ │
│ 啟動暖機機制 (@app.on_event("startup")): │
│ ├ 背景預載入 F5-TTS 常駐 worker │
│ └ 對 Ollama 發送測試請求將 LLM 載入記憶體 │
└────┬───────────────┬───────────────┬───────────────┬─────────────────────────┘
│ │ │ │
▼ ▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐ ┌──────────────┐
│ STT 模型 │ │ 本地 LLM │ │ TTS 模型 │ │ 本地影像預覽 │
│ faster- │ │ Ollama │ │ F5-TTS- │ │ Diffusers │
│ whisper │ │ Qwen 30B │ │ MLX Worker│ │ (MPS/CUDA) │
└───────────┘ └───────────┘ └───────────┘ └──────────────┘
整個語音交互閉環包含 5 個關鍵步驟:
- VAD (Voice Activity Detection) 靜音切段:瀏覽器端監聽麥克風,當使用者說完話(靜音超過 450ms)時自動切段送出。
- STT (Speech-to-Text):FastAPI 後端接收 WebM/WAV 音訊,由本機
faster-whisper(預設小巧高效的small模型)極速將語音轉為文字。 - LLM (Language Model):文字輸入經由本機 Ollama 原生
/api/chat送入大語言模型,搭配繁體中文賽博女友人設「小雨」生成回覆。 - TTS (Text-to-Speech):文字回答交由專為 Apple Silicon 優化的
F5-TTS-MLX进行零樣本 (Zero-Shot) 聲音複製與語音合成;若未安裝 F5,則無縫自動降級採用 macOS 內建的say發音指令。 - Playback & Visual Sync:前端播放回傳的 WAV 音訊,並觸發右側 9:16 直式角色視覺畫面的動態切換。
⚡ 關鍵優化:如何跳過多秒冷啟動延遲?
在做本機 Realtime Agent 時,最大的魔鬼細節就在於 Latency(延遲)。
如果你每次等到使用者說完話,才去 import torch、載入 TTS 模型、加載 LLM 到 GPU/RAM,光是模型的冷啟動 (Cold-load) 就要消耗 3~5 秒,使用者體驗會徹底崩潰。
為了實現「首字秒級響應」,Amayo AI 設計了兩項關鍵優化:
1. 常駐進程 Worker (Persistent Subprocess Worker)
針對 TTS 模組,我們沒有採用傳統每次 Request 重新 spawn 命令行的方式,而是實作了 f5_tts_worker.py 常駐 Worker。
服務啟動時在背景拉起 Python 子進程,把 F5-TTS 模型與 8 秒參考波形直接持留在記憶體中。當請求進來時透過 JSON-lines 標準輸入/輸出 (stdin/stdout) 通訊,省去了重複載入模型的巨大時間。
2. Startup 暖機機制 (Background Pre-warming)
FastAPI 啟動時透過 @app.on_event("startup") 啟動背景執行緒:
- 提前拉起 F5 Worker 完成第一階段模型加載。
- 發送極短的測試 Payload (
{"messages": [{"role":"user", "content":"hi"}]}) 給 Ollama,將聊天模型提前 Pull 進 unified memory。
這使得使用者講出第一句話時,系統已經處於「熱機」狀態。
🤖 LLM 模型選型:7B vs 14B vs 30B/32B
在本機跑 AI 語音對話,大語言模型的選型直接決定了 回答智商 與 推理速度 的權衡:
| 模型級別 | 推薦模型 | 記憶體需求 | 推理延遲 | 實測體驗 |
|---|---|---|---|---|
| 7B 級別 | qwen2.5:7b | ~ 4.7 GB | ⚡ < 0.5s | 響應極快,適合追求低延遲、16GB Mac 或入門設備。 |
| 14B 級別 (🌟 推薦) | qwen2.5:14b | ~ 9.0 GB | 🚀 ~ 0.8s | 最佳平衡點!繁體中文口語撒嬌、自然度與反應速度表現極佳。 |
| 30B / 32B | qwen2.5:32bqooba/qwen3-coder-30b-a3b-instruct | ~ 15~20 GB | 🐢 ~ 1.5-2.5s | 回答深度極高、情緒細節豐富,建議 32GB/64GB 以上高規 Mac 使用。 |
🎨 角色視覺與 Talking Avatar 擴展
除了語音對話,本專案在視覺上也保留了豐富的擴展性:
- 待機動畫 (Idle Loop):預設載入
assets/avatar/avatar-idle.mp4,呈現自然呼吸與眨眼的視覺效果。 - 文生圖 (Diffusers preview):整合本地 Stable Diffusion (MPS/CUDA),可依 Prompt 即時生成 9:16 直式角色海報。
- Modal Lip-sync 實驗:提供獨立 Modal 雲端腳本,可將 TTS 產出的音訊與角色圖合成為唇形同步的 MP4 影片(適用於高品質非即時渲染場景)。
🚀 開源與快速體驗
目前 Amayo AI 已完整開源至 GitHub:
👉 github.com/masato25/amayo-ai
如果你也是 Mac 使用者,只需 3 步即可體驗:
# 1. Clone 儲存庫
git clone https://github.com/masato25/amayo-ai.git
cd amayo-ai
# 2. 下載 Ollama 推薦模型並準備環境變數
ollama pull qwen2.5:14b
cp .env.example .env
# 3. 一鍵啟動 (自動建立虛擬環境並執行)
./run.sh
開啟 http://127.0.0.1:7860,允許麥克風權限後即可開始對話!
💡 結語
開發 Amayo AI 的過程讓我體會到:在 AI 時代,最迷人的不是呼叫了多厲害的雲端 API,而是把這些先進的模型真正「馴服」並跑在自己的設備上。
歡迎大家 Star、Fork 或提出 PR,一起探索本機 Realtime AI Agent 的更多可能!
