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

131
SpeechTestMainWindow.h Normal file
View File

@@ -0,0 +1,131 @@
#ifndef SPEECHTESTMAINWINDOW_H
#define SPEECHTESTMAINWINDOW_H
#include <QMainWindow>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QWidget>
#include <QPushButton>
#include <QTextEdit>
#include <QLineEdit>
#include <QLabel>
#include <QSpinBox>
#include <QGroupBox>
#include <QSplitter>
#include <QStatusBar>
#include <QTimer>
#include <QAudioSource>
#include <QAudioDevice>
#include <QIODevice>
#include <QCheckBox>
#include <QComboBox>
#include "ASRManager.h"
#include "TTSManager.h"
#include "KWSManager.h"
#include "ModelSettingsDialog.h"
#include "sherpa-onnx/c-api/c-api.h"
class SpeechTestMainWindow : public QMainWindow {
Q_OBJECT
public:
explicit SpeechTestMainWindow(QWidget* parent = nullptr);
~SpeechTestMainWindow();
private slots:
void browseFile();
void startRecognition();
void startSynthesis();
void startMicRecognition();
void stopMicRecognition();
void processAudioData();
void openModelSettings();
void onModelsChanged();
// 录音功能槽函数
void startRecording();
void stopRecording();
void processRecordingData();
// 语音唤醒功能槽函数
void startKWS();
void stopKWS();
void processKWSData();
private:
void setupUI();
void setupMenuBar();
void createOutputDirectories();
void connectSignals();
void reinitializeModels();
bool saveWavFile(const QString& filePath, const QByteArray& audioData, const QAudioFormat& format);
QByteArray convertAudioFormat(const QByteArray& inputData, const QAudioFormat& inputFormat,
const QAudioFormat& outputFormat);
// UI组件
QLineEdit* filePathEdit;
QTextEdit* asrResultEdit;
QTextEdit* ttsTextEdit;
QTextEdit* ttsResultEdit;
QSpinBox* speakerIdSpinBox;
QPushButton* micRecordBtn;
QPushButton* micStopBtn;
// 录音功能UI组件
QPushButton* recordBtn;
QPushButton* recordStopBtn;
QTextEdit* recordResultEdit;
// 录音设置(设备参数)
QComboBox* recordSampleRateComboBox;
QComboBox* recordChannelComboBox;
// 输出设置(保存格式)
QComboBox* outputSampleRateComboBox;
QComboBox* outputChannelComboBox;
// 语音唤醒功能UI组件
QPushButton* kwsStartBtn;
QPushButton* kwsStopBtn;
QTextEdit* kwsResultEdit;
// 管理器
ASRManager* asrManager;
TTSManager* ttsManager;
KWSManager* kwsManager;
// 音频输入相关(语音识别)
QAudioSource* audioSource = nullptr;
QIODevice* audioDevice = nullptr;
QTimer* audioTimer = nullptr;
bool isRecording = false;
const SherpaOnnxOnlineStream* onlineStream = nullptr;
// 音频格式转换相关
QAudioFormat currentAudioFormat;
int originalSampleRate = 0;
int originalChannelCount = 0;
// 录音功能相关
QAudioSource* recordAudioSource = nullptr;
QIODevice* recordAudioDevice = nullptr;
QTimer* recordTimer = nullptr;
bool isRecordingWav = false;
QAudioFormat recordAudioFormat;
QByteArray recordedData;
QString currentRecordingPath;
// 语音唤醒功能相关
QAudioSource* kwsAudioSource = nullptr;
QIODevice* kwsAudioDevice = nullptr;
QTimer* kwsTimer = nullptr;
bool isKWSActive = false;
QAudioFormat kwsAudioFormat;
// KWS sherpa-onnx相关
const SherpaOnnxKeywordSpotter* kwsSpotter = nullptr;
const SherpaOnnxOnlineStream* kwsStream = nullptr;
};
#endif // SPEECHTESTMAINWINDOW_H