# 📝 如何准备测试音频数据

## 你需要提供的数据格式

### PCM格式要求（重要！）

```
✅ 采样率: 16000 Hz
✅ 位深度: 16 bit (有符号整数，Signed Integer)
✅ 声道数: 1 (单声道，Mono)
✅ 字节序: Little Endian (小端序)
✅ 格式: 纯PCM数据（无任何文件头，不是WAV）
```

### 数据大小计算

```
数据大小（bytes）= 采样率 × 时长（秒）× 2

示例：
- 1秒音频 = 16000 × 1 × 2 = 32,000 bytes ≈ 31.25 KB
- 3秒音频 = 16000 × 3 × 2 = 96,000 bytes ≈ 93.75 KB
- 5秒音频 = 16000 × 5 × 2 = 160,000 bytes ≈ 156.25 KB
```

## 方式一：使用 FFmpeg 转换（推荐）

### 1. 从MP3/WAV/M4A等格式转换

```bash
ffmpeg -i input.mp3 -f s16le -acodec pcm_s16le -ar 16000 -ac 1 output.pcm
```

**参数说明：**
- `-i input.mp3`: 输入文件（可以是任何音频格式）
- `-f s16le`: 输出格式为16位小端序PCM
- `-acodec pcm_s16le`: 使用16位PCM编码
- `-ar 16000`: 采样率16000 Hz
- `-ac 1`: 单声道

### 2. 验证生成的PCM文件

```bash
# 查看文件大小
ls -lh output.pcm

# 计算时长（秒）= 文件大小（bytes）/ 32000
# 例如：96000 bytes / 32000 = 3 秒
```

### 3. 转换为base64

```bash
# Linux/Mac
base64 output.pcm > output_base64.txt

# 或者一行输出（适合小文件）
base64 output.pcm | tr -d '\n' > output_base64.txt

# Windows PowerShell
[Convert]::ToBase64String([IO.File]::ReadAllBytes("output.pcm")) > output_base64.txt
```

## 方式二：在线录音并导出

### 1. 使用Audacity（免费开源）

1. 打开Audacity
2. 点击红色按钮录音
3. 录制3-5秒的测试语音（说点什么都可以）
4. 点击停止
5. **设置项目采样率**：左下角设置为 `16000 Hz`
6. **转换为单声道**：轨道 → 混音 → 混音立体声为单声道
7. **导出**：
   - 文件 → 导出 → 导出音频
   - 文件类型选择：`其他未压缩文件`
   - 头部：`RAW (header-less)`
   - 编码：`Signed 16-bit PCM`
   - 保存为 `test.pcm`

### 2. 使用Python脚本录音

```python
import pyaudio
import wave
import struct

# 配置
RATE = 16000
CHANNELS = 1
FORMAT = pyaudio.paInt16
RECORD_SECONDS = 3

# 录音
audio = pyaudio.PyAudio()
stream = audio.open(format=FORMAT, channels=CHANNELS,
                    rate=RATE, input=True,
                    frames_per_buffer=1024)

print("录音中... (3秒)")
frames = []
for i in range(0, int(RATE / 1024 * RECORD_SECONDS)):
    data = stream.read(1024)
    frames.append(data)

print("录音完成")
stream.stop_stream()
stream.close()
audio.terminate()

# 保存为PCM
with open('output.pcm', 'wb') as f:
    f.write(b''.join(frames))

print("已保存为 output.pcm")
```

## 如何使用生成的数据

### 选项A：使用base64（推荐，适合小文件）

1. **转换为base64**（见上面的命令）

2. **打开** `webUI/src/utils/config.js`

3. **填入base64数据**：

```javascript
TEST_MODE: {
  enabled: true,
  testAudioBase64: 'AAEAAgADAAQABQAG...',  // 👈 粘贴你的base64字符串
  testAudioPath: '',
}
```

**完整示例：**
```javascript
TEST_MODE: {
  enabled: true,
  testAudioBase64: 'AAEAAgADAAQABQAGAAcACA...(很长的base64字符串)...==',
  testAudioPath: '',
}
```

### 选项B：使用文件路径（适合大文件）

1. **将PCM文件放入项目**：
   ```
   webUI/src/static/test_audio.pcm
   ```

2. **配置路径**：
```javascript
TEST_MODE: {
  enabled: true,
  testAudioBase64: '',  // 留空
  testAudioPath: '/static/test_audio.pcm',  // 👈 文件路径
}
```

## 快速测试数据示例

### 生成一个简单的测试文件（Python）

```python
import struct

# 生成3秒的简单正弦波（200Hz）
sample_rate = 16000
duration = 3
frequency = 200

with open('test.pcm', 'wb') as f:
    for i in range(sample_rate * duration):
        t = i / sample_rate
        # 正弦波，振幅8000
        sample = int(8000 * (2 * 3.14159 * frequency * t) ** 0.5)
        sample = max(-32768, min(32767, sample))
        f.write(struct.pack('<h', sample))  # 小端序，有符号16位

print("生成完成: test.pcm")
```

## 推荐的测试内容

建议你录制以下内容之一（3-5秒）：

1. **简单问候**：
   - "你好"
   - "今天天气怎么样"
   - "给我讲个笑话"

2. **简单指令**：
   - "帮我查询一下"
   - "打开设置"
   - "我要了解一下"

3. **随意说话**：
   - 随便说点什么都可以
   - 主要是测试流程是否正常

## 验证数据是否正确

### 检查文件大小

```bash
# 应该接近这个大小
# 3秒 = 96,000 bytes
# 5秒 = 160,000 bytes

ls -lh your_file.pcm
```

### 使用FFmpeg播放测试

```bash
# 如果能听到声音，说明格式正确
ffplay -f s16le -ar 16000 -ac 1 output.pcm
```

### 检查base64长度

```bash
# base64后的大小约为原始数据的 1.37 倍
# 96,000 bytes → 约 131,000 字符的base64
wc -c output_base64.txt
```

## 常见问题

### Q: 我的base64太长了怎么办？
A: 建议音频不要超过5秒，或者使用文件路径方式（选项B）

### Q: 如何确认生成的数据格式正确？
A: 
1. 用ffplay播放测试
2. 检查文件大小是否符合公式
3. 查看控制台日志，看是否有格式错误

### Q: 为什么必须是16000Hz？
A: 后端的STT服务要求16000Hz采样率

### Q: 可以用WAV文件吗？
A: 不行！必须是纯PCM数据，不能有WAV文件头

### Q: 我应该说什么内容？
A: 随便说什么都可以，主要是测试流程。如果想测试识别准确度，建议说清晰的普通话

## 下一步

准备好数据后：

1. 填入 `config.js` 的 `testAudioBase64` 或 `testAudioPath`
2. 设置 `enabled: true`
3. 运行项目，进入语音模式
4. 点击 "🧪 发送测试音频" 按钮
5. 观察控制台日志和结果

---

**需要帮助？** 检查浏览器控制台的 `[TestMode]` 日志输出。

