记基于现有项目架构通过ai生成的一个语音助手功能开发设计文档
题前不得不赞叹一句有了AI的协同,实在是太高效了
📘 语音助手功能设计文档
目录
- 系统架构概览
- 核心流程
- 翻译模式详解
- 内部处理机制
- 关键讨论点
系统架构概览
组件关系图
┌─────────────────┐ ┌─────────────────┐ ┌──────────────────────┐
│ │ │ │ │ │
│ 终端设备 │◀───────▶│ PTT 服务器 │◀───────▶│ 语音助手服务 │
│ (Terminal) │ │ (Talk/Grant) │ │ (ASR/NLU/TTS) │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └──────────────────────┘用户交互 话权管理 AI 处理引擎
核心组件说明
| 组件 | 职责 | 关键技术 |
|---|---|---|
| 终端设备 | 用户交互界面,音频采集与播放 | AI 按键、PTT 按键、音频编解码 |
| PTT 服务器 | 话权管理、音频流转发 | 群组管理、实时音频传输 |
| 语音助手 | 语音识别、意图理解、语音合成 | ASR、NLU、TTS、JS 插件 |
核心流程
1. 基础对话流程(单次指令)
graph TDA[用户按下 AI 键] --> B[终端加入语音助手群组]B --> C[用户按住 PTT 键申请话权]C --> D[麦克风采集音频]D --> E[音频发送至 PTT 服务器]E --> F[转发至语音助手]F --> G[ASR 语音识别]G --> H{是否包含唤醒词?}H -->|是/不需要| I[NLU 意图识别]H -->|否| GI --> J{识别为单次指令}J --> K[生成业务指令]K --> L[TTS 合成回复语音]L --> M[助手申请话权]M --> N[播报回复给终端]N --> O[业务指令下发]O --> P[终端执行动作]P --> Q[用户再次按 AI 键]Q --> R[退出语音助手群组]R --> S[会话结束]style A fill:#e1f5ffstyle S fill:#e8f5e9style I fill:#fff9c4style L fill:#ffe0b2
2. 流程步骤详解
阶段一:会话建立
- 用户操作:按下 AI 按键
- 终端行为:加入预定义的语音助手群组(不自动申请话权)
- 状态变化:终端进入语音助手模式
阶段二:语音交互
- 用户操作:按住 PTT 键
- 话权申请:终端向 PTT 服务器申请发言权
- 音频采集:麦克风实时采集用户语音
- 数据传输:音频流 → PTT 服务器 → 语音助手
阶段三:AI 处理
- 语音识别:ASR 将音频转为文本
- 唤醒词检测:(可选)检查是否包含唤醒词
- 意图理解:NLU 分析用户意图
- 指令生成:根据意图生成业务控制指令
阶段四:响应播报
- 语音合成:TTS 生成回复音频
- 话权申请:语音助手申请发言权
- 音频播报:回复通过 PTT 服务器发送至终端
- 指令执行:终端执行对应的业务动作
阶段五:会话结束
- 用户操作:再次按下 AI 按键
- 终端行为:退出语音助手群组
- 状态恢复:返回正常对讲模式
翻译模式详解
1. 翻译模式状态机
┌─────────────────────┐│ ││ NORMAL 模式 ││ (单次指令处理) ││ │└──────────┬──────────┘│语音指令:「进入翻译模式」│▼┌─────────────────────┐│ ││ TRANSLATION 模式 ││ (持续翻译处理) ││ │└──────────┬──────────┘│语音指令:「退出翻译模式」│▼┌─────────────────────┐│ ││ NORMAL 模式 ││ │└─────────────────────┘
2. 进入翻译模式
用户语音:「进入翻译模式」↓ASR 识别文本↓NLU 意图分析 → [模式切换意图]↓状态切换:mode = TRANSLATION↓TTS 合成:「已进入翻译模式」↓申请话权 → 播报确认
特点:
- ✅ 确认性反馈,用户明确知道模式已切换
- ✅ 后续发言将自动进入翻译流程
3. 翻译模式运行(流式处理)
终端申请话权发言(原语言)↓ASR 实时识别↓┌─────────────────┐│ 翻译引擎处理 ││ (实时翻译) │└─────────────────┘↓TTS 流式合成↓终端释放话权↓语音助手申请话权↓实时播报译文(目标语言)↓[持续循环]
优化点:
- ⚡ 流式 TTS:边翻译边播报,降低延迟
- ⚡ 断句优化:智能检测语句结束点,提升翻译准确度
4. 退出翻译模式
用户语音:「退出翻译模式」↓ASR → NLU → [退出翻译模式意图]↓状态恢复:mode = NORMAL↓TTS:「已退出翻译模式」↓播报确认 → 回到单次指令模式
以上需要翻译时也要进行NLU识别
或
用户长按AI按键↓以某种机制告知语音助手服务器「退出翻译模式」↓状态恢复:mode = NORMAL↓TTS:「已退出翻译模式」↓播报确认 → 回到单次指令模式
内部处理机制
1. 语音助手服务器处理流程
┌─────────────────────────────────────────────────────┐
│ │
│ 语音助手服务器内部架构 │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ JS 对讲插件(PTT 接入层) │ │
│ │ - 接收音频流 │ │
│ │ - 话权管理 │ │
│ │ - 群组管理 │ │
│ └───────────────────┬─────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ ASR(自动语音识别) │ │
│ │ - 音频转文本 │ │
│ │ - 唤醒词检测(可选) │ │
│ └───────────────────┬─────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ NLU(自然语言理解) │ │
│ │ - 意图识别 │ │
│ │ - 实体提取 │ │
│ │ - 上下文管理 │ │
│ └───────────────────┬─────────────────────────┘ │
│ │ │
│ ┌───────────┴────────────┐ │
│ ▼ ▼ │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ 单次指令处理 │ │ 翻译模式处理 │ │
│ │ │ │ │ │
│ │ - 业务逻辑 │ │ - 实时翻译 │ │
│ │ - 指令生成 │ │ - 流式输出 │ │
│ └──────┬───────┘ └────────┬────────┘ │
│ │ │ │
│ └──────────┬──────────────┘ │
│ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ TTS(语音合成) │ │
│ │ - 文本转语音 │ │
│ │ - 流式合成(翻译模式) │ │
│ └───────────────────┬─────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 话权申请 & 音频播报 │ │
│ │ - 向 PTT 服务器申请话权 │ │
│ │ - 推送音频流至终端 │ │
│ └─────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
2. 状态管理
| 模式 | 状态值 | 行为特征 | 退出条件 |
|---|---|---|---|
| NORMAL | mode = 0 |
单次指令响应,处理完即释放话权 | - |
| TRANSLATION | mode = 1 |
持续翻译,保持话权,流式输出 | 用户主动退出指令 |
终端侧完整流程
用户操作时序图
用户操作 终端行为 PTT 服务器 语音助手│ │ │ ││ ① 按下 AI 键 │ │ │├──────────────────────>│ │ ││ │ 加入语音助手群组 │ ││ ├────────────────────────>│ ││ │ [加入成功] │ ││ │<────────────────────────┤ ││ │ │ ││ ② 按住 PTT 键 │ │ │├──────────────────────>│ │ ││ │ 申请话权 │ ││ ├────────────────────────>│ ││ │ [话权授予] │ ││ │<────────────────────────┤ ││ │ │ ││ ③ 开始说话 │ │ │├──────────────────────>│ │ ││ │ 音频流 │ ││ ├────────────────────────>│ 音频流 ││ │ ├─────────────────────>││ │ │ ││ ④ 松开 PTT 键 │ │ [ASR 处理] │├──────────────────────>│ │ [NLU 分析] ││ │ 释放话权 │ [TTS 合成] ││ ├────────────────────────>│ ││ │ │<─────────────────────││ │ │ 申请话权 ││ │ │<─────────────────────││ │ │ [话权授予] ││ │ │─────────────────────>││ │ TTS 音频流 │ TTS 音频流 ││ │<────────────────────────│<─────────────────────││ ⑤ 听到回复 │ │ ││<──────────────────────│ │ ││ │ │ ││ ⑥ 再次按 AI 键 │ │ │├──────────────────────>│ │ ││ │ 退出语音助手群组 │ ││ ├────────────────────────>│ ││ │ [退出成功] │ ││ │<────────────────────────┤ ││ │ │ ││ 会话结束 │ │ │
关键讨论点
1. 唤醒词策略
方案 A:启用唤醒词
优点:
✅ 防止误触发,提升识别准确度
✅ 用户明确感知交互边界
✅ 可自定义品牌化唤醒词(如「小智助手」)缺点:
❌ 增加用户学习成本
❌ 每次都要说唤醒词,交互繁琐
❌ 唤醒词识别失败导致整体失败
方案 B:无唤醒词
优点:
✅ 交互流畅,自然对话
✅ 降低使用门槛
✅ 适合专用场景(已通过 PTT 明确交互意图)缺点:
❌ 可能处理背景噪音
❌ 需要 VAD(语音活动检测)辅助
建议:结合 PTT 按键的物理交互,采用方案 B(无唤醒词),通过 PTT 按键明确交互意图。
2. 指令下发通道
| 通道 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| SIP MESSAGE | 实时性要求高 | 复用现有 SIP 基础设施 | 消息大小限制 |
| HTTP API | 标准业务指令 | 易于扩展和调试 | 需要额外网络连接 |
| WebSocket | 持续状态同步 | 双向实时通信 | 连接管理复杂 |
建议:
- 单次指令:
SIP MESSAGE - 批量配置:
HTTP API - 翻译模式状态同步:
WebSocket
3. 翻译模式延迟优化
目标延迟
| 指标 | 目标值 | 关键技术 |
|---|---|---|
| ASR 延迟 | < 500ms | 流式识别、VAD 优化 |
| 翻译延迟 | < 300ms | 神经机器翻译、批处理 |
| TTS 延迟 | < 400ms | 流式合成、分段播报 |
| 总延迟 | < 1.2s | 端到端优化 |
优化手段
1. 流式处理架构ASR → 翻译 → TTS 三阶段并行2. 预测性话权申请翻译开始时提前申请话权3. 音频缓冲策略小缓冲区 + 优先级队列4. 智能断句根据语义边界触发翻译
4. 会话超时管理
超时策略
场景一:用户长时间未操作
┌──────────────────────────────────────┐
│ 最后一次交互后 60 秒 │
│ ↓ │
│ 语音助手主动 TTS 提示: │
│ 「长时间未检测到操作,即将退出」 │
│ ↓ │
│ 等待 10 秒 │
│ ↓ │
│ 无响应 → 自动退出群组 │
└──────────────────────────────────────┘场景二:翻译模式下的超时
┌──────────────────────────────────────┐
│ 翻译模式下 120 秒无新语音 │
│ ↓ │
│ 提示:「翻译模式长时间未使用」 │
│ ↓ │
│ 询问:「是否继续?」 │
│ ↓ │
│ 15 秒内无应答 → 自动退出翻译模式 │
│ 但保持在语音助手群组 │
└──────────────────────────────────────┘
建议配置:
- NORMAL 模式超时:60 秒
- TRANSLATION 模式超时:120 秒
- 提示后等待时间:10-15 秒
5. 多终端并发支持
场景分析
场景 A:单群组 + 多终端
┌────────────────────────────────────────┐
│ 语音助手群组 │
│ │
│ ┌────────┐ ┌────────┐ ┌────────┐ │
│ │终端 A │ │终端 B │ │终端 C │ │
│ └────────┘ └────────┘ └────────┘ │
│ │
│ 问题:话权冲突、响应混乱 │
└────────────────────────────────────────┘场景 B:多群组隔离
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 群组 1 │ │ 群组 2 │ │ 群组 3 │
│ │ │ │ │ │
│ 终端 A │ │ 终端 B │ │ 终端 C │
│ 助手实例 1 │ │ 助手实例 2 │ │ 助手实例 3 │
└─────────────┘ └─────────────┘ └─────────────┘
推荐方案:
- 动态群组创建:每个终端接入时创建独立临时群组
- 会话隔离:每个群组对应独立的语音助手实例
- 资源池管理:语音助手实例池 + 自动回收机制
附录
A. 技术栈建议
| 层级 | 推荐技术 | 备选方案 |
|---|---|---|
| ASR | 讯飞/百度语音 | Google Cloud Speech |
| NLU | Rasa / Dialogflow | 自研意图识别 |
| TTS | 阿里云 / 微软Azure | 本地 TTS 引擎 |
| 翻译 | 腾讯翻译君 / DeepL | Google Translate API |
| PTT 协议 | SIP / RTP | 私有协议 |
B. 性能指标
| 指标 | 目标值 | 测试方法 |
|---|---|---|
| 并发终端数 | ≥ 50 | 压力测试 |
| ASR 准确率 | ≥ 95% | 标准语料测试 |
| NLU 准确率 | ≥ 90% | 意图识别准确率 |
| 端到端延迟 | < 2s | 时间戳埋点 |
| 系统可用性 | ≥ 99.9% | 7x24 监控 |
C. 安全考虑
- 音频数据加密:传输层 DTLS-SRTP 加密
- 身份认证:终端接入需 Token 验证
- 敏感词过滤:NLU 层集成敏感词库
- 日志脱敏:音频日志不保存原始音频,仅保留文本摘要
文档版本:v1.0
最后更新:2024-11-19
维护团队:语音助手项目组