# meeting
**Repository Path**: xhyym/meeting
## Basic Information
- **Project Name**: meeting
- **Description**: 流式语音服务
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-04-08
- **Last Updated**: 2026-04-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 会议语音转写与分析服务
这是一个基于 FastAPI 和 FunASR 模型库构建的后端服务,提供语音转写、声纹识别、用户管理和历史记录等功能。
## ✨ 主要功能
- **实时语音转写**: (新增) 支持通过 WebSocket 进行高性能、低延迟的实时语音识别,并能动态识别说话人角色。
- **离线文件转写**: 支持通过文件上传或 URL 链接的方式提交音频,进行语音到文本的转换。
- **声纹识别**: 支持用户注册声纹,并在转写结果中识别出对应的说话人。
- **用户系统**: 包含用户注册、登录、权限管理等功能。
- **历史记录**: 保存用户的每一次转写任务,并提供查询和编辑接口。
- **后台处理**: 使用多进程工作池(Worker)处理耗时的转写任务,避免阻塞 API。
- **模块化设计**: 项目代码经过重构,具有清晰的模块化结构,易于维护和扩展。
- **配置分离**: 应用的核心参数通过 YAML 文件进行统一管理。
---
## 实时转写核心架构解析
新增的实时语音转写功能通过 WebSocket 实现,其后端架构由四个核心模块协同工作,构成一个高效的流式处理管道。
```mermaid
graph TD
A[客户端] -- 原始音频流 --> B["app/api/ws.py
(调度中心)"];
B -- receive_bytes() --> C["app/core/vad_processor.py
(智能音频切分员)"];
C -- 检测到完整语音片段 --> D[回调 handle_segmented_audio];
B -.-> D;
D -- submit(语音片段) --> E["app/core/worker.py
(计算中心)
ProcessPoolExecutor"];
D -- create_task() --> F["ws.py 内部的 process_pipeline 任务"];
E -- 执行 execute_stream_asr
返回 {text, embedding} --> G[future 对象];
F -- await future --> H[拿到识别结果];
H -- 使用结果和历史 --> I["app/core/stream_state.py
(决策与记忆大脑)"];
I -- 判断角色/更新状态 --> F;
F -- 最终结果 --> B;
B -- send_text() --> A[客户端];
subgraph "主进程 (FastAPI Event Loop)"
B
C
D
F
H
I
end
subgraph "独立的 Worker 子进程"
E
end
```
### 1. `app/api/ws.py` - 调度中心
- **角色**: 整个实时处理流程的总指挥和调度员。
- **职责**:
- 维护与客户端的 WebSocket 连接。
- 接收原始音频流,并将其传递给 `vad_processor`。
- 定义 `handle_segmented_audio` 回调函数,在收到切分好的音频片段后,将其提交到 `worker` 进程池进行计算。
- 创建并管理 `process_pipeline` 异步任务,该任务负责等待 `worker` 的计算结果,并调用 `stream_state` 进行业务逻辑处理。
- 将最终处理好的文本和角色信息发送回客户端。
### 2. `app/core/vad_processor.py` - 智能音频切分员
- **角色**: 流水线的“第一道关卡”,负责将原始、连续的音频流“粗加工”成高质量的“半成品”。
- **职责**:
- **缓冲音频**: 持续接收并缓冲来自 `ws.py` 的音频数据。
- **智能切分**: 利用 VAD (Voice Activity Detection) 模型检测语音活动,但并非简单地切分。它采用一系列高级策略来寻找最佳切割点:
- **最小发送时长**: 避免切分出不利于 ASR 模型识别的超短句(如“嗯”)。
- **安全静音填充**: 确保在用户一句话说完后等待一小段静音再切割,防止切断句末的词。
- **上下文重叠 (Overlapping)**: 这是提升准确率的关键策略。它会保留上一个片段的尾音,并拼接到下一个片段的开头,以解决单词被切割在两个片段之间的问题。
### 3. `app/core/worker.py` - 重计算引擎
- **角色**: 应用的“引擎室”,一个由多个独立进程组成的计算集群,负责执行所有CPU和GPU密集型任务。
- **职责**:
- **环境隔离**: 通过 `ProcessPoolExecutor` 创建进程池,每个 Worker 进程在启动时独立加载 AI 模型 (`init_worker_process`),与主服务进程完全隔离。
- **执行 `execute_stream_asr`**: 这是为实时流定制的核心函数。它在 Worker 进程中运行,接收 `vad_processor` 切分好的音频片段,完成两项主要工作:
1. **ASR 推理**: 调用 FunASR 模型将音频转换为文本。
2. **声纹提取**: 调用声纹模型,从音频中提取声纹向量 (Embedding)。
- **返回纯数据**: 执行完毕后,它将 `text` 和 `embedding` 打包成一个字典返回给主进程,不参与任何业务逻辑。
### 4. `app/core/stream_state.py` - 决策与记忆大脑
- **角色**: 为每一次独立的 WebSocket 连接提供记忆和决策能力。
- **职责**:
- **状态机管理**: 将会话分为 `COLD_START`(冷启动)和 `CRUISING`(巡航)两个阶段。
- **冷启动**: 在会话之初,负责收集信息,判断何时触发 LLM 进行角色“锚定”。
- **巡航**: 角色锚定后,优先通过快速的声纹比对 (`match_role_by_voice`) 识别说话人。
- **记忆存储**: 维护 `buffer_history` (对话历史) 和 `spk_clusters` (按角色分类的声纹库)。
- **决策支持**: 提供 `check_trigger_condition` 等方法,帮助 `ws.py` 判断是否应该调用昂贵的 LLM,并通过 `register_voiceprints`、`update_anchor` 等方法动态更新声纹库。
---
## 📂 项目结构
项目的主要代码都在 `app` 目录下,结构如下:
```
app/
├─── api/ # API 接口模块 (按功能划分)
│ ├─── auth.py
│ ├─── history.py
│ ├─── transcription.py
│ └─── ws.py (实时接口)
├─── core/ # 核心共享组件
│ ├─── globals.py
│ ├─── stream_state.py
│ ├─── vad_processor.py
│ └─── worker.py
├─── db/ # 数据库连接逻辑
│ └─── db.py
├─── service/ # 业务逻辑服务 (如登录、注册)
│ └─── ...
├─── config/ # 配置文件
│ └─── base.yaml
└─── app.py # FastAPI 应用主入口
```
## 🚀 快速开始
请按照以下步骤在您的本地环境中设置和运行本项目。
### 1. 环境准备
推荐使用 Conda 创建一个独立的 Python 3.10 环境。
```bash
# 创建环境
conda create -n meeting python=3.10
# 激活环境
conda activate meeting
```
### 2. 安装依赖
在激活 Conda 环境后,使用 `pip` 安装 `requirements.txt` 中列出的所有依赖。
```bash
pip install -r requirements.txt
```
> **注意**: `requirements.txt` 中已为部分仅支持 Linux 的库(如 `triton`, `modelscope`)添加了平台标记,使其在 macOS 上安装时会被自动跳过。
### 3. 数据库设置
- **导入数据表**: 将项目根目录下的 `scripts/meeting.sql` 文件导入到您的 MySQL 数据库中。
- **修改连接信息**: **重要!** 打开 `app/config/mac_local.yaml` 或对应环境配置文件,在 `db` 节点下修改 `host`, `port`, `user`, `password`, `database` 等参数,以匹配您自己的数据库配置。
### 4. 模型和应用配置
- **下载模型**: 项目所需的 ASR, VAD, Punc, SPK 等模型需要您从 ModelScope 或 FunASR 官方渠道下载。
- **修改配置**: 打开 `app/config/base.yaml` 文件,在 `paths` 部分,将 `asr_model`, `vad_model` 等路径修改为您本地存放模型的实际路径。您也可以在此文件中调整服务器端口等其他设置。
### 5. 运行服务
完成以上所有步骤后,在项目根目录运行以下命令来启动应用:
```bash
uvicorn app.app:app --host 0.0.0.0 --port 8000
```
服务启动后,您可以通过 `http://:/docs` 访问自动生成的 API 文档页面。
## 📚 API 概览
本项目 API 按照功能被划分到不同的模块中,主要包括:
- **Authentication**: 用户认证 (登录、注册、登出)
- **User Management**: 用户管理 (查询、编辑、删除)
- **Voiceprint Management**: 声纹管理 (注册、查询、删除)
- **Transcription History**: 转写历史记录 (查询、详情、更新)
- **Transcription**: 核心转写服务 (提交转写任务、查询结果)
- **WebSocket**: 实时语音转写服务。