feat: 优化语音速度

This commit is contained in:
liqupan
2025-12-06 22:42:05 +08:00
parent 7fe4b05cf8
commit 309b1318a7
7 changed files with 1523 additions and 6 deletions

269
TEST_MODE_GUIDE.md Normal file
View File

@@ -0,0 +1,269 @@
# 🧪 WebSocket语音流测试模式使用指南
## 概述
测试模式允许你在不使用实际录音功能的情况下测试WebSocket语音流式对话功能。这对于在不支持录音的环境如某些微信小程序开发环境或需要使用特定测试数据的场景非常有用。
## 启用测试模式
`webUI/src/utils/config.js` 中配置:
```javascript
TEST_MODE: {
enabled: true, // 设置为 true 启用测试模式false 使用正常录音
audioDuration: 3, // 测试音频时长(秒)
sampleRate: 16000, // 采样率Hz
channels: 1, // 声道数1=单声道2=立体声)
bitDepth: 16 // 位深度8或16
}
```
## 测试模式特性
### 启用时enabled: true
- ✅ 显示 "🧪 发送测试音频" 按钮
- ✅ 禁用自动录音功能
- ✅ 点击按钮发送假数据到WebSocket
- ✅ 页面提示 "测试模式:点击发送假数据"
### 禁用时enabled: false
- ✅ 隐藏测试按钮
- ✅ 启用正常录音功能
- ✅ 自动模式下自动开始录音
## 使用步骤
1. **启用测试模式**
```javascript
// 在 config.js 中
TEST_MODE: { enabled: true }
```
2. **进入语音模式**
- 点击输入框右侧的 🎧 图标切换到语音模式
3. **发送测试数据**
- 点击 "🧪 发送测试音频" 按钮
- 系统会自动生成假PCM数据并发送到WebSocket服务器
4. **观察结果**
- STT识别结果会显示在聊天界面
- AI回复会实时流式显示
- TTS音频会实时播放
## PCM音频数据格式说明
### 当前生成的测试数据格式
代码会自动生成符合以下规格的PCM数据
```javascript
{
采样率: 16000 Hz, // 16kHz语音常用采样率
位深度: 16 bit, // 16位有符号整数
声道数: 1, // 单声道
字节序: Little Endian, // 小端序
时长: 3秒,
数据大小: 96000 bytes // = 16000 * 3 * 2
}
```
### 测试数据生成原理
代码生成的是一个模拟人声的音频信号:
- **基频**: 200Hz人声范围
- **泛音**: 包含2次和3次谐波让声音更丰富
- **噪声**: 添加轻微随机噪声,模拟呼吸音
- **包络**: 淡入淡出效果,让声音更自然
### 如果需要使用真实音频文件
如果你想使用真实的音频文件进行测试需要先将音频转换为PCM格式
#### 1. 使用FFmpeg转换
```bash
# 从MP3/WAV转换为PCM
ffmpeg -i input.mp3 -f s16le -acodec pcm_s16le -ar 16000 -ac 1 output.pcm
# 参数说明:
# -f s16le: 输出格式为16位小端序PCM
# -acodec pcm_s16le: 使用16位PCM编码
# -ar 16000: 采样率16kHz
# -ac 1: 单声道
```
#### 2. 在代码中使用真实PCM文件
修改 `ChatBox.vue` 中的 `generateTestPCMAudio()` 函数:
```javascript
// 方案A: 直接读取PCM文件
const generateTestPCMAudio = async () => {
// #ifdef MP-WEIXIN
const fs = uni.getFileSystemManager();
return new Promise((resolve, reject) => {
fs.readFile({
filePath: '/static/test_audio.pcm', // 你的PCM文件路径
success: (res) => {
resolve(res.data); // res.data 是 ArrayBuffer
},
fail: reject
});
});
// #endif
};
// 方案B: 从base64字符串加载
const TEST_PCM_BASE64 = "你的base64编码的PCM数据...";
const generateTestPCMAudio = () => {
return uni.base64ToArrayBuffer(TEST_PCM_BASE64);
};
```
#### 3. 获取音频的base64编码
```bash
# Linux/Mac
base64 output.pcm > output_base64.txt
# Windows PowerShell
[Convert]::ToBase64String([IO.File]::ReadAllBytes("output.pcm")) > output_base64.txt
```
然后将base64字符串复制到代码中。
## PCM数据格式要求
### 必须满足的要求
✅ **格式**: 原始PCM数据无文件头
✅ **采样率**: 16000 Hz后端STT服务要求
✅ **位深度**: 16 bit
✅ **声道数**: 1单声道
✅ **字节序**: Little Endian小端序
✅ **编码**: 有符号整数Signed Integer
### 数据大小计算
```
数据大小(字节)= 采样率 × 时长(秒)× 声道数 × (位深度/8)
示例3秒的音频
= 16000 × 3 × 1 × 2
= 96000 bytes
= 93.75 KB
```
## 注意事项
⚠️ **测试数据限制**
- 生成的测试数据是简单的合成音,不包含真实语音内容
- STT识别结果可能为空或乱码取决于STT服务对合成音的处理
- 如需测试真实识别请使用真实录音的PCM数据
⚠️ **WebSocket模式要求**
- 测试模式需要配合WebSocket模式使用
- 确保在 `ChatBox.vue` 中设置 `isWebSocketMode.value = true`
- 确保WebSocket服务器正在运行
⚠️ **性能考虑**
- 较长的音频文件会占用更多内存
- 建议测试音频时长不超过5秒
- 如需长时间测试,可以循环发送短音频
## 调试技巧
### 查看浏览器控制台
测试模式会输出详细日志:
```
[TestMode] 生成测试PCM音频: {
sampleRate: 16000,
duration: "3秒",
channels: 1,
bitDepth: "16位",
dataSize: "96000 bytes",
frequency: "200 Hz"
}
[TestMode] 开始发送测试音频数据
[VoiceMode] 测试音频已通过WebSocket发送
```
### 验证数据格式
在浏览器控制台检查:
```javascript
// 检查生成的数据
const data = generateTestPCMAudio();
console.log('数据类型:', data instanceof ArrayBuffer);
console.log('数据大小:', data.byteLength, 'bytes');
console.log('预期大小:', 16000 * 3 * 2, 'bytes');
```
## 故障排除
### 问题1: 点击按钮无反应
- 检查是否已进入语音模式(点击🎧图标)
- 检查是否启用了WebSocket模式
- 查看浏览器控制台是否有错误
### 问题2: STT识别结果为空
- 这是正常的,合成音不包含真实语音内容
- 使用真实PCM录音文件进行测试
### 问题3: WebSocket连接失败
- 检查后端服务是否运行
- 检查 `config.js` 中的 `WS_BASE_URL` 配置
- 检查网络连接和防火墙设置
### 问题4: 音频无法播放
- 检查返回的TTS音频格式
- 查看浏览器控制台的音频播放日志
- 确认播放权限已授予
## 示例代码
### 完整的测试流程示例
```javascript
// 1. 配置测试模式
// config.js
export const API_CONFIG = {
TEST_MODE: {
enabled: true,
audioDuration: 3,
sampleRate: 16000,
channels: 1,
bitDepth: 16
}
};
// 2. 进入语音模式
toggleVoiceMode(); // 点击🎧图标
// 3. 发送测试数据
sendTestAudio(); // 点击测试按钮
// 4. 观察回调
voiceStreamWs.on('sttResult', (text) => {
console.log('识别结果:', text);
});
voiceStreamWs.on('sentence', (sentence) => {
console.log('完整句子:', sentence);
});
voiceStreamWs.on('audioChunk', (audioData) => {
console.log('收到音频:', audioData.byteLength, 'bytes');
});
```
## 总结
测试模式为你提供了一个便捷的方式来测试WebSocket语音流功能无需实际录音设备。通过生成符合格式的假PCM数据你可以验证整个语音对话流程的正确性。
如有任何问题,请检查浏览器控制台的日志输出,那里会有详细的调试信息。