目录
目录README.md

一个基于 Python 的、端到端全流式语音助手。本项目旨在实现从语音输入AI****回复全链路的最低延迟,提供人性化低延迟的心理咨询的服务。

队伍信息

  • 团队名称:不吃芹菜
  • 参赛队员:戴逸飞,许喆,常志奇
  • 指导老师:杨鹏飞

核心特性

后端服务

  • 🎙️ 端到端流式处理: 系统的每一个环节——从音频采集、语音识别(ASR)、大语言模型(LLM)响应到语音合成(TTS)——都采用流式处理,显著降低了响应延迟。
  • ✨ 一键部署: 提供 start.shstop.sh 脚本,实现所有后端服务的一键启动、日志管理和优雅关闭,极大简化了部署流程。
  • 🧠 本地化大模型支持: 通过 Ollama 无缝对接本地部署的各种大语言模型,并封装了专业的 OllamaClient 进行高效的流式交互和对话管理,确保数据私密性和低成本运行 。
  • 🎶 高质量与多音色语音合成: 使用 CosyVoice2 先进的TTS引擎,不仅能生成自然、富有情感的语音回复,还支持通过配置文件轻松切换多种预设音色(如“妈妈”、“朋友”、“老师”)。
  • ⚡ 性能优化: 后端包含模型预热、KV缓存、TensorRT加速(可选)等多项性能优化措施,确保首次交互的低延迟。

语音助手客户端

  • 🤫 离线唤醒词检测: 支持 Snowboy 等本地化唤醒词引擎,实现低功耗、高精度的“随时唤醒”功能,让设备在待机状态下也能随时响应指令。
  • 🗣️ 智能语音检测: 在唤醒后,客户端集成了先进的 人声活动检测 (VAD) 技术,能够精确判断用户讲话的开始和结束,无需手动控制,并进行了降噪处理。

鸿蒙客户端

  • 📱 原生鸿蒙应用: 客户端基于 ArkTS 开发,充分利用鸿蒙OS的能力,提供流畅的原生用户体验。
  • 🗣️ 实时语音识别: App 集成了 SpeechRecognitionService,通过 WebSocket 将设备麦克风的音频流实时发送到后端 ASR 服务进行识别。
  • 💬 流式文本与音频播放: TextToSpeechService 负责接收后端返回的文本和音频流。文本流用于在界面上逐字显示AI的回复,音频流则通过鸿蒙的 AudioRenderer 实时播放,实现“边说边看”的同步效果 。
  • 🎨 MVVM 架构: 应用采用 MVVM(Model-View-ViewModel)设计模式,结构清晰,数据驱动UI更新,易于维护。ChatViewModel 负责业务逻辑,ChatStore 管理状态,UI(ChatPage, MicrophoneInputView)负责展示。
  • 🎭 多角色选择: App 首页提供多个AI角色卡片供用户选择,进入不同的对话场景。

系统架构

本系统采用边端协同架构。端侧负责音频的采集与播放,而边缘端则承担所有计算密集型任务(ASR, LLM, TTS)。

  • 系统架构图

系统架构图

  • 树莓派语音音箱架构图

树莓派语音音箱架构图

  • 鸿蒙APP架构图

鸿蒙APP架构图

  • 后端架构图

前端

  • 系统时序图

系统时序

技术栈

  • API 网关: FastAPI, Uvicorn
  • 语音识别 (ASR): Vosk
  • 语音合成 (TTS): CosyVoice
  • 大语言模型 (LLM): Ollama
  • 唤醒词 (Hotword): Snowboy
  • 人声活动检测 (VAD): WebRTC VAD
  • 音频处理: PyAudio, NumPy, noisereduce
  • 网络通信: Websockets, TCP Sockets
  • 鸿蒙app:ArkTS, @ohos/net/webSocket, @ohos/multimedia/audio, MVVM

安装与部署

  1. 环境准备
  • 确保您已安装 Python 3.10 或更高版本。
  • 安装并运行 Ollama,并拉取您希望使用的模型,例如:
ollama pull qwen:7b
  • 而在本项目中,我们使用的是心语14B模型,Q4_K_M量化
  • 准备好 CosyVoice 和 Vosk 的模型文件。
  1. 安装依赖

建议在conda环境中部署

  • cosyvoice2

请参考CosyVoice官方仓库

  • 边缘端环境
conda env create -f requirement/cosyvoice_vllm.yml
conda activate cosyvoice_vllm
  • 端侧环境
conda env create -f requirement/audio.yml
conda activate audio

如何运行

请确保 Ollama 服务已在后台启动,然后按照以下步骤操作。

1. 启动所有后端服务

在服务器上,只需运行一个命令即可启动所有必需的后端服务(ASR, TTS, API Server)以及 natapp 内网穿透。

bash start.sh

脚本会自动处理各个服务的启动顺序、日志记录(保存在 logs/ 目录)和进程管理(PID保存在 pids/ 目录)。natapp 启动后会提供一个公网地址,鸿蒙App应连接此地址。

2. 运行PC测试客户端

如果你想在PC上测试后端服务,可以运行端侧的主程序。

在您的客户端机器上打开终端:

python voice_assistant.py

现在说出定制的唤醒词,您可以开始与语音助手对话了!

3. 运行鸿蒙app

需要借助DevEco烧录app,请参考DevEco官方文档

4. 停止所有服务

当您想关闭所有后端服务时,运行:

bash stop.sh

该脚本会根据 pids/ 目录中记录的进程ID,安全地关闭所有正在运行的服务。

项目结构

服务器需要的代码

.
├── server/                    # 服务端核心逻辑
│   ├── prompts/               # LLM 的角色提示文件
│   ├── ollama_client.py       # Ollama LLM 客户端
│   └── tts_server_stable.py   # start.sh 使用的稳定版 TTS 服务
├── test/
│   └── test_trt.py            # TensorRT 优化脚本
├── .gitignore
├── api_server.py              # FastAPI 网关服务 (供鸿蒙App调用)
├── asr_server.py              # ASR 语音识别服务
├── start.sh                   # 一键启动所有服务的脚本
└── stop.sh                    # 一键停止所有服务的脚本

语音助手端侧需要的代码

.
├── audio_stream_client.py     # 封装了VAD、降噪和ASR流式发送逻辑 
├── tts_client.py              # 封装了TTS音频流接收和播放逻辑 
└── voice_assistant.py         # PC端语音助手的主程序和状态管理 

鸿蒙app端侧需要的代码

ets/
├── components/
│   └── MicrophoneInputView.ets # 🎙️ 麦克风按键UI组件
├── entryability/
│   └── EntryAbility.ts         # 應用入口
├── model/
│   ├── ChatModel.ets           # 📝 聊天消息的数据模型
│   └── ChatStore.ets           # 📦 聊天状态管理
├── pages/
│   ├── ChatPage.ets            # 💬 聊天主页面
│   └── Index.ets               # 🤖 AI角色选择页面
├── service/
│   ├── SpeechRecognitionService.ets # 👂 ASR 服务连接逻辑
│   └── TextToSpeechService.ets      # 🗣️ TTS 服务连接和播放逻辑
└── viewModel/
    └── ChatViewModel.ets       # 🧠 UI的业务逻辑和数据绑定
关于
443.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号