当前位置: 首页 > news >正文

ETE_Voice:端到端C++智能语音对话系统

前言

随着AI技术的发展,语音交互成为人机交互的重要方向。本文将详细介绍ETE_Voice项目——一个完整的C++端到端智能语音对话系统,集成了自动语音识别(ASR)、**大语言模型(LLM)文本转语音(TTS)**功能。

项目GitHub: https://github.com/muggle-stack/ETE_Voice
技术栈: C++17 + ONNX Runtime + PortAudio + SenseVoice + Matcha-TTS + Ollama

项目概览

系统架构

ETE_Voice采用模块化设计,工作流程如下:

用户语音 → VAD检测 → ASR识别 → LLM推理 → 句子分割 → TTS合成 → 有序播放

核心特性

  • 完整的语音对话链路: 从语音输入到语音输出的端到端处理
  • 实时流式处理: LLM流式输出配合实时TTS播放,自然对话体验
  • 模块化设计: ASR、LLM、TTS可独立使用或组合
  • 跨平台支持: 支持Linux、macOS,特别优化了RISC-V架构
  • 有序音频播放: 确保TTS按句子顺序播放,避免语音混乱

快速开始

环境要求

基础环境:

  • Linux (Ubuntu 18.04+) / macOS
  • GCC-14 (推荐) 或 GCC 5+
  • CMake 3.16+

系统依赖:

  • PortAudio 2.0 (音频录制播放)
  • libsndfile (音频文件处理)
  • ONNX Runtime (AI模型推理)
  • cURL (模型下载)
  • FFTW3 (音频信号处理)

安装步骤

1. 安装系统依赖

Ubuntu/Debian:

# 更新包管理器
sudo apt update# 安装编译工具
sudo apt install gcc-14 g++-14 cmake pkg-config# 安装音频和网络库
sudo apt install libportaudio-dev libsndfile1-dev libcurl4-openssl-dev libfftw3-dev# 安装ONNX Runtime
wget https://github.com/microsoft/onnxruntime/releases/download/v1.20.0/onnxruntime-linux-x64-1.20.0.tgz
tar -xzf onnxruntime-linux-x64-1.20.0.tgz
sudo cp -r onnxruntime-linux-x64-1.20.0/include/* /usr/local/include/
sudo cp -r onnxruntime-linux-x64-1.20.0/lib/* /usr/local/lib/
sudo ldconfig

macOS (Homebrew):

# 安装依赖
brew install gcc cmake pkg-config
brew install portaudio libsndfile curl fftw onnxruntime
2. 安装Ollama (LLM支持)
# 安装Ollama
curl -fsSL https://ollama.ai/install.sh | sh# 启动Ollama服务
sudo systemctl start ollama# 下载推荐模型
ollama pull qwen2.5:0.5b  # 轻量级模型,响应快
3. 构建项目
# 克隆项目
git clone https://github.com/muggle-stack/ETE_Voice.git
cd ETE_Voice# 构建(会自动检查依赖)
./build.sh

构建成功后,可执行文件在 build/bin/ 目录下。

使用教程

1. 完整对话系统

这是项目的核心功能,实现语音输入到语音输出的完整对话。

# 查看所有可用参数
./build/bin/asr_llm_tts --help# 使用默认参数运行
./build/bin/asr_llm_tts# 自定义参数运行
./build/bin/asr_llm_tts \--device_index 7 \--sample_rate 48000 \--vad_type silero \--model qwen2.5:0.5b \--tts_speed 1.0

使用流程:

  1. 启动程序后等待"Press Enter to record…"提示
  2. 对着麦克风说话
  3. 程序自动进行VAD检测、ASR识别
  4. 识别结果发送给LLM处理
  5. LLM回复通过TTS转为语音播放

配置参数说明:

  • --device_index: 音频设备索引,用 python search_device.py 查看
  • --vad_type: VAD类型,energy(快速) 或 silero(准确)
  • --model: LLM模型名称,建议使用 qwen2.5:0.5b
  • --tts_speed: TTS语速,1.0为正常速度

2. 音频文件处理

批量处理音频文件进行语音识别:

# 处理单个音频文件
./build/bin/asr audio_file.wav# 批量处理多个文件
./build/bin/asr file1.wav file2.wav file3.wav# 支持的格式:WAV, FLAC, OGG
# 自动重采样到16kHz进行识别

示例输出:

Processing: test.wav
Recognition: 今天天气真不错
Processing time: 1.2s

3. 实时语音识别

只进行实时语音识别,不调用LLM:

# VAD+ASR实时识别
./build/bin/vad_asr --device-index 6 --vad-type silero# 指定音频设备和VAD类型
./build/bin/vad_asr --device-index 7 --vad-type energy

4. ASR+LLM(无TTS)

语音输入,文本输出,适合调试:

./build/bin/asr_llm --model qwen2.5:0.5b

5. 独立TTS工具

将文本转换为语音:

# 基本用法
./build/bin/tts --text "你好世界"# 保存为WAV文件
./build/bin/tts --text "欢迎使用语音合成系统" --save_audio_path output.wav# 调整语速和说话人
./build/bin/tts --text "这是一个测试" --tts_speed 1.2 --save_audio_path test.wav

TTS参数说明:

  • --text: 要转换的文本内容
  • --save_audio_path: 保存音频文件路径
  • --tts_speed: 语速调节,0.5-2.0范围
  • --tts_speaker_id: 说话人ID(多说话人模型)

6. 查找音频设备

# 查看系统音频设备
python search_device.py

输出示例:

Audio Devices:0: HDA Intel PCH: ALC269 Analog (hw:0,0) - inputs: 2, outputs: 06: USB Audio Device (hw:1,0) - inputs: 1, outputs: 2  ← 推荐使用7: Built-in Microphone - inputs: 1, outputs: 0

选择有输入通道且工作正常的设备索引。

技术架构深度解析

1. VAD语音活动检测

项目实现了两种VAD算法:

能量VAD算法

基于音频能量的简单快速检测:

float AudioRecorder::computeEnergyVAD(const float* input, unsigned long frame_count) {float energy = 0.0f;for (unsigned long i = 0; i < frame_count; ++i) {energy += input[i] * input[i];}energy = std::sqrt(energy / frame_count);// 能量到概率的映射const float min_energy = 0.0001f;const float max_energy = 0.1f;return std::clamp((energy - min_energy) / (max_energy - min_energy), 0.0f, 1.0f);
}
Silero VAD模型

基于深度学习的高精度检测:

float VADDetector::detectVAD(const float* audio, size_t length) {// 512样本窗口 + 64样本上下文std::vector<float> x(config_.context_size + config_.window_size);std::copy(context_.begin(), context_.end(), x.begin());std::copy(input_audio.begin(), input_audio.end(), x.begin() + config_.context_size);// ONNX推理auto output_tensors = session_->Run(Ort::RunOptions{nullptr},input_names_.data(), input_tensors.data(), input_tensors.size(),output_names_.data(), output_names_.size());return output_tensors[0].GetTensorData<float>()[0];
}

2. SenseVoice ASR系统

项目集成了阿里巴巴开源的SenseVoice模型:

std::string ASRModel::recognize(const float* audio, size_t length) {// 1. 特征提取auto features = audio_processor_->extractFeatures(audio_vec);// 2. 准备ONNX输入张量std::vector<int64_t> feature_shape = {batch_size, sequence_length, feature_dim};std::vector<int32_t> feat_length = {static_cast<int32_t>(sequence_length)};std::vector<int32_t> language_id = {getLanguageId(config_.language)};// 3. 模型推理auto output_tensors = session_->Run(Ort::RunOptions{nullptr},input_names_.data(), input_tensors.data(), 4,output_names_.data(), 1);// 4. CTC解码和后处理auto token_ids = decodeCTC(logits, sequence_length);return postProcess(token_ids);
}

ASR特性:

  • 支持中文语音识别
  • 使用量化模型减少内存占用
  • 自动重采样支持多种音频格式

3. 流式LLM集成

通过Ollama API实现流式对话:

void generateStreamingResponse(const std::string& prompt, std::function<void(const std::string&)> callback) {json request = {{"model", params_.llm_model},{"prompt", prompt},{"stream", true}};ollama::stream_generate(request, [&](const json& response) {if (response.contains("response")) {std::string chunk = response["response"];callback(chunk);  // 实时回调处理}});
}

4. 智能文本分割

实现了支持中英文的智能句子分割:

class TextBuffer {void processBuffer() {for (size_t i = 0; i < buffer_.size(); ) {// UTF-8字符长度检测int char_len = getUTF8CharLength(buffer_[i]);std::string utf8_char = buffer_.substr(i, char_len);current_sentence += utf8_char;// 中英文标点符号检测if (isEndOfSentence(utf8_char)) {if (!current_sentence.empty()) {sentences_.push(trimWhitespace(current_sentence));}current_sentence.clear();}i += char_len;}}private:const std::string CHINESE_PUNCTUATION = "。!?;.!?;";
};

5. Matcha-TTS语音合成

采用先进的Matcha-TTS模型进行高质量语音合成:

GeneratedAudio TTSModel::generate(const std::string& text, int speaker_id, float speed) {// 1. 文本预处理和分词std::string processed_text = preprocessText(text);// 2. 文本转音素序列std::vector<int64_t> token_ids = textToTokenIds(processed_text);// 3. 添加空白音素std::vector<int64_t> tokens_with_blanks = addBlankTokens(token_ids);// 4. 声学模型推理生成Mel频谱std::vector<float> mel = runAcousticModel(tokens_with_blanks, speaker_id, speed);// 5. 声码器推理生成音频std::vector<float> audio_samples = vocoderInference(mel);return {std::move(audio_samples), config_.sample_rate};
}

TTS处理流程:

  • Jieba中文分词
  • 拼音转换和音素映射
  • Matcha声学模型生成Mel频谱
  • Vocos声码器生成最终音频

6. 有序音频播放

为解决TTS生成速度不均匀的问题,实现了有序播放队列:

class OrderedAudioQueue {void playbackWorker() {while (!stop_flag_) {OrderedAudioData audio;// 等待下一个按顺序的音频{std::unique_lock<std::mutex> lock(mutex_);cv_.wait(lock, [this] { return audio_map_.find(next_play_order_) != audio_map_.end() || stop_flag_; });auto it = audio_map_.find(next_play_order_);if (it != audio_map_.end()) {audio = it->second;audio_map_.erase(it);next_play_order_++;}}// 播放音频if (!audio.samples.empty()) {playAudioBlocking(audio.samples, audio.sample_rate);}}}
};

常见问题解决

1. 音频相关问题

Q: 如何选择正确的音频设备?

python search_device.py
# 选择有输入通道且能正常工作的设备

Q: 录音没有声音?

  • 检查麦克风权限
  • 确认设备索引正确
  • 检查采样率设置是否匹配设备

2. LLM相关问题

Q: LLM连接失败?

# 检查Ollama服务状态
sudo systemctl status ollama# 重启服务
sudo systemctl restart ollama# 确认模型已下载
ollama list

Q: 响应速度慢?

  • 使用轻量级模型如 qwen2.5:0.5b
  • 检查系统资源使用情况
  • 确保Ollama服务正常运行

3. TTS相关问题

Q: TTS无声音?

  • 检查TTS模型是否正确下载
  • 确认音频输出设备正常
  • 调整TTS参数设置

Q: 音频播放顺序混乱?
项目已通过OrderedAudioQueue解决此问题,确保按句子顺序播放。

4. 编译问题

Q: 依赖库找不到?

# 检查pkg-config是否能找到库
pkg-config --variable=libdir portaudio-2.0
pkg-config --variable=libdir sndfile# 手动指定库路径
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

TTS API集成

项目提供了独立的TTS API,可以集成到其他C++项目中:

基本使用

#include "tts_demo.hpp"int main() {// 配置参数TTSDemo::Params params;params.tts_speed = 1.0f;params.tts_speaker_id = 0;// 创建TTS实例TTSDemo tts(params);// 初始化(自动下载模型)if (!tts.initialize()) {return -1;}// 生成语音并保存tts.run("你好,欢迎使用TTS系统!", "output.wav");return 0;
}

集成到项目

  1. 复制必要文件到你的项目:
cp include/tts_demo.hpp your_project/include/
cp src/tts_demo.cpp your_project/src/
cp -r src/tts/ your_project/src/
  1. 修改CMakeLists.txt:
add_executable(your_appyour_main.cppsrc/tts_demo.cppsrc/tts/tts_model.cppsrc/tts/tts_model_downloader.cpp
)target_link_libraries(your_app onnxruntime sndfile curl pthread
)

项目特色与优势

1. 工程化程度高

  • 完整的构建系统和依赖管理
  • 自动模型下载和验证
  • 跨平台支持和优化

2. 模块化设计

  • 各组件可独立使用
  • 清晰的接口定义
  • 便于扩展和维护

3. 实时性优化

  • 流式处理减少延迟
  • 多线程并发提升效率
  • 有序播放保证体验

4. 技术先进性

  • 采用最新的开源模型
  • ONNX Runtime加速推理
  • 支持新兴的RISC-V架构

总结

ETE_Voice项目展示了如何构建一个完整的端到端智能语音对话系统。通过模块化设计、先进的AI模型集成和精心的工程优化,实现了从语音输入到语音输出的自然交互体验。

项目的主要价值在于:

  • 提供了完整的语音对话系统实现方案
  • 展示了多个AI模型的工程化集成方法
  • 解决了实时语音交互中的关键技术难题
  • 为语音AI应用开发提供了宝贵的参考

无论是学习语音AI技术,还是开发相关应用,这个项目都具有很高的参考价值。


项目地址: https://github.com/muggle-stack/ETE_Voice
作者邮箱: promuggle@gmail.com
开源协议: 个人使用免费,商业使用请看Github license

如果这个项目对您有帮助,欢迎给个Star⭐支持!

http://www.dtcms.com/a/300361.html

相关文章:

  • 用unity开发教学辅助软件---幼儿绘本英语拼读
  • 相机标定相关原理
  • 【高等数学】第五章 定积分——第五节 反常积分的审敛法 Γ函数
  • C++编程学习(第16天)
  • 【RK3568 PWM 子系统(SG90)驱动开发详解】
  • JavaScript手录06-函数
  • Linux——线程同步
  • KubeKey安装KubeSphere、部署应用实践问题总结
  • 立式加工中心X-Y轴传动机械结构设“cad【6张】三维图+设计说明书
  • 计算机中的单位(详细易懂)
  • 计算机结构-逻辑门、存储器、内存、加法器、锁存器、程序计数器
  • 斐波那契数列加强版 快速矩阵幂
  • 53. 最大子数组和
  • 组合问题(回溯算法)
  • Windows Server容器化应用的资源限制设置
  • 图书管理系统:一个功能完善的图书馆管理解决方案
  • 【C++篇】STL的关联容器:map和set(下篇):用一颗红黑树同时封装出map和set
  • CCFRec-人大高瓴-KDD2025-序列推荐中充分融合协同信息与语义信息
  • Item13:以对象管理资源
  • 人工智能论文辅导:Prompt Engineering(特征工程)
  • 倍思鹿数值仿真-实现各类提示、快捷键功能,提高工作效率
  • Android Jetpack 组件库 ->Jetpack Navigation (下)
  • 通过不同坐标系下的同一向量,求解旋转矩阵
  • 深度学习入门(2)
  • 实验-OSPF多区域
  • 告别Vite脚手架局限!MixOne Beta测试招募:你的需求,我们来实现
  • 【Java】基础概念-构造函数详解
  • [Python] -进阶理解7- Python中的内存管理机制简析
  • 基于springboot的在线数码商城/在线电子产品商品销售系统的设计与实现
  • (二)使用 LangChain 从零开始构建 RAG 系统 RAG From Scratch