记基于现有项目架构通过ai生成的一个语音助手功能开发设计文档
题前不得不赞叹一句有了AI的协同,实在是太高效了
📘 语音助手功能设计文档
目录
系统架构概览
组件关系图
┌─────────────────┐ ┌─────────────────┐ ┌──────────────────────┐
│ │ │ │ │ │
│ 终端设备 │◀───────▶│ PTT 服务器 │◀───────▶│ 语音助手服务 │
│ (Terminal) │ │ (Talk/Grant) │ │ (ASR/NLU/TTS) │
│ │ │ │ │ │
└─────────────────┘ └─────────────────┘ └──────────────────────┘
用户交互 话权管理 AI 处理引擎
核心组件说明
| 组件 | 职责 | 关键技术 |
|---|---|---|
| 终端设备 | 用户交互界面,音频采集与播放 | AI 按键、PTT 按键、音频编解码 |
| PTT 服务器 | 话权管理、音频流转发 | 群组管理、实时音频传输 |
| 语音助手 | 语音识别、意图理解、语音合成 | ASR、NLU、TTS、JS 插件 |
核心流程
1. 基础对话流程(单次指令)
graph TD
A[用户按下 AI 键] --> B[终端加入语音助手群组]
B --> C[用户按住 PTT 键申请话权]
C --> D[麦克风采集音频]
D --> E[音频发送至 PTT 服务器]
E --> F[转发至语音助手]
F --> G[ASR 语音识别]
G --> H{是否包含唤醒词?}
H -->|是/不需要| I[NLU 意图识别]
H -->|否| G
I --> J{识别为单次指令}
J --> K[生成业务指令]
K --> L[TTS 合成回复语音]
L --> M[助手申请话权]
M --> N[播报回复给终端]
N --> O[业务指令下发]
O --> P[终端执行动作]
P --> Q[用户再次按 AI 键]
Q --> R[退出语音助手群组]
R --> S[会话结束]
style A fill:#e1f5ff
style S fill:#e8f5e9
style I fill:#fff9c4
style 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
维护团队:语音助手项目组
浙公网安备 33010602011771号