跳至主要內容

從 0 到 1 打造 100% 本機執行的 AI 賽博女友:Amayo AI 技術剖析與開源實錄

Amayo AI Cover

一開始,我做 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 個關鍵步驟:

  1. VAD (Voice Activity Detection) 靜音切段:瀏覽器端監聽麥克風,當使用者說完話(靜音超過 450ms)時自動切段送出。
  2. STT (Speech-to-Text):FastAPI 後端接收 WebM/WAV 音訊,由本機 faster-whisper(預設小巧高效的 small 模型)極速將語音轉為文字。
  3. LLM (Language Model):文字輸入經由本機 Ollama 原生 /api/chat 送入大語言模型,搭配繁體中文賽博女友人設「小雨」生成回覆。
  4. TTS (Text-to-Speech):文字回答交由專為 Apple Silicon 優化的 F5-TTS-MLX 进行零樣本 (Zero-Shot) 聲音複製與語音合成;若未安裝 F5,則無縫自動降級採用 macOS 內建的 say 發音指令。
  5. 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 / 32Bqwen2.5:32b
qooba/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 的更多可能!