Files
webUI/如何准备测试音频数据.md
2025-12-06 22:42:05 +08:00

263 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 📝 如何准备测试音频数据
## 你需要提供的数据格式
### 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]` 日志输出。