VoiceDialogue / README.md
liumaolin
Update README.
2c7b9b6
|
raw
history blame
16.7 kB
metadata
title: VoiceDialogue - 智能语音对话系统
license: mit
language:
  - zh
  - en
pipeline_tag: text-to-speech
tags:
  - voice-dialogue
  - speech-recognition
  - text-to-speech
  - large-language-model
  - asr
  - tts
  - llm
  - chinese
  - english
  - real-time
library_name: transformers

VoiceDialogue - 智能语音对话系统

Python License Platform Version

一个集成了语音识别(ASR)、大语言模型(LLM)和文本转语音(TTS)的实时语音对话系统

快速开始功能特性配置说明系统架构故障排除

🎯 项目简介

VoiceDialogue 是一个基于 Python 的完整语音对话系统,实现了端到端的语音交互体验。系统采用模块化设计,支持:

  • 🎤 实时语音识别 - 基于 FunASR 和 Whisper 的高精度语音转文本
  • 🤖 智能对话生成 - 集成 Qwen2.5 等多种大语言模型
  • 🔊 高质量语音合成 - 基于 GPT-SoVITs 和 Kokoro TTS 的多角色语音生成
  • 🌐 Web API 服务 - 提供 HTTP 接口,方便与其他应用集成
  • 🔇 回声消除 - 内置音频处理技术,支持实时语音交互
  • 低延迟处理 - 优化的音频流处理管道,实现流畅对话体验

✨ 主要特性

🎵 音频处理

  • 回声消除音频捕获 - 自动消除回声干扰,提升语音质量
  • 语音活动检测(VAD) - 智能检测用户说话状态,自动开始/停止录制
  • 实时音频流处理 - 低延迟音频播放和处理

🗣️ 语音识别

  • 智能语音识别引擎 - 中文使用FunASR高精度识别,其他语言使用Whisper模型
  • 自动语言切换 - 根据启动参数自动选择最优识别引擎
  • 实时转录处理 - 流式语音转文本处理,降低响应延迟

🧠 语言模型

  • Qwen2.5 (14B) - 内置阿里巴巴开源的中文优化模型
  • LangChain 集成 - 方便扩展和支持更多语言模型
  • 自定义系统提示词 - 可在代码中配置 AI 助手的行为风格

🎭 语音合成

项目集成了两种先进的语音合成技术,支持动态说话人管理:

GPT-SoVITs 技术(中文角色)

基于 GPT-SoVITs 的中文语音合成,支持以下角色:

  • 罗翔 (Luo Xiang) - 法学教授风格,具有幽默风趣和深入浅出的讲解风格
  • 马保国 (Ma Baoguo) - 太极大师风格,带有标志性的口音和语调特色
  • 沈逸 (Shen Yi) - 学者风格,具有理性分析风格和富有磁性的嗓音
  • 杨幂 (Yang Mi) - 明星风格,拥有清甜动人的声线和自然流畅的表达方式
  • 周杰伦 (Zhou Jielun) - 歌手风格,具有标志性的说话风格和音乐气质
  • 马云 (Ma Yun) - 企业家风格,富有激情的演讲风格和商业洞察表达方式

Kokoro TTS 技术(英文角色)

基于 Kokoro TTS 的英文语音合成,支持以下角色:

  • Heart - 温暖亲切的英语女性语音,声音富有感情色彩
  • Bella - 优质的英语女性语音,具有清晰自然的发音和良好的表现力
  • Nicole - 高质量的英语女性语音,发音清晰准确,语调自然流畅

技术特点

  • 智能引擎选择 - 系统根据内容语言自动选择最适合的TTS引擎
  • 动态说话人管理 - 支持运行时动态加载和切换说话人
  • 高质量合成 - 采用先进的神经网络技术,生成自然流畅的语音
  • 可扩展架构 - 模块化设计,方便添加更多语音角色和TTS引擎

⚙️ 服务模式

  • 命令行模式 (CLI) - 在终端中直接运行,提供实时语音交互体验
  • API 服务模式 - 启动一个 FastAPI Web 服务器,提供 HTTP 接口进行交互

🚀 快速开始

系统要求

  • 操作系统: macOS 14+ (推荐)
  • Python 版本: 3.9 或更高版本
  • 内存要求: 至少 16GB RAM (推荐 32GB 用于大模型)
  • 存储空间: 至少 20GB 可用空间 (用于模型文件)

安装步骤

  1. 克隆项目
git clone https://huggingface.co/MoYoYoTech/VoiceDialogue
cd VoiceDialogue
  1. 创建并激活虚拟环境
# 使用 uv (推荐)
pip install uv
uv venv
source .venv/bin/activate

# 或使用 conda
conda create -n voicedialogue python=3.11
conda activate voicedialogue

# 或使用 venv
python -m venv voicedialogue
source voicedialogue/bin/activate
  1. 安装项目依赖
# 使用 uv (推荐)
WHISPER_COREML=1 CMAKE_ARGS="-DGGML_METAL=on" uv sync

# 或使用 pip
WHISPER_COREML=1 CMAKE_ARGS="-DGGML_METAL=on" pip install -r requirements.txt
  1. 安装音频处理工具
# macOS
brew install ffmpeg
  1. 安装额外依赖
# 安装 kokoro-onnx
uv pip install kokoro-onnx
# 或
pip install kokoro-onnx

# 重新安装指定版本的 numpy
uv pip install numpy==1.26.4
# 或
pip install numpy==1.26.4

🖥️ 应用模式

1. 命令行模式 (默认)

直接在终端进行实时语音对话。

# 启动语音对话系统 (默认使用中文,沈逸角色)
python main.py
# 或使用 uv
uv run main.py

# 指定语言和角色
python main.py --language en --speaker Heart

# 查看所有可用参数
python main.py --help

首次运行说明

  • 看到 "服务启动成功" 提示后即可开始说话
  • 系统会自动检测语音活动并进行识别和回复

2. API 服务模式

启动一个 Web 服务器,通过 HTTP 请求进行交互。

# 启动 API 服务器
python main.py --mode api
# 或使用 uv
uv run main.py --mode api

# 指定不同端口和启用热重载
python main.py --mode api --port 9000 --reload

API 服务特性

  • API 文档地址: http://localhost:8000/docs
  • 支持 TTS 模型管理(查看、加载、删除)
  • 实时模型状态监控
  • RESTful API 设计

3. 桌面应用模式 (Electron)

提供图形界面的桌面应用程序。

⚙️ 配置选项

启动参数

通过 main.py 的命令行参数可以方便地进行配置:

参数 缩写 可选值 默认值 描述
--mode -m cli, api cli 设置运行模式
--language -l zh, en zh (CLI模式) 设置用户语言
--speaker -s (动态获取) 沈逸 (CLI模式) 设置TTS语音角色
--host IP地址 0.0.0.0 (API模式) 服务器主机
--port -p 端口号 8000 (API模式) 服务器端口
--reload False (API模式) 启用热重载

支持的说话人角色(动态加载):

  • 中文角色罗翔, 马保国, 沈逸, 杨幂, 周杰伦, 马云
  • 英文角色Heart, Bella, Nicole

高级配置

大语言模型 (LLM)

  • 模型路径和参数: LLM 的模型和推理参数目前在代码中硬编码,方便快速启动。
  • 文件位置: src/VoiceDialogue/services/text/generator.py
  • 自定义: 你可以修改 LLMResponseGenerator 类中的配置。

语音识别 (ASR)

  • 引擎自动选择: 系统会根据 --language 参数自动选择最合适的 ASR 引擎。
  • 模型配置: ASR 模型的具体配置位于 src/VoiceDialogue/services/speech/recognizers/manager.py

系统提示词 (System Prompt)

  • 功能: 定义 AI 角色的行为和说话风格。
  • 文件位置: src/VoiceDialogue/services/text/generator.py
  • 自定义: 你可以修改系统提示词变量的值。

构建完整应用

项目提供了完整的构建脚本,可以一键构建包含Python后端和Electron前端的完整应用:

  1. 首先,激活当前 Python 环境
source .venv/bin/activate
# 或使用 conda
conda activate voicedialogue
  1. 使用构建脚本
# 使用构建脚本(推荐)
bash scripts/build.sh

# 或分别构建
bash scripts/build-python.sh  # 构建Python后端
bash scripts/build-electron.sh # 构建Electron前端

# 清理构建产物
bash scripts/clean.sh

📁 项目结构

VoiceDialogue/
├── src/
│   └── voice_dialogue/                # 主要源代码目录
│       ├── __init__.py               # 包初始化文件
│       ├── cli/                      # 命令行界面模块
│       │   └── args.py               # 命令行参数解析
│       ├── api/                      # Web API 模块 (FastAPI)
│       │   ├── app.py                # FastAPI 应用实例
│       │   ├── server.py             # uvicorn 服务器
│       │   ├── core/                 # API 核心配置
│       │   ├── routes/               # API 路由
│       │   ├── schemas/              # 数据模型
│       │   ├── dependencies/         # API 依赖项
│       │   └── middleware/           # 中间件
│       ├── config/                   # 配置管理
│       │   ├── paths.py              # 路径配置
│       │   └── speaker_config.py     # 说话人配置
│       ├── core/                     # 核心模块
│       │   ├── constants.py          # 全局常量和队列
│       │   └── launcher.py           # 系统启动器
│       ├── models/                   # 数据模型和任务
│       ├── services/                 # 服务模块
│       │   ├── audio/                # 音频处理服务
│       │   ├── speech/               # 语音识别服务
│       │   └── text/                 # 文本生成服务
│       └── utils/                    # 工具函数
├── electron-app/                     # Electron 桌面应用
│   ├── main.js                       # Electron 主进程
│   ├── preload.js                    # 预加载脚本
│   ├── loading.html                  # 加载页面
│   ├── utils.js                      # 工具函数
│   ├── package.json                  # Electron 依赖配置
│   ├── assets/                       # Electron 资源文件
│   ├── build/                        # 构建配置
│   └── python-dist/                  # Python 分发包
├── scripts/                          # 构建和部署脚本
│   ├── build.sh                      # 主构建脚本
│   ├── build-python.sh               # Python 打包脚本
│   ├── build-electron.sh             # Electron 打包脚本
│   └── clean.sh                      # 清理脚本
├── third_party/                      # 第三方库
│   ├── moyoyo_tts/                   # GPT-SoVITs TTS 引擎
│   └── AECAudioRecorder/             # 回声消除音频录制器
├── assets/                           # 资源文件
├── dist/                             # 分发包输出目录
├── build/                            # 构建临时文件
├── tests/                            # 测试文件
├── docs/                             # 文档目录
├── main.py                           # 项目启动入口
├── pyproject.toml                    # 项目配置文件 (uv)
├── requirements.txt                  # Python 依赖
├── uv.lock                           # uv 锁定文件
├── .python-version                   # Python 版本配置
└── README.md                         # 项目说明文档

🔧 系统架构

数据流程图 (CLI 模式)

用户语音输入 → 回声消除 → 语音活动检测 → 语音转录 (ASR) → LLM生成回复 → TTS合成 → 音频输出
↑                                                                              ↓
└─────────────────────────────── 实时语音交互循环 ────────────────────────────────┘

核心组件说明

组件 功能描述 技术实现
EchoCancellingAudioCapture 回声消除音频捕获 实时音频流捕获与预处理
SpeechStateMonitor 语音活动检测 VAD 算法检测用户说话状态
ASRWorker 语音识别转录 FunASR / Whisper 模型推理
LLMResponseGenerator 智能文本生成 Qwen2.5 (llama.cpp) 对话生成
TTSAudioGenerator 语音合成 GPT-SoVITs / Kokoro TTS 文本转语音
AudioStreamPlayer 音频流播放 实时音频输出播放
FastAPI App API服务 提供HTTP接口,封装核心服务

多线程架构

系统采用多线程设计,各组件通过队列进行通信:

  • 音频采集线程: 持续捕获音频数据
  • 语音监测线程: 检测用户语音活动
  • ASR线程: 语音识别处理
  • LLM线程: 文本生成处理
  • TTS线程: 语音合成处理
  • 音频播放线程: 音频输出播放

🛠️ 故障排除

1. 模型下载失败

  • 问题: 网络连接超时或模型下载失败。
  • 解决方案: 设置 Hugging Face 镜像。
export HF_ENDPOINT=https://hf-mirror.com
pip install -U huggingface_hub

2. 音频设备问题

  • 问题: 找不到音频设备或权限被拒绝。
  • macOS 解决方案: 系统设置 → 隐私与安全性 → 麦克风 → 启用你的终端应用 (如 iTerm, Terminal)。
  • Linux 解决方案: sudo usermod -a -G audio $USER,然后重新登录。

3. 内存不足错误 (OOM)

  • 问题: CUDA out of memory 或 RAM 不足。
  • 解决方案: LLM 是主要的内存消耗者。你可以通过修改 src/VoiceDialogue/services/text/generator.py 来降低资源消耗:
    • 更换模型: 将模型路径指向一个更小的模型(如 7B Q4 量化模型)。
    • 减少批处理大小: 减小模型参数中的 n_batch 值(如 256)。
    • 减少上下文长度: 减小 n_ctx 的值(如 1024)。

4. 依赖包冲突

  • 问题: 包版本冲突或导入错误。
  • 解决方案: 强烈建议在虚拟环境中安装。如果遇到问题,尝试重建虚拟环境。
# 使用 conda
conda deactivate
conda env remove -n voicedialogue

# 使用 uv
rm -rf .venv
uv venv

5. 说话人角色不存在

  • 问题: 指定的说话人不在支持列表中。
  • 解决方案: 使用 python src/VoiceDialogue/main.py --help 查看所有可用的说话人角色。

6. FFmpeg 相关错误

  • 问题: 音频处理失败或编解码错误。
  • 解决方案: 确保正确安装 FFmpeg:
# 检查 FFmpeg 安装
ffmpeg -version

# 重新安装 FFmpeg
# macOS
brew reinstall ffmpeg

7. Python 版本兼容性

  • 问题: Python 版本过低导致的兼容性问题。
  • 解决方案: 确保使用 Python 3.11+ 版本:
python --version
# 如果版本过低,请升级或使用虚拟环境

8. 桌面应用相关问题

  • 问题: Electron 应用启动失败或功能异常。
  • 解决方案:
    • 确保 Node.js 版本 >= 16
    • 重新安装依赖:cd electron-app && npm install
    • 检查 Python 后端是否正常运行

9. 构建打包问题

  • 问题: 使用构建脚本失败。
  • 解决方案:
    • 确保有执行权限:chmod +x scripts/*.sh
    • 检查所有依赖是否安装完成
    • 查看具体错误日志进行调试

📊 性能优化建议

硬件优化

  • 内存: 推荐 32GB RAM 以获得最佳性能
  • 存储: 使用 SSD 硬盘可显著提升模型加载速度
  • CPU: 多核处理器有助于多线程处理

软件优化

  • 模型选择: 根据硬件配置选择合适大小的模型
  • 批处理优化: 调整 LLM 的 n_batch 参数
  • 音频缓冲: 根据延迟要求调整音频缓冲区大小

📄 许可证

本项目采用 MIT 许可证开源。

🤝 贡献指南

欢迎提交 Pull Request 和 Issue!

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 开启 Pull Request

如果这个项目对您有帮助,请给我们一个 ⭐️!