feat: 优化语音速度
This commit is contained in:
269
TEST_MODE_GUIDE.md
Normal file
269
TEST_MODE_GUIDE.md
Normal 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数据,你可以验证整个语音对话流程的正确性。
|
||||
|
||||
如有任何问题,请检查浏览器控制台的日志输出,那里会有详细的调试信息。
|
||||
|
||||
Reference in New Issue
Block a user