Skip to content

HenryZ838978/CallCenter-VoiceAgent

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎙️ 500ms-Voice Agent

ASR → RAG → LLM → TTS  ·  Sub-500ms First Response  ·  Voice Cloning


Pipeline Latency Barge-in ASR CER RTF Version


800ms 是语音对话的图灵测试门槛 — 超过这个延迟,人类会感知到"在和机器说话"。 本项目通过四重工程极致优化,实现 458ms 首响,远低于这个门槛。



超低延迟

↑ 实机演示:PTT模式 → 458ms 首响 → 流式语音克隆回复



⚡ 为什么快?— 四重极致工程优化

                          用户说完
                             │
               ┌─────────────┼──────────────┐
               ▼             ▼              ▼
          ┌─────────┐  ┌──────────┐  ┌────────────┐
          │ 🎤 ASR  │  │ 📚 RAG   │  │            │
          │ FireRed │  │ bge+FAISS│  │            │
          │ ~200ms  │  │  ~4ms    │  │            │
          └────┬────┘  └────┬─────┘  │            │
               │            │        │            │
               ▼            ▼        │            │
          ┌──────────────────────┐   │            │
          │  🧠 LLM (Streaming)  │   │  ⏱️ 458ms  │
          │  Qwen3-14B via vLLM  │   │  总延迟    │
          │  ~163ms to 1st token │   │            │
          └──────────┬───────────┘   │            │
                     │               │            │
                     ▼               │            │
          ┌──────────────────────┐   │            │
          │  🔊 TTS (Streaming)   │   │            │
          │  VoxCPM via nanovllm  │   │            │
          │  ~174ms to 1st chunk  │   │            │
          └──────────────────────┘   │            │
                     │               │            │
                     ▼               ▼            ▼
               用户听到第一个音节 ◄──────────────┘

🎤 ASR 加速

FireRedASR2-AED
1.15B 参数 · CER 2.89%
20+ 方言 · 噪声鲁棒

~200ms

🧠 LLM 加速

vLLM 0.16
PagedAttention · AWQ 量化
Continuous Batching

~163ms TTFT

🔊 TTS 加速

nanovllm-voxcpm
CUDA Graph · torch.compile
逐 chunk 流式 · 语音克隆

~174ms TTFA

📚 RAG 加速

bge-small + FAISS
512d embedding · IndexFlatIP
59 docs 精确搜索

~4ms


📊 同硬件三方案对比

在同一台 RTX 4090 上实测,Pipeline 方案综合最优:

方案 首响延迟 打断精度 换音色 换话术
🏆 Pipeline (本项目) 458ms 160ms 语音克隆 · 小时级 SFT · ~$20
Hybrid (Omni + TTS) ~250ms 160ms 语音克隆 Omni SFT
纯 Omni (raw transformers) 1666ms ❌ 模型原生 重训整个模型 ~$5000+

🔬 延迟实测

组件RTX 4090RTX 5090RTX 4080S
🎤 ASR200ms93ms130ms
📚 RAG4ms3ms4ms
🧠 LLM163ms130ms225ms
🔊 TTS174ms138ms115ms
🚀 Pipeline458ms342ms470ms

🏗️ 系统架构

┌─────────────────────────────────────────────────────────────────────────┐
│  客户端 — 浏览器 / 原生 macOS·iPad App / WebRTC                        │
│  麦克风 → PCM 16kHz → 服务端  |  服务端 → PCM 44.1kHz (流式) → 扬声器  │
└────────────────────────────┬────────────────────────────────────────────┘
                             ▼
┌─────────────────────────────────────────────────────────────────────────┐
│  ConversationManager v3.1 — 状态机 + PTT Demo Mode                     │
│                                                                         │
│  ┌─────┐  ┌──────────┐  ┌─────────┐  ┌─────┐  ┌───────┐  ┌─────────┐ │
│  │ VAD │→ │Turn 检测  │→ │  ASR    │→ │ RAG │→ │  LLM  │→ │TTS 流式 │ │
│  │Silero│  │Smart Turn│  │FireRed  │  │ bge │  │Qwen3  │  │ VoxCPM  │ │
│  │ CPU │  │v3 · ONNX │  │ASR2-AED │  │small│  │14B-AWQ│  │  1.5    │ │
│  └─────┘  └──────────┘  └─────────┘  └─────┘  └───────┘  └─────────┘ │
│                                                                         │
│  可选: 声纹VAD · 投机ASR · DTLN降噪 · ASR文本累积器 · 句子Cap          │
└─────────────────────────────────────────────────────────────────────────┘

🛠️ 核心工程优化

1. 流式 TTS 打断 — 160ms 精度

synthesize_stream() 逐 chunk yield (~160ms),每个 chunk 发送前检查 _cancel_speaking

旧: TTS("整句") → 3s 音频一次推入 → 打断无效 ❌
新: TTS.stream() → chunk→send→check → chunk→send→check → 打断!→停 ✅
2. 事件循环让出 — SPEAKING 状态打断修复

asyncio.sleep(0.05) 强制 50ms 间隔,事件循环有时间处理 1-2 个麦克风 chunk (32ms/个)。

3. Turn 序列号音频过滤 — 消除在途帧

服务端每轮回复前发 audio_start(turn=N),打断时前端设 playableTurn=0,不匹配的帧全部丢弃。

4. 投机式预推理 — 节省 117ms

用户停顿 160ms 时,Moonshine Tiny (27M, ONNX CPU) 后台启动投机 ASR,endpointing 确认后直接复用。

5. 自适应 Endpointing + ASR 文本累积
说话时长 静默阈值 场景
< 0.5s 640ms "嗯..."思考中
0.5~3s 416ms 正常对话
> 3s 640ms 长句

短句 (≤4字) 不立即送 LLM,缓冲等后续语音拼接。

6. PTT Demo Mode — 零 VAD 延迟

按住说话 → 松手 → ASR → RAG → LLM → TTS,跳过 VAD/endpointing/filler,延迟只取决于推理速度。


🚀 Quick Start

# 1. LLM 推理服务 (GPU 1)
CUDA_VISIBLE_DEVICES=1 python -m vllm.entrypoints.openai.api_server \
  --model models/Qwen3-14B-AWQ --served-model-name Qwen3-14B-AWQ \
  --trust-remote-code --dtype auto --quantization awq \
  --gpu-memory-utilization 0.85 --max-model-len 4096 --enforce-eager --port 8100

# 2. Voice Agent — Full-Duplex Mode (GPU 2+7)
CUDA_VISIBLE_DEVICES=2,7 ASR_DEVICE=cuda:1 TTS_DEVICE=cuda:0 \
  USE_FIRERED_ASR=1 USE_SMART_TURN=1 python ws_server.py

# 3. Voice Agent — PTT Demo Mode
DEMO_MODE=1 CUDA_VISIBLE_DEVICES=2,7 ASR_DEVICE=cuda:1 TTS_DEVICE=cuda:0 \
  USE_FIRERED_ASR=1 python ws_server.py

环境变量

变量 说明
DEMO_MODE=1 PTT 演示模式 (按住说话)
USE_FIRERED_ASR=1 FireRedASR2 (CER 2.89%)
USE_MOONSHINE_ASR=1 投机式 ASR
USE_SMART_TURN=1 Smart Turn v3
USE_SPEAKER_VAD=1 ECAPA-TDNN 声纹 VAD
USE_DENOISE=1 DTLN 降噪

🔌 API

端点 方法 说明
/ws/voice WS 全双工 / PTT 语音通道
/api/info GET 模型与配置信息
/api/rag/docs GET 知识库文档列表
/api/rag/query?q= GET 检索测试
/api/rag/reload POST 热更新知识库

🔄 可替换组件

每个组件可独立替换,无需改动其他模块:

组件 当前 可替换为
ASR FireRedASR2-AED Whisper · Paraformer · SenseVoice
LLM Qwen3-14B-AWQ / vLLM MiniCPM · DeepSeek · 任何 OpenAI 兼容
TTS VoxCPM 1.5 / nanovllm CosyVoice · IndexTTS · Fish-Speech
VAD Silero / ECAPA-TDNN FireRedVAD · WebRTC VAD
RAG bge-small + FAISS bge-m3 · Milvus · Elasticsearch
传输 WebSocket LiveKit WebRTC · SIP

📋 版本演进

版本 核心改动
v1.0 基础全双工 pipeline,语音克隆
v2.0 5 状态机,句级流式,零爆音播放
v2.1 双层打断,自适应 endpointing
v2.4 FireRedASR2,流式 TTS 打断,事件循环修复
v2.9 崩溃恢复,Filler 激活,状态竞态修复
v3.0 Qwen3-14B-AWQ,声纹门控,ASR 文本累积
v3.1 PTT Demo Mode,句子 Cap,Watchdog 守护

Apache 2.0 Licensed · Built with ❤️ on RTX 4090

About

Full-Duplex Voice Agent — ASR+RAG+LLM+TTS with voice cloning

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors