源文件:chapter9/live-audio/README.md 实时语音对话 Demo 一个实时语音对话 Demo,具备语音转文本、AI 对话和文本转语音能力。该应用支持多家 AI 服务提供商,并以极低的延迟提供流畅的对话体验。 这是《深入理解 AI Agent》第 9 章实验 9-1「构建传统语音 Agent」的配套代码。它实现了书中讨论的级联式语音流水线(VAD → ASR → LLM → TTS):前端采集麦克风并通过 WebSocket 流式传输音频;后端运行 Silero VAD 检测说话结束(约 500 ms 静音),再把该段话语送入可插拔的 ASR、LLM、TTS 提供商,并将合成的音频流式回传以供播放。
源文件:chapter9/live-audio/README.md
一个实时语音对话 Demo,具备语音转文本、AI 对话和文本转语音能力。该应用支持多家 AI 服务提供商,并以极低的延迟提供流畅的对话体验。
这是《深入理解 AI Agent》第 9 章实验 9-1「构建传统语音 Agent」的配套代码。它实现了书中讨论的级联式语音流水线(VAD → ASR → LLM → TTS):前端采集麦克风并通过 WebSocket 流式传输音频;后端运行 Silero VAD 检测说话结束(约 500 ms 静音),再把该段话语送入可插拔的 ASR、LLM、TTS 提供商,并将合成的音频流式回传以供播放。
系统采用前后端架构,具备实时音频处理与可插拔的提供商架构:
User Speech → WebSocket → Backend VAD → Multi-Provider STT → Multi-Provider LLM → TTS → Audio Response
| 组件 | 端口 | 说明 |
|---|---|---|
| 后端(WebSocket 服务器) | 8848 | 由 backend/config.js 中的 LISTEN_PORT 设置。前端连接到 ws://localhost:8848。 |
| 前端(Next.js 开发服务器) | 3000 | 在浏览器中打开 http://localhost:3000。 |
前端从 WEBSOCKET_PORT 环境变量读取后端端口(见 frontend/.env.example)。它必须与后端的 LISTEN_PORT 一致。
brew install ffmpeg
sudo apt update sudo apt install ffmpeg
choco install ffmpegffmpeg 在你的 PATH 中/backend - server.js: Main WebSocket server with provider integration - config.js: Multi-provider configuration settings - utils/ - providers/ - asrProviders.js: ASR provider implementations (OpenAI, Siliconflow) - llmProviders.js: LLM provider implementations (OpenAI, OpenRouter, ARK) - vad.js: Voice Activity Detection implementation - speechToText.js: Provider-aware STT service - textProcessor.js: Text preprocessing utilities - tests/ - provider-tests.js: Comprehensive provider testing - run-tests.js: Test runner with environment validation - utils/providers/: Provider configuration (ASR / LLM / TTS) - package.json: Backend dependencies and scripts
/frontend - pages/: Next.js pages - index.tsx: Main application interface - components/: Reusable UI components - public/: Static assets - audioWorklet.js: Audio processing and VAD implementation - next.config.js: Next.js configuration - tailwind.config.js: Tailwind CSS settings - package.json: Frontend dependencies and scripts
cd backend && npm install
cd frontend && npm install
backend/models/silero_vad.onnx 内附带;仅在缺失时才需要下载):
cd backend/models wget https://huggingface.co/deepghs/silero-vad-onnx/resolve/main/silero_vad.onnx
cd frontend && cp .env.example .env # sets WEBSOCKET_PORT=8848 to match the backend
安装完成后,可在无需麦克风或浏览器的情况下校验环境(Node 版本、FFmpeg、VAD 模型、各提供商 key):
cd backend && npm run check # or: node check-setup.js
它会打印出哪些前置条件已满足、所选提供商是否已配置 API key。仅当某个硬性前置条件缺失(Node < 16、缺少 FFmpeg 或缺少 VAD 模型)时才会以非零状态退出。
系统现支持多家 AI 服务提供商,以获得最大灵活性。你可以为 ASR、LLM、TTS 服务自由组合不同提供商。
把你的 API key 设为环境变量:
# Required for OpenAI services export OPENAI_API_KEY="your-openai-api-key" # Required for OpenRouter services export OPENROUTER_API_KEY="your-openrouter-api-key" # Required for ARK (Doubao) services export ARK_API_KEY="your-ark-api-key" # Required for Siliconflow services (ASR and TTS) export SILICONFLOW_API_KEY="your-siliconflow-api-key" # For future use export ANTHROPIC_API_KEY="your-anthropic-api-key"
本仓库已附带可直接编辑的 backend/config.js。若缺失(例如全新检出且被忽略),先复制示例:
cp backend/config.js.example backend/config.js
编辑 backend/config.js 选择你偏好的提供商:
const config = { // Provider Selection - Choose your preferred providers ASR_PROVIDER: 'siliconflow', // 'openai' (whisper-1) or 'siliconflow' (SenseVoice) LLM_PROVIDER: 'openrouter', // 'openrouter' (gpt-5.6-luna, default), 'openai', 'openrouter-gemini', 'ark' TTS_PROVIDER: 'siliconflow', // 'siliconflow' (CosyVoice2) // API Keys (loaded from environment variables) OPENAI_API_KEY: process.env.OPENAI_API_KEY, OPENROUTER_API_KEY: process.env.OPENROUTER_API_KEY, ARK_API_KEY: process.env.ARK_API_KEY, SILICONFLOW_API_KEY: process.env.SILICONFLOW_API_KEY, // ... other configuration options };
ASR_PROVIDER: 'siliconflow', // SenseVoice LLM_PROVIDER: 'openrouter', // openai/gpt-5.6-luna via OpenRouter (avoids gpt-5.6* org verification) TTS_PROVIDER: 'siliconflow', // CosyVoice2
ASR_PROVIDER: 'siliconflow', // SenseVoice LLM_PROVIDER: 'ark', // Doubao (fast in China); or 'openrouter' for gpt-5.6-luna TTS_PROVIDER: 'siliconflow', // CosyVoice2
ASR_PROVIDER: 'openai', // Accurate Whisper LLM_PROVIDER: 'openrouter', // openai/gpt-5.6-luna via OpenRouter TTS_PROVIDER: 'siliconflow' // CosyVoice2
你只需准备打算使用的那些提供商的 API key:
| 提供商 | ASR | LLM | TTS | 所需 API Key |
|---|---|---|---|---|
| OpenAI | ✅ Whisper | ✅ gpt-5.6-luna | ❌ | OPENAI_API_KEY |
| OpenRouter | ❌ | ✅ gpt-5.6-luna, Gemini | ❌ | OPENROUTER_API_KEY |
| ARK (Doubao) | ❌ | ✅ Doubao | ❌ | ARK_API_KEY |
| Siliconflow | ✅ SenseVoice | ❌ | ✅ CosyVoice2 | SILICONFLOW_API_KEY |
系统内置了完善的校验与测试工具:
# Test all configured providers npm run test:providers # Run the full test suite with environment validation node run-tests.js
系统保持了对早期硬编码配置格式的向后兼容,但强烈建议使用新的提供商选择方式以获得更好的灵活性。
设置你的 API key(见"配置"一节)
在 backend/config.js 中配置你偏好的提供商
(可选)校验你的设置:cd backend && npm run check
启动后端服务器(8848 端口的 WebSocket 服务器):
cd backend && npm start
你应看到 Server is running on 0.0.0.0:8848。
启动前端开发服务器(3000 端口):
cd frontend && npm run dev
在浏览器(推荐 Chrome)中打开 http://localhost:3000
点击"Start Recording"并授予麦克风权限,即可开始对话
预期行为:你说完后,后端会检测到约 500 ms 的静音(VAD),转写你的语音(ASR),流式输出 LLM 回复,并将其合成为音频(TTS)自动播放。屏幕上的日志面板会显示各阶段延迟(WebSocket RTT、转写、LLM、TTS)。若在助手说话时你再次开口,播放会被打断。
测试单个提供商及所有组合:
cd backend # Test all providers with your API keys node run-tests.js # Test specific providers only npm run test:providers # Install test dependencies if needed npm install
测试套件会自动跳过未配置 API key 的提供商。
ffmpeg -versiononnxruntime-node 包自动解决提供商配置请参见 backend/config.js.example 以及 backend/utils/providers/ 下的提供商实现。
MIT