# 🧪 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数据，你可以验证整个语音对话流程的正确性。

如有任何问题，请检查浏览器控制台的日志输出，那里会有详细的调试信息。

