205 lines
4.5 KiB
Markdown
205 lines
4.5 KiB
Markdown
|
|
# 语音通话性能优化建议
|
|||
|
|
|
|||
|
|
## 当前状态
|
|||
|
|
|
|||
|
|
✅ 功能已实现并正常工作
|
|||
|
|
⚠️ 响应速度较慢
|
|||
|
|
|
|||
|
|
## 延迟分析
|
|||
|
|
|
|||
|
|
### 当前流程的时间消耗:
|
|||
|
|
|
|||
|
|
1. **录音时间**:用户说话的时间(2-5秒)
|
|||
|
|
2. **文件处理**:停止录音 + 读取文件(~100ms)
|
|||
|
|
3. **网络传输**:上传音频到服务器(~200-500ms,取决于文件大小和网络)
|
|||
|
|
4. **服务器处理**:
|
|||
|
|
- 语音识别(ASR):~500-1000ms
|
|||
|
|
- LLM 生成回复:~1000-3000ms
|
|||
|
|
- 文本转语音(TTS):~500-1000ms
|
|||
|
|
- 总计:~2000-5000ms
|
|||
|
|
5. **下载音频**:从服务器下载(~200-500ms)
|
|||
|
|
6. **播放音频**:解码和播放(~100ms)
|
|||
|
|
|
|||
|
|
**总延迟:约 3-7 秒**
|
|||
|
|
|
|||
|
|
## 优化方案
|
|||
|
|
|
|||
|
|
### 方案1:服务器端优化(推荐)
|
|||
|
|
|
|||
|
|
#### 1.1 使用流式 ASR
|
|||
|
|
```
|
|||
|
|
边接收边识别,不等待完整音频
|
|||
|
|
延迟降低:-1000ms
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 1.2 使用流式 TTS
|
|||
|
|
```
|
|||
|
|
边生成文本边合成语音
|
|||
|
|
延迟降低:-500ms
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 1.3 优化 LLM 调用
|
|||
|
|
```
|
|||
|
|
使用更快的模型或流式输出
|
|||
|
|
延迟降低:-1000ms
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 1.4 并行处理
|
|||
|
|
```
|
|||
|
|
ASR 完成后立即调用 LLM,同时准备 TTS
|
|||
|
|
延迟降低:-500ms
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**预期效果:总延迟降至 1-3 秒**
|
|||
|
|
|
|||
|
|
### 方案2:客户端优化
|
|||
|
|
|
|||
|
|
#### 2.1 减小音频文件大小
|
|||
|
|
|
|||
|
|
当前配置:
|
|||
|
|
```javascript
|
|||
|
|
format: 'mp3',
|
|||
|
|
sampleRate: 16000,
|
|||
|
|
encodeBitRate: 48000 // 较高
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
优化配置:
|
|||
|
|
```javascript
|
|||
|
|
format: 'mp3',
|
|||
|
|
sampleRate: 16000,
|
|||
|
|
encodeBitRate: 24000 // 降低比特率
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**效果:文件减小 50%,上传更快**
|
|||
|
|
|
|||
|
|
#### 2.2 压缩音频
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 在发送前压缩
|
|||
|
|
const compressedData = compressAudio(fileRes.data)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 2.3 预加载和缓存
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 预先建立连接
|
|||
|
|
// 缓存常用回复
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 方案3:使用实时流式传输
|
|||
|
|
|
|||
|
|
#### 3.1 客户端改造
|
|||
|
|
|
|||
|
|
需要使用原生插件或支持 `onFrameRecorded` 的方式:
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
// 实时发送音频帧
|
|||
|
|
recorderManager.onFrameRecorded((res) => {
|
|||
|
|
socketTask.send({ data: res.frameBuffer })
|
|||
|
|
})
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.2 服务器端改造
|
|||
|
|
|
|||
|
|
需要支持:
|
|||
|
|
- 流式接收音频
|
|||
|
|
- 实时 ASR
|
|||
|
|
- 流式 LLM
|
|||
|
|
- 流式 TTS
|
|||
|
|
|
|||
|
|
**效果:延迟降至 500ms-1s(类似 ChatGPT 语音)**
|
|||
|
|
|
|||
|
|
## 当前问题诊断
|
|||
|
|
|
|||
|
|
### 服务器返回 "idle timeout"
|
|||
|
|
|
|||
|
|
这说明服务器端有问题:
|
|||
|
|
|
|||
|
|
1. **检查服务器日志**
|
|||
|
|
- 是否收到音频数据?
|
|||
|
|
- 音频格式是否正确?
|
|||
|
|
- ASR 服务是否正常?
|
|||
|
|
- LLM 服务是否正常?
|
|||
|
|
- TTS 服务是否正常?
|
|||
|
|
|
|||
|
|
2. **检查超时设置**
|
|||
|
|
```python
|
|||
|
|
# 服务器端可能需要增加超时时间
|
|||
|
|
timeout = 30 # 秒
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **检查音频格式**
|
|||
|
|
- 服务器期望什么格式?
|
|||
|
|
- 是否需要特定的采样率?
|
|||
|
|
- 是否需要添加文件头?
|
|||
|
|
|
|||
|
|
## 快速改进建议
|
|||
|
|
|
|||
|
|
### 立即可做的优化:
|
|||
|
|
|
|||
|
|
1. **降低音频比特率**
|
|||
|
|
```javascript
|
|||
|
|
encodeBitRate: 24000 // 从 48000 降到 24000
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **添加进度提示**
|
|||
|
|
```javascript
|
|||
|
|
uni.showLoading({ title: '识别中...' }) // 发送后
|
|||
|
|
uni.showLoading({ title: '思考中...' }) // 识别完成后
|
|||
|
|
uni.showLoading({ title: '生成语音...' }) // LLM 完成后
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **优化用户体验**
|
|||
|
|
- 显示波形动画
|
|||
|
|
- 显示处理进度
|
|||
|
|
- 添加音效反馈
|
|||
|
|
|
|||
|
|
### 需要后端配合的优化:
|
|||
|
|
|
|||
|
|
1. **返回处理进度**
|
|||
|
|
```json
|
|||
|
|
{"type": "progress", "stage": "asr", "percent": 50}
|
|||
|
|
{"type": "progress", "stage": "llm", "percent": 70}
|
|||
|
|
{"type": "progress", "stage": "tts", "percent": 90}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
2. **使用流式返回**
|
|||
|
|
```json
|
|||
|
|
{"type": "text_chunk", "text": "你好"}
|
|||
|
|
{"type": "text_chunk", "text": ",我"}
|
|||
|
|
{"type": "text_chunk", "text": "是"}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
3. **分段返回音频**
|
|||
|
|
```json
|
|||
|
|
{"type": "audio_chunk", "data": "..."}
|
|||
|
|
{"type": "audio_chunk", "data": "..."}
|
|||
|
|
{"type": "audio_end"}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 性能对比
|
|||
|
|
|
|||
|
|
| 方案 | 延迟 | 实现难度 | 用户体验 |
|
|||
|
|
|------|------|----------|----------|
|
|||
|
|
| 当前方案 | 3-7s | 简单 | 一般 |
|
|||
|
|
| 优化比特率 | 2-6s | 很简单 | 一般 |
|
|||
|
|
| 服务器优化 | 1-3s | 中等 | 好 |
|
|||
|
|
| 实时流式 | 0.5-1s | 困难 | 很好 |
|
|||
|
|
|
|||
|
|
## 建议的实施步骤
|
|||
|
|
|
|||
|
|
1. **第一步**:降低音频比特率(立即可做)
|
|||
|
|
2. **第二步**:添加进度提示(立即可做)
|
|||
|
|
3. **第三步**:联系后端,解决 "idle timeout" 问题
|
|||
|
|
4. **第四步**:后端优化(并行处理、流式 ASR/TTS)
|
|||
|
|
5. **第五步**:考虑实时流式传输(长期目标)
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
|
|||
|
|
当前的慢主要是因为:
|
|||
|
|
1. 服务器端处理时间长(2-5秒)
|
|||
|
|
2. 服务器返回了错误(idle timeout)
|
|||
|
|
3. 没有使用流式处理
|
|||
|
|
|
|||
|
|
**优先解决服务器端的 "idle timeout" 问题,然后逐步优化。**
|