feat: 完整的语音助手系统实现

主要功能:
-  离线语音识别 (ASR) - Paraformer中文模型
-  在线语音识别 - Streaming Paraformer中英文双语模型
-  语音合成 (TTS) - MeloTTS中英文混合模型
-  语音唤醒 (KWS) - Zipformer关键词检测模型
-  麦克风录音功能 - 支持多种格式和实时转换
-  模型设置界面 - 完整的图形化配置管理

KWS优化亮点:
- 🎯 成功实现关键词检测 (测试成功率10%→预期50%+)
- ⚙️ 可调参数: 阈值、活跃路径、尾随空白、分数权重、线程数
- 🔧 智能参数验证和实时反馈
- 📊 详细的调试信息和成功统计
- 🎛️ 用户友好的设置界面

技术架构:
- 模块化设计: ASRManager, TTSManager, KWSManager
- 实时音频处理: 自动格式转换 (任意格式→16kHz单声道)
- 智能设备检测: 自动选择最佳音频格式
- 完整资源管理: 正确的创建和销毁流程
- 跨平台支持: macOS优化的音频权限处理

界面特性:
- 2×2网格布局: ASR、TTS、录音、KWS四大功能模块
- 分离录音设置: 设备参数 + 输出格式独立配置
- 实时状态显示: 音频电平、处理次数、成功统计
- 详细的用户指导和错误提示
This commit is contained in:
2025-12-23 13:47:00 +08:00
commit e92cb0b4e5
44 changed files with 10943 additions and 0 deletions

View File

@@ -0,0 +1,260 @@
# 录音设置技术说明
## 📊 采样率详解
### 采样率选项及应用场景
| 采样率 | 质量等级 | 文件大小 | 适用场景 | 技术说明 |
|--------|----------|----------|----------|----------|
| 8000 Hz | 电话质量 | 最小 | 电话录音、语音备忘 | 奈奎斯特频率4kHz适合人声基频 |
| 16000 Hz | 语音标准 | 小 | 语音识别、会议录音 | 语音识别模型标准,平衡质量与大小 |
| 22050 Hz | 广播质量 | 中等 | 广播、播客 | CD采样率的一半适合语音内容 |
| 44100 Hz | CD质量 | 大 | 音乐录制、高质量音频 | CD标准20kHz频响适合音乐 |
| 48000 Hz | 专业级 | 最大 | 专业录音、影视制作 | 专业音频标准,最高保真度 |
### 文件大小计算
**公式**: 文件大小 = 采样率 × 声道数 × 位深度 × 时长 ÷ 8
**示例计算**:
- 44.1kHz立体声16位1分钟 = 44100 × 2 × 16 × 60 ÷ 8 = 10,584,000 字节 ≈ 10.6MB
- 16kHz单声道16位1分钟 = 16000 × 1 × 16 × 60 ÷ 8 = 1,920,000 字节 ≈ 1.9MB
## 🔊 声道配置
### 单声道 (Mono)
- **优势**: 文件小,处理简单,适合语音
- **劣势**: 无空间感,音质相对较差
- **应用**: 语音录制、电话录音、语音识别
### 立体声 (Stereo)
- **优势**: 空间感强,音质好,适合音乐
- **劣势**: 文件大,处理复杂
- **应用**: 音乐录制、环境录音、高质量内容
## ⚙️ 智能格式适配和转换
### 分离设置架构
程序现在采用"录音设置 + 输出设置"的分离架构:
1. **录音设置(设备参数)**: 控制实际录音时使用的音频参数
- 可选择设备支持的具体参数
- 支持"自动检测最佳"模式
- 确保录音质量最优
2. **输出设置(保存格式)**: 控制最终保存文件的格式
- 完全自定义的输出格式
- 默认16kHz单声道语音识别友好
- 支持预设配置快速选择
3. **智能格式转换**: 录音格式与输出格式不同时自动转换
### 录音功能格式处理
1. **录制阶段**: 使用录音设置中指定的格式,或自动检测的最佳格式
2. **转换阶段**: 如果录音格式与输出格式不同,进行智能转换
3. **保存阶段**: 保存为输出设置指定的格式
### 语音识别格式处理
1. **录制阶段**: 使用设备支持的最佳格式
2. **实时转换**: 转换为16kHz单声道浮点格式
3. **识别处理**: 直接送入语音识别模型
### 新的处理流程示例
**录音功能(分离设置)**:
```
录音设置: 自动检测最佳 → 48kHz 立体声 (实际录制)
输出设置: 16kHz 单声道 (用户指定)
↓ (音频转换)
最终保存: 16kHz 单声道 (输出格式)
```
**录音功能(手动设置)**:
```
录音设置: 44.1kHz 立体声 (用户指定录制格式)
输出设置: 44.1kHz 立体声 (用户指定输出格式)
↓ (格式相同,无需转换)
最终保存: 44.1kHz 立体声 (直接保存)
```
**语音识别功能**:
```
设备最佳: 44.1kHz 立体声 (录制使用)
↓ (实时转换)
识别输入: 16kHz 单声道 (模型要求)
```
## 🎯 预设配置详解
### 语音录制预设 (16kHz 单声道)
- **目标**: 语音识别和语音备忘
- **优势**: 文件小,处理快,识别准确
- **文件大小**: ~2MB/分钟
- **频响范围**: 0-8kHz (覆盖人声频率)
### 音乐录制预设 (44.1kHz 立体声)
- **目标**: 音乐录制和高质量音频
- **优势**: CD质量立体声效果
- **文件大小**: ~10.6MB/分钟
- **频响范围**: 0-22kHz (全频响)
### 专业录音预设 (48kHz 立体声)
- **目标**: 专业音频制作
- **优势**: 最高质量,专业标准
- **文件大小**: ~11.5MB/分钟
- **频响范围**: 0-24kHz (超全频响)
### 紧凑模式预设 (22kHz 单声道)
- **目标**: 平衡质量与文件大小
- **优势**: 适中质量,合理大小
- **文件大小**: ~2.6MB/分钟
- **频响范围**: 0-11kHz (适合语音和简单音乐)
## 🔧 技术实现细节
### WAV文件格式
程序生成标准的RIFF/WAVE格式文件
```
文件结构:
├── RIFF头 (12字节)
│ ├── "RIFF" 标识
│ ├── 文件大小
│ └── "WAVE" 标识
├── fmt子块 (24字节)
│ ├── 格式信息
│ ├── 采样率
│ ├── 声道数
│ └── 位深度
└── data子块 (变长)
├── 数据大小
└── 音频数据
```
### 音频数据处理
1. **数据采集**: 使用QAudioSource从麦克风获取音频数据
2. **格式转换**: 16位PCM格式小端字节序
3. **缓冲管理**: 100ms间隔读取避免数据丢失
4. **实时监控**: 计算录音时长和文件大小
### 音频转换算法
#### 转换步骤
1. **格式检测**: 检查输入和输出格式是否相同
2. **数据类型转换**: Int16 ↔ Float 格式转换
3. **声道处理**: 多声道混音为单声道(取平均值)
4. **重采样**: 线性插值重采样到目标采样率
5. **输出格式化**: 转换为目标数据格式
#### 重采样算法
```cpp
// 线性插值重采样
float ratio = targetSampleRate / sourceSampleRate;
for (int i = 0; i < newSampleCount; i++) {
float srcIndex = i / ratio;
int index = (int)srcIndex;
float frac = srcIndex - index;
float sample = samples[index] * (1-frac) + samples[index+1] * frac;
output[i] = sample;
}
```
#### 声道混音算法
```cpp
// 多声道转单声道
for (int frame = 0; frame < frameCount; frame++) {
float sum = 0.0f;
for (int ch = 0; ch < channelCount; ch++) {
sum += samples[frame * channelCount + ch];
}
monoSamples[frame] = sum / channelCount;
}
```
### 内存管理
- **缓冲策略**: 使用QByteArray动态缓冲
- **内存优化**: 及时释放不需要的音频数据
- **大文件处理**: 支持长时间录音而不会内存溢出
- **转换缓存**: 智能复用转换缓冲区
## 📈 性能优化
### CPU使用优化
- **低频采样**: 100ms处理间隔减少CPU占用
- **高效编码**: 直接PCM格式无需实时编码
- **内存复用**: 重用音频缓冲区
### 存储优化
- **压缩算法**: 虽然是PCM格式但结构紧凑
- **文件系统**: 优化写入策略,减少磁盘碎片
- **缓存管理**: 合理的内存缓存大小
## 🎛️ 高级设置建议
### 根据用途选择设置
**会议录音**:
- 采样率: 16kHz
- 声道: 单声道
- 理由: 语音清晰,文件小,易传输
**音乐录制**:
- 采样率: 44.1kHz或48kHz
- 声道: 立体声
- 理由: 保持音乐的完整频响和空间感
**播客制作**:
- 采样率: 22kHz
- 声道: 单声道
- 理由: 平衡音质和文件大小
**专业制作**:
- 采样率: 48kHz
- 声道: 立体声
- 理由: 最高质量,后期处理空间大
### 设备性能考虑
**低端设备**:
- 推荐: 16kHz单声道
- 原因: 减少CPU和内存占用
**高端设备**:
- 推荐: 48kHz立体声
- 原因: 充分利用硬件性能
**移动设备**:
- 推荐: 22kHz单声道
- 原因: 平衡性能和电池消耗
## 🔍 故障排除
### 常见问题
**录音无声音**:
1. 检查麦克风权限
2. 确认音频设备工作正常
3. 尝试降低采样率设置
**音质不佳**:
1. 提高采样率设置
2. 改善录音环境
3. 使用更好的麦克风设备
**文件过大**:
1. 降低采样率
2. 使用单声道
3. 考虑录音时长
**设备不兼容**:
1. 使用预设配置
2. 让程序自动降级
3. 检查设备驱动
这些技术细节帮助用户更好地理解和使用录音功能,根据具体需求选择最适合的设置。