|
@@ -1,4 +1,121 @@
|
|
|
-# ASR Agent 部署步骤
|
|
|
|
|
|
|
+# ASR Agent
|
|
|
|
|
+
|
|
|
|
|
+## 项目架构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+asr/
|
|
|
|
|
+├── asr_agent/ # 服务端(Python)
|
|
|
|
|
+│ ├── dispatcher.py # HTTP Dispatcher — 多房间调度
|
|
|
|
|
+│ ├── worker.py # VAD → ASR → LLM → TTS 完整流水线
|
|
|
|
|
+│ ├── whisper_asr/ # ASR 核心引擎
|
|
|
|
|
+│ │ ├── audio_processor.py # AudioBuffer 环形缓冲
|
|
|
|
|
+│ │ ├── qwen_engine.py # Qwen3-ASR 本地引擎
|
|
|
|
|
+│ │ └── transcript_processor.py # 转录去重
|
|
|
|
|
+│ ├── silero_vad.onnx # Silero VAD ONNX 模型
|
|
|
|
|
+│ ├── Dockerfile # Worker 镜像
|
|
|
|
|
+│ └── Dockerfile.base # 基础依赖镜像
|
|
|
|
|
+├── flutter_asr_client/ # Flutter 移动客户端
|
|
|
|
|
+│ ├── lib/services/ # LiveKit / Settings 服务
|
|
|
|
|
+│ ├── lib/models/ # 消息模型
|
|
|
|
|
+│ └── lib/pages/recording/ # 录音页面 + 对话列表
|
|
|
|
|
+└── livekit-server/ # LiveKit Docker Compose
|
|
|
|
|
+ ├── docker-compose.yml
|
|
|
|
|
+ └── livekit.yaml
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 端到端数据流
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+App 麦克风 ──Opus──► LiveKit Room
|
|
|
|
|
+ │
|
|
|
|
|
+ Worker (auto_subscribe)
|
|
|
|
|
+ │
|
|
|
|
|
+ ┌─ AudioStream (16kHz PCM) ─┐
|
|
|
|
|
+ │ │
|
|
|
|
|
+ Silero VAD AudioBuffer
|
|
|
|
|
+ (ONNX 双阈值) (环形缓冲)
|
|
|
|
|
+ │ │
|
|
|
|
|
+ 语音开始/结束 │
|
|
|
|
|
+ │ │
|
|
|
|
|
+ └── VAD END ──► ASR ◄───────┘
|
|
|
|
|
+ │
|
|
|
|
|
+ Mimo ASR API
|
|
|
|
|
+ (或 Qwen3 本地)
|
|
|
|
|
+ │
|
|
|
|
|
+ transcription
|
|
|
|
|
+ │
|
|
|
|
|
+ LLM (流式 SSE)
|
|
|
|
|
+ Mimo v2.5 / vLLM
|
|
|
|
|
+ │
|
|
|
|
|
+ 分段 + TTS (并发)
|
|
|
|
|
+ Mimo TTS API (24kHz)
|
|
|
|
|
+ │
|
|
|
|
|
+ play_q 顺序入队
|
|
|
|
|
+ │
|
|
|
|
|
+ _player 单轨播放
|
|
|
|
|
+ │
|
|
|
|
|
+ LiveKit AudioTrack
|
|
|
|
|
+ │
|
|
|
|
|
+ App 扬声器播放
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 服务部署架构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+ ┌──────────────────────────┐
|
|
|
|
|
+ │ 36.152.142.37 (外网) │
|
|
|
|
|
+ └──────┬────────┬──────────┘
|
|
|
|
|
+ │ │
|
|
|
|
|
+ :10005 │ │ :10003
|
|
|
|
|
+ │ │
|
|
|
|
|
+ ┌──────▼──┐ ┌──▼──────────┐
|
|
|
|
|
+ │ nginx │ │ nginx │
|
|
|
|
|
+ │ HTTP │ │ WebSocket │
|
|
|
|
|
+ └────┬───┘ └──┬───────────┘
|
|
|
|
|
+ │ │
|
|
|
|
|
+ :9100 │ │ :7880
|
|
|
|
|
+ │ │
|
|
|
|
|
+ ┌──────────▼──┐ ┌──▼───────────┐
|
|
|
|
|
+ │ Dispatcher │ │ LiveKit │
|
|
|
|
|
+ │ HTTP API │ │ Server │
|
|
|
|
|
+ └──────┬──────┘ └──┬───────────┘
|
|
|
|
|
+ │ │
|
|
|
|
|
+ POST /connect Worker 加入房间
|
|
|
|
|
+ │ │
|
|
|
|
|
+ 创建独立房间 同一房间通信
|
|
|
|
|
+ │ │
|
|
|
|
|
+ 返回 token │
|
|
|
|
|
+ │ │
|
|
|
|
|
+ └──────┬───────────┘
|
|
|
|
|
+ │
|
|
|
|
|
+ App 连接
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 多用户隔离
|
|
|
|
|
+
|
|
|
|
|
+每个 App 调用 `POST /connect` 获取**独立房间**:
|
|
|
|
|
+
|
|
|
|
|
+- App → Dispatcher `/connect` → 返回 `{room, url, token}`
|
|
|
|
|
+- Token 带 `roomCreate: true`,App 连接时自动创建房间
|
|
|
|
|
+- Dispatcher 为每个房间启动一个 Worker 进程
|
|
|
|
|
+- Worker 处理该房间的 VAD → ASR → LLM → TTS
|
|
|
|
|
+- App 断开 → `_on_off` 检测房间空 → Worker 退出
|
|
|
|
|
+- 多 App 之间完全隔离,互不干扰
|
|
|
|
|
+
|
|
|
|
|
+## Worker 流水线详解
|
|
|
|
|
+
|
|
|
|
|
+| 组件 | 实现 | 说明 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| **VAD** | Silero VAD (ONNX) | 双阈值 0.5/0.2,5帧滑动窗口,无 ONNX 时回退能量 VAD |
|
|
|
|
|
+| **VP** | LiveKit WebRTC | AEC/ANS/AGC 由 WebRTC 处理 |
|
|
|
|
|
+| **ASR** | Mimo API / Qwen3 本地 | `ASR_PROVIDER` 环境变量切换;支持流式 SSE |
|
|
|
|
|
+| **LLM** | Mimo v2.5 / vLLM | `LLM_PROVIDER` 切换;流式 SSE + `<think>` 过滤 |
|
|
|
|
|
+| **TTS** | Mimo v2.5 API | 24kHz PCM,并行生成 + 顺序入队播放 |
|
|
|
|
|
+| **播放** | 单轨 `LocalAudioTrack` | `play_q` 队列 + `_player` 协程持续 drain |
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+## 部署步骤
|
|
|
|
|
|
|
|
## SSH 连接
|
|
## SSH 连接
|
|
|
```bash
|
|
```bash
|