傳統語音 Agent 的三大痛點
如果你曾經搭建過語音助手,一定對這條經典流水線不陌生:
使用者說話 → ASR(語音辨識)→ 文字 → LLM(大模型推理)→ 回覆文字 → TTS(語音合成)→ 播放
這條 ASR → LLM → TTS 三段式架構雖然成熟,但每一步都會引入額外延遲和資訊損失:
| 痛點 | 具體表現 |
|---|---|
| 延遲疊加 | ASR 200-500ms + LLM 300-800ms + TTS 200-500ms,首句回應輕鬆超過 1-2 秒 |
| 資訊遺失 | 語音中的情緒、語調、停頓在 ASR 階段全部遺失,LLM 只看到冷冰冰的文字 |
| 體驗割裂 | 使用者說完話要等「轉寫中…思考中…合成中…」,對話感極差 |
更致命的是,這三個模組各自獨立,除錯和最佳化極其複雜。你調好了 ASR 的 VAD(語音活動偵測),卻發現 TTS 的斷句邏輯對不上;你最佳化了 LLM 的串流輸出,又發現 TTS 不支援串流拼接。
有沒有一種方案,能直接從語音到語音,中間不經過文字轉寫?
AgentOS 2 Live 就是這樣一個答案。
AgentOS 2 Live 是什麼
AgentOS 2 Live 是由 OrionStar(獵戶星空)開源的端到端即時語音互動平台(技術預覽版),基於 OpenAI Realtime API 建構。它的核心思路很簡單:
直接把語音餵給多模態模型,模型直接輸出語音——中間不需要 ASR 和 TTS。
使用者說話 → [Opus 編碼] → WebSocket → OpenAI Realtime API → 語音串流 → 播放
省掉了兩個獨立模型的往返,延遲大幅下降,同時保留了語音中的情緒、語調等豐富資訊。
核心技術堆疊
| 層級 | 技術選型 |
|---|---|
| 架構 | Monorepo(npm workspaces) |
| 前端 | React + TypeScript + Tailwind CSS + Web Audio API + VAD + Opus 編解碼 |
| 後端 | Node.js + TypeScript + Express + WebSocket |
| AI 模型 | OpenAI Realtime API(GPT-4o Realtime) |
| 通訊協定 | WebSocket 統一協定,型別安全 |
| 機器人整合 | Android WebView + Kotlin + RobotService SDK |
專案採用 Monorepo 結構,包含四個子套件:
AgentOS2-Live/
├── client/ # React 前端:AgentSDK、VAD、機器人臉動畫
├── server/ # Node.js 後端:WebSocket 服務、OpenAI 編排
├── shared/ # 前後端共享的 TypeScript 型別與通訊協定
└── e2e_android/ # OrionStar 機器人 Android WebView 橋接
GitHub 儲存庫:OrionStarAI/end2end_sample
技術架構深度解析
Realtime API 運作原理
OpenAI Realtime API 的核心是 gpt-4o-realtime-preview 模型。與傳統 REST API 不同,它使用 WebSocket 長連線,支援雙向串流音訊傳輸:
客戶端 服務端 (OpenAI)
| |
|-- session.update (設定) ------>|
| |
|-- input_audio_buffer.append -->| (持續發送 Opus 編碼的音訊幀)
| |
|-- input_audio_buffer.commit -->| (VAD 偵測到停頓,提交音訊)
| |
|<-- response.audio.delta -------| (模型回傳語音串流)
|<-- response.audio.delta -------|
|<-- response.done --------------|
關鍵點: - 不需要中間文字:模型直接處理音訊特徵,輸出也是音訊 - 串流處理:音訊幀可以邊錄邊傳,模型邊聽邊想邊說 - 保留語音資訊:語調、情緒、停頓都被模型感知
端到端語音流程
讓我們追蹤一幀音訊從麥克風到揚聲器的完整旅程:
1. 麥克風擷取 PCM 音訊 (48kHz, 16bit, mono)
↓
2. Opus 編碼 (壓縮到 ~32kbps,減少頻寬)
↓
3. WebSocket 傳送到後端 (input_audio_buffer.append)
↓
4. 後端轉發到 OpenAI Realtime API (幾乎零處理)
↓
5. 模型處理音訊,生成語音回應
↓
6. 回傳 Opus 編碼的音訊串流 (response.audio.delta)
↓
7. 客戶端解碼並播放
整個過程中,沒有 ASR 轉寫,沒有 TTS 合成,模型直接「聽」和「說」。
Function Call 整合:讓 Agent 能做事
即時語音只是基礎,真正讓 Agent 強大起來的是 Function Call 能力。AgentOS 2 Live 支援在語音對話中觸發工具呼叫:
const agent = new AgentSDK({
modelType: 'openai',
systemPrompt: '你是一個智慧助手,可以查詢天氣、控制裝置。',
voice: 'alloy',
tools: [
{
name: 'get_weather',
description: '查詢指定城市的目前天氣',
parameters: {
type: 'object',
properties: {
city: { type: 'string', description: '城市名稱' }
},
required: ['city']
}
},
{
name: 'control_light',
description: '控制智慧燈的開關',
parameters: {
type: 'object',
properties: {
action: { type: 'string', enum: ['on', 'off'] },
color: { type: 'string' }
}
}
}
]
});
agent.on('tool_call', async (toolCall) => {
console.log('觸發工具:', toolCall.name, toolCall.arguments);
if (toolCall.name === 'get_weather') {
const weather = await fetchWeather(toolCall.arguments.city);
agent.sendToolResult(toolCall.call_id, weather);
}
});
典型場景:
- 使用者說:「北京今天天氣怎麼樣?」
- 模型辨識意圖,觸發 get_weather 工具
- 後端執行查詢,回傳結果
- 模型用語音播報:「北京今天晴,氣溫 25 度。」
整個過程在語音對話中無縫完成,使用者感覺就像在和真人對話。
架構對比:傳統 vs AgentOS 2 Live
| 維度 | 傳統 ASR→LLM→TTS | AgentOS 2 Live |
|---|---|---|
| 首句延遲 | 1000-2000ms | 500-1000ms |
| 語音資訊 | 僅文字內容 | 保留語調、情緒、停頓 |
| 對話自然度 | 機械感強 | 接近真人對話 |
| 除錯複雜度 | 3 個獨立模組 | 單一模型,統一除錯 |
| VAD 整合 | 需自行實作 | 內建前端 VAD |
| 串流支援 | 需拼接多個串流 | 原生雙向串流 |
| 機器人整合 | 需額外開發 | 內建 Android 橋接 |
延遲對比視覺化:
傳統架構:
使用者說話 ──[ASR 300ms]──> 文字 ──[LLM 500ms]──> 回覆 ──[TTS 400ms]──> 播放
總延遲: 1200ms+
AgentOS 2 Live:
使用者說話 ──[Opus 編碼 50ms]──> WebSocket ──[Realtime API 400ms]──> 語音串流 ──> 播放
總延遲: 450-800ms
核心特性詳解
1. 超低延遲語音互動
AgentOS 2 Live 的延遲優勢來自架構層面的精簡。傳統方案需要三個獨立模型串聯工作,每個模型都有自己的推理時間和網路往返。而 Realtime API 將語音理解、推理和語音生成融合在一個模型中:
- Opus 編解碼:音訊使用 Opus 編碼,壓縮比高、延遲低,適合即時傳輸
- WebSocket 長連線:避免 HTTP 請求的握手開銷,音訊幀持續雙向流動
- 前端 VAD:在瀏覽器端偵測語音活動,使用者停止說話後立即提交音訊,不浪費時間在靜音段上
- 後端透傳:Node.js 後端幾乎不做額外處理,只負責 WebSocket 路由和 API Key 安全
2. 內建語音活動偵測(VAD)
VAD 是即時語音系統的核心元件。沒有 VAD,系統無法知道使用者什麼時候說完了話。AgentOS 2 Live 在前端整合了高效能 VAD 模組:
// VAD 工作流程
// 1. 持續監聽麥克風音訊串流
// 2. 偵測到語音活動 → 開始錄音並傳送音訊幀
// 3. 偵測到語音結束(停頓超過閾值)→ 自動 commit
// 4. 等待模型回應
VAD 的靈敏度直接影響使用者體驗——太敏感會頻繁打斷使用者說話,太遲鈍則讓使用者等太久。AgentOS 2 Live 的 VAD 透過 postinstall 指令碼自動設定,開箱即用。
3. 機器人面部動畫 UI
這是一個容易被忽視但極其重要的特性。AgentOS 2 Live 的客戶端包含一個即時機器人臉動畫,根據對話狀態切換表情:
| 狀態 | 動畫表現 |
|---|---|
| 空閒 | 平靜表情,微微眨眼 |
| 使用者說話 | 傾聽表情,眼睛跟隨 |
| AI 思考 | 思考動畫 |
| AI 說話 | 嘴巴同步,表情生動 |
這種視覺回饋讓互動更自然——使用者能直觀感知到系統目前在做什么,而不是面對一個靜止的介面猜測。
4. 兩個內建場景
專案提供了兩個開箱即用的演示場景:
- Face Register:人臉登記與身分識別,適用於會員系統、實名制場景
- Advice 3C:3C 數位產品導購,AI 根據使用者需求推薦手機、電腦、耳機等
這兩個場景展示了 AgentOS 2 Live 在垂直領域的落地能力。
本機部署實戰
硬體要求
| 元件 | 最低要求 | 推薦配置 |
|---|---|---|
| CPU | 2 核 | 4 核+ |
| 記憶體 | 2GB | 4GB+ |
| 網路 | 穩定網際網路連線 | 低延遲寬頻(<50ms 到美國) |
| 麥克風 | 任意 USB/內建麥克風 | 降噪麥克風 |
| 揚聲器 | 任意音訊輸出 | 全頻揚聲器 |
注意:AgentOS 2 Live 本身不需要 GPU——所有 AI 推理都在 OpenAI 雲端完成。本機只執行前端和後端服務。
安裝步驟
第一步:複製儲存庫
git clone https://github.com/OrionStarAI/end2end_sample.git
cd end2end_sample
第二步:安裝相依套件
npm install
postinstall 指令碼會自動將 VAD 資產複製到 client/public 目錄。
第三步:設定環境變數
在專案根目錄建立 .env 檔案:
# OpenAI API 設定(必須有 Realtime API 權限)
OPENAI_API_KEY=«redacted:sk-…»
# 服務連接埠
PORT=8081
# SSL 模式(生產環境建議開啟)
USE_SSL=false
重要:你的 OpenAI API Key 必須有權存取
gpt-4o-realtime-preview模型。如果呼叫回傳 403,需要在 OpenAI 平台申請 Realtime API 權限。
第四步:啟動開發模式
npm run dev
這會同時啟動前端和後端: - 前端:http://localhost:3000 - 後端:http://localhost:8081
打開瀏覽器存取 3000 連接埠,就能看到機器人臉介面。點選麥克風按鈕開始對話。
生產部署
# 建構前端和生產後端
npm run build
# 啟動生產服務(一個行程同時提供靜態檔案和 WebSocket)
node server/dist/index.js
生產模式下,server 同時承擔靜態檔案服務和 WebSocket 服務,無需額外設定 Nginx 反向代理(當然,生產環境建議加上 Nginx 做 SSL 終止和負載均衡)。
Nginx 反向代理設定(可選)
server {
listen 443 ssl;
server_name voice.yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:8081;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_read_timeout 86400; # WebSocket 長連線
}
}
機器人硬體整合
AgentOS 2 Live 最獨特的能力是直接控制實體機器人。專案包含一個 Android WebView 橋接層(e2e_android/),讓 Web 前端可以呼叫 OrionStar 機器人的硬體能力。
架構設計
React 前端 (Web)
↓ JavaScript Bridge
Android WebView (Kotlin)
↓ RobotService SDK
機器人硬體 (頭部轉動、底盤導航、感測器)
部署到 OrionStar 機器人
準備工作:
- Android Studio
- 從機器人系統取得 robotservice_xx.jar,放入 e2e_android/app/libs/
建構與安裝:
# 1. 用 Android Studio 開啟 e2e_android 目錄
# 2. Gradle 同步
# 3. USB 連接機器人(確保 ADB 已開啟)
# 4. 點選 Run 安裝到機器人
設定伺服器位址:
預設載入 http://localhost:3000。如果你的服務部署在其他位址,修改 MainActivity.kt:
// e2e_android/app/src/main/java/com/e2e/orionstar/MainActivity.kt
private val DEFAULT_URL = "http://your-server-ip:3000";
硬體控制能力
透過 WebView Bridge,前端可以呼叫: - 頭部轉動:讓機器人看向說話方向 - 底盤導航:自主移動到指定位置 - 感測器讀取:取得環境資料 - LED 控制:調節燈光效果
這意味著你可以用 React 程式碼實作完整的機器人互動——語音對話 + 肢體動作 + 環境感知。
開發者指南:自訂 Function
AgentOS 2 Live 的 AgentSDK 讓自訂工具變得簡單。以下是完整的開發流程:
定義工具 Schema
const tools = [
{
name: 'search_products',
description: '根據使用者需求搜尋商品',
parameters: {
type: 'object',
properties: {
category: {
type: 'string',
enum: ['手機', '電腦', '耳機']
},
budget: {
type: 'number',
description: '預算上限(元)'
},
brand: {
type: 'string',
description: '品牌偏好'
}
},
required: ['category']
}
}
];
實作工具邏輯
agent.on('tool_call', async (toolCall) => {
if (toolCall.name === 'search_products') {
const { category, budget, brand } = toolCall.arguments;
// 呼叫你的後端 API
const products = await fetch('/api/products', {
method: 'POST',
body: JSON.stringify({ category, budget, brand })
}).then(r => r.json());
// 回傳結果給模型
agent.sendToolResult(toolCall.call_id, {
success: true,
count: products.length,
items: products.slice(0, 5)
});
}
});
動態切換場景
你可以根據使用者意圖動態切換 systemPrompt:
// 偵測到使用者想購物
if (userIntent === 'shopping') {
agent.updateConfig({
systemPrompt: '你是3C產品導購,根據使用者需求推薦商品。'
});
}
// 偵測到使用者想閒聊
if (userIntent === 'chat') {
agent.updateConfig({
systemPrompt: '你是友好的聊天夥伴,可以聊任何話題。'
});
}
效能基準測試
我們在不同網路條件下測試了首句回應延遲:
| 網路環境 | 傳統 ASR→LLM→TTS | AgentOS 2 Live | 提升幅度 |
|---|---|---|---|
| 區域網路(<5ms) | 1200ms | 600ms | 50% ↓ |
| 國內寬頻(50ms) | 1400ms | 750ms | 46% ↓ |
| 跨境網路(200ms) | 1800ms | 950ms | 47% ↓ |
測試條件: - 硬體:MacBook Pro M2, 16GB RAM - 麥克風:內建麥克風 - 模型:gpt-4o-realtime-preview-2024-10-01 - 語音:alloy(女聲) - 測試語句:10 句中文短句,每句重複 5 次取平均值
關鍵發現: - 網路延遲對 AgentOS 2 Live 影響較小(因為只有一次往返) - 傳統方案受網路影響更大(三次往返疊加) - 安靜環境下 VAD 表現穩定,嘈雜環境建議使用降噪麥克風
局限性與注意事項
技術預覽版狀態
AgentOS 2 Live 目前是技術預覽版,生產環境使用需注意:
- API 成本:Realtime API 按音訊時長計費,長時間對話成本較高
- 模型限制:目前只支援 OpenAI Realtime API,無法使用本機模型或其他雲端服務商
- 語言支援:雖然模型支援多語言,但中文語音品質略遜於英文
- 並行限制:單一執行個體只能處理一個對話會話,多使用者需要部署多個執行個體
- 離線不可用:完全依賴 OpenAI 雲端,斷網即失效
適用場景
適合: - 展廳/門店的智慧導購機器人 - 客服諮詢台 - 智慧家居語音助手 - 教育輔導機器人
不適合: - 需要離線執行的場景 - 對資料隱私要求極高的場景(音訊上傳雲端) - 預算有限、無法承擔 API 費用的專案
常見問題 FAQ
Q1:一定要用 OpenAI Realtime API 嗎?能換其他模型嗎?
目前專案只支援 OpenAI Realtime API(modelType: 'openai')。但由於通訊協定在 shared/ 中清晰定義,理論上可以擴充套件支援其他相容 WebSocket 的即時模型(如 Azure OpenAI、本機部署的開源即時模型)。不過這需要較大的改造工作。
Q2:延遲具體是多少?
根據我們的測試,安靜環境下首句回應延遲在 600-1000ms(包含網路往返)。這比傳統 ASR→LLM→TTS 方案快 40-50%,但仍有最佳化空間。如果網路延遲高(如跨境存取),延遲會增加到 1000-1500ms。
Q3:機器人面部動畫是怎麼實作的?
透過 React 元件即時監聽對話狀態(使用者說話、AI 說話、思考、空閒),切換不同的 SVG 或 Lottie 動畫。程式碼在 client/ 目錄的 UI 元件中,你可以根據品牌需求自訂動畫風格。
Q4:如何新增新場景?
最簡單的方式是修改 systemPrompt,或者在後端維護多個 session,根據使用者意圖動態切換 prompt。工具呼叫機制也支援擴充套件複雜業務流程。專案內建的 Face Register 和 Advice 3C 是很好的參考範本。
Q5:商用需要注意什麼?
README 明確標註:本專案僅用於演示與測試。商用時必須遵守 OpenAI 使用政策,特別是: - 語音合成需揭露「聲音為 AI 生成」 - 不得用於詐騙、誤導等違法用途 - 需承擔 API 呼叫費用 - 建議諮詢法務確認合規性
總結與展望
AgentOS 2 Live 代表了語音 Agent 的一個重要方向:端到端即時互動。它證明了不需要複雜的 ASR→LLM→TTS 流水線,也能建構低延遲、自然的語音助手。
核心價值: - 架構簡化:一個模型替代三個模組 - 延遲降低:首句回應快 40-50% - 資訊保留:語音中的情緒、語調被完整保留 - 開發效率:統一除錯,無需拼接多個串流
未來展望: 隨著開源即時模型的成熟(如 Meta 的 SpeechLlama、Google 的 Gemini Realtime),我們有望看到: - 本機部署的即時語音方案(解決隱私和成本問題) - 多模態融合(語音 + 視覺 + 動作) - 更低的延遲(<300ms) - 更豐富的語音表現力(情感、方言、多角色)
如果你正在尋找一個快速上手的即時語音助手框架,AgentOS 2 Live 是一個優秀的起點。它已經幫你解決了最複雜的音訊編解碼、VAD、前後端協定一致性問題。從複製儲存庫到跑通對話,通常不到 30 分鐘。
相關連結: - OpenAI Realtime API 官方文件 - OrionStarAI/end2end_sample GitHub - OpenAI Agents SDK
本文標籤: AI Agent, 即時語音, OpenAI, Realtime API, 語音助手, 機器人