| 模块 | 功能 | 描述 |
|---|---|---|
| 🎙️ 实时识别 | 三模式识别 | Online/Offline/2pass 混合模式,支持实时显示 |
| 📁 离线转写 | 大文件处理 | 支持 1-2 小时音频,最大 2GB,自动分片上传 |
| 🤖 AI 总结 | 纪要 + 时间线 | 手动生成会议纪要(摘要/要点/待办),流程时间线增量总结 |
| 👤 用户系统 | 认证管理 | 登录/注册/JWT 认证,用户数据完全隔离 |
| 📊 历史管理 | 会议管理 | 列表/详情/搜索功能,按用户隔离数据 |
- 实时显示: 2pass 模式下实时展示识别结果
- 智能纪要: 一键生成摘要、要点、待办
- 流程时间线: 基于增量识别内容提取会议关键节点
- 多格式支持: MP3/WAV/M4A/AAC/FLAC 音频格式
- 热词优化: 支持自定义热词提升特定词汇识别率
- 数据安全: JWT 令牌认证,24 小时过期自动刷新
- Python 3.8+
- Linux/WSL 环境
- 4GB+ 内存(推荐 8GB)
- 10GB+ 磁盘空间(含模型文件)
# 克隆项目
git clone <your-repo-url>
cd EchoCore
# 安装 Python 依赖
pip install -r requirements.txt
# 推荐优先使用 Docker 镜像启动(见下方「Docker 部署」)
#
# 如需手动本地启动(非 Docker),请先自行编译 runtime:
# ./scripts/build_runtime.sh --gpu # 或 --cpu模型文件已包含在 data/models/ 目录中。如需使用外部模型:
# 设置模型路径环境变量
export MODEL_DIR=/path/to/your/data/models或在 config/settings.yaml 中配置:
asr:
model_dir: "path/to/your/data/models"cd scripts
# 启动所有服务(2pass 混合模式 + GPU,默认)
./start.sh start --2pass --gpu
# 或使用 CPU 模式(适用于无 GPU 环境)
./start.sh start --2pass --cpu
# 如需强制 2pass 的 ORT 也使用 GPU(可能更吃显存/更慢)
FUNASR_ORT_USE_CUDA=1 ./start.sh start --2pass --gpu
# 查看服务状态
./start.sh status
# 停止所有服务
./start.sh stop# 终端 1: 启动 ASR 服务
./runtime/build/bin/funasr-wss-server-2pass \
--download-model-dir ./data/models \
--model-dir ./data/models/iic/speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-onnx \
--online-model-dir ./data/models/iic/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx \
--vad-dir ./data/models/iic/speech_fsmn_vad_zh-cn-16k-common-onnx \
--punc-dir ./data/models/iic/punc_ct-transformer_zh-cn-common-vad_realtime-vocab272727-onnx \
--decoder-thread-num 20 --model-thread-num 1 --io-thread-num 2 --port 10095
# 终端 2: 启动 Web 服务
cd backend
python main.py打开浏览器访问:http://localhost:8080
注意: 首次启动会加载模型,请确保网络连接稳定。
推荐直接使用已打包镜像启动:
# 1) 拉取镜像
docker pull crpi-mbgis9cix10urfs4.cn-hangzhou.personal.cr.aliyuncs.com/apollo_yh/echocore:v1
# 2) 启动容器
docker run -d \
--name echocore \
--restart unless-stopped \
--gpus all \
-p 8080:8080 \
-p 10095:10095 \
-e FUNASR_ORT_USE_CUDA=0 \
-e MODELSCOPE_CACHE=/app/data/modelscope_cache \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
-v ./logs:/app/logs \
-v ./data:/app/data \
crpi-mbgis9cix10urfs4.cn-hangzhou.personal.cr.aliyuncs.com/apollo_yh/echocore:v1
# 3) 查看日志
docker logs -f echocore默认行为:
- 使用
2pass + GPU启动服务 FUNASR_ORT_USE_CUDA=0(更接近官方实时模式,GPU占用更稳)
如果你要强制 2pass 的 ORT 也走 GPU(可能更吃显存/更慢):
docker rm -f echocore
docker run -d \
--name echocore \
--restart unless-stopped \
--gpus all \
-p 8080:8080 \
-p 10095:10095 \
-e FUNASR_ORT_USE_CUDA=1 \
-e MODELSCOPE_CACHE=/app/data/modelscope_cache \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=compute,utility \
-v ./logs:/app/logs \
-v ./data:/app/data \
crpi-mbgis9cix10urfs4.cn-hangzhou.personal.cr.aliyuncs.com/apollo_yh/echocore:v1如需本地构建镜像(开发调试):
docker compose up -d --build
docker compose logs -f- 注册/登录: 首次使用需要注册账号
- 创建会议: 输入会议名称(可选)
- 选择模式:
- 🌟 混合模式(推荐): 平衡速度与准确率,实时显示结果
- ⚡ 实时模式: 快速响应,逐句返回
- 🎯 离线模式: 高精度,适合复杂音频环境
- 设置热词(可选): 输入专业术语、人名等提升识别率
- 开始会议: 点击"开始会议"按钮
- 实时查看: 语音识别结果实时显示
- 生成纪要: 会后点击“生成纪要”,输出摘要/要点/待办
- 会议进行中会按识别内容增量提炼关键节点
- 用于展示会议进展、转折点和阶段性结论
- 与右侧会议纪要面板解耦,纪要仍由用户手动触发生成
适用于长音频文件(1-2 小时):
- 切换到"离线模式"标签
- 上传文件: 拖拽或点击选择音频
- 查看进度: 上传进度 + 识别进度双栏显示
- 获取结果: 识别完成后自动显示完整转写
技术细节: 支持最大 2GB 文件,使用 8MB 分片并发上传
编辑 config/settings.yaml:
# Web 服务配置
web:
host: "0.0.0.0"
port: 8080
# ASR 服务配置
asr:
host: "127.0.0.1"
port: 10095
# LLM 服务配置
llm:
provider: "ollama" # 可选: ollama | openai | claude
api_base: "http://localhost:11434"
model: "qwen2.5:7b"
# api_key: "" # OpenAI/Claude 需要
# 认证配置
auth:
secret_key: "your-secret-key-change-in-production"asr:
model_dir: "./data/models" # 本地模型目录
# 或使用绝对路径
# model_dir: "/home/user/EchoCore/data/models"# 安装 Ollama
curl -fsSL https://ollama.ai/install.sh | sh
# 启动服务
ollama serve
# 下载模型(至少 7B 参数)
ollama pull qwen2.5:7bllm:
provider: "openai"
api_base: "https://api.openai.com/v1"
model: "gpt-4"
api_key: "sk-xxx"llm:
provider: "claude"
api_base: "https://api.anthropic.com/v1"
model: "claude-sonnet-4-20250514"
api_key: "sk-ant-api03-xxx"| 方法 | 路径 | 说明 | 请求体 |
|---|---|---|---|
| POST | /api/auth/login |
用户登录 | {username, password} |
| POST | /api/auth/register |
用户注册 | {username, password, email?} |
| GET | /api/auth/me |
获取当前用户 | Headers: Authorization: Bearer <token> |
| POST | /api/auth/refresh |
刷新令牌 | Headers: Authorization: Bearer <token> |
登录响应示例:
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer",
"user": {
"id": "uuid",
"username": "username",
"email": "email@example.com"
}
}| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/meetings |
创建会议(需登录) |
| GET | /api/meetings |
获取会议列表 |
| GET | /api/meetings/{id} |
获取会议详情 |
| POST | /api/meetings/{id}/end |
结束会议 |
| DELETE | /api/meetings/{id} |
删除会议 |
| GET | /api/meetings/{id}/transcript |
获取转写内容 |
| GET | /api/meetings/{id}/summary |
获取会议总结 |
| GET | /api/meetings/search?q=关键词 |
搜索会议 |
创建会议请求:
{
"name": "项目周会",
"mode": "2pass",
"hotwords": {
"项目名称": 2,
"术语": 1
}
}| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/offline/uploads/init |
初始化上传会话 |
| PUT | /api/offline/uploads/{id}/chunks/{index} |
上传分片 |
| POST | /api/offline/uploads/{id}/complete |
完成上传 |
| GET | /api/offline/jobs/{id} |
获取任务状态 |
| POST | /api/offline/jobs/{id}/cancel |
取消任务 |
上传流程:
1. POST /uploads/init → 获取 upload_id
2. PUT /uploads/{id}/chunks/0 → 上传第 1 个分片
3. PUT /uploads/{id}/chunks/1 → 上传第 2 个分片
...
4. POST /uploads/{id}/complete → 合并文件,开始识别
5. GET /jobs/{id} → 轮询状态
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/realtime/summary |
生成流程时间线增量总结(供左侧流程时间线) |
| GET | /api/realtime/status |
服务状态检查 |
说明:该接口用于会议进行中“流程时间线”增量提炼,不用于右侧会议纪要面板。 右侧会议纪要(摘要/要点/待办)由前端点击“生成纪要”后调用
/api/llm/summarize生成。
增量总结请求:
{
"text": "会议讨论内容...",
"previous_summary": "之前的摘要..."
}EchoCore/
├── backend/ # FastAPI 后端服务
│ ├── main.py # 应用入口
│ ├── config.py # 配置管理
│ ├── routes/ # API 路由
│ │ ├── auth.py # 认证接口
│ │ ├── meetings.py # 会议管理
│ │ ├── offline.py # 离线上传
│ │ ├── realtime.py # 实时总结
│ │ └── llm.py # LLM 集成
│ ├── services/ # 业务逻辑
│ │ ├── auth_service.py # JWT 认证服务
│ │ ├── llm_service.py # LLM 调用封装
│ │ └── meeting_service.py # 会议数据服务
│ └── models/ # 数据模型
│ └── user.py # 用户模型
├── frontend/ # 前端资源
│ ├── index.html # 主页面
│ ├── css/
│ │ └── main.css # 样式文件
│ └── js/
│ └── app.js # 主逻辑
├── scripts/ # 启动脚本
│ ├── start.sh # 服务管理脚本
│ ├── build_runtime.sh # runtime 一键编译脚本
│ └── install.sh # 安装脚本
├── onnxruntime/ # runtime 编译源码(项目内自维护)
├── config/ # 配置文件
│ └── settings.yaml # 应用配置
├── data/ # 数据存储
│ ├── models/ # ASR 模型文件
│ │ ├── iic/ # FunASR 模型
│ │ │ ├── speech_paraformer-*/
│ │ │ ├── speech_fsmn_vad_*/
│ │ │ └── punc_*/
│ │ └── ... # 其他模型
│ ├── users/ # 用户数据
│ └── meetings/ # 会议数据
├── logs/ # 日志文件
│ ├── asr.log
│ └── web.log
├── runtime/ # ASR 运行时
│ ├── build/bin/ # 已编译可执行文件
│ │ ├── funasr-wss-server
│ │ └── funasr-wss-server-2pass
│ ├── readme_zh.md # 编译说明
│ ├── CMakeLists.txt # 构建配置
│ ├── onnxruntime-linux-x64-1.14.0/
│ └── ffmpeg-master-latest-linux64-gpl-shared/
├── requirements.txt # Python 依赖
├── Dockerfile # 容器镜像构建
├── docker-compose.yml # 容器编排
└── README.md # 本文档
确保使用 --2pass 参数启动 ASR 服务:
./scripts/start.sh restart --2pass --gpu- 首次运行需要加载模型
- 1 小时音频约需 10-20 分钟
- 使用 GPU 可显著加速
- 每个会议关联
user_id字段 - 未登录用户无法创建会议
- 登录后仅显示当前用户的会议
- 数据存储在
data/users/和data/meetings/
# Web 服务日志
tail -f logs/web.log
# ASR 服务日志
tail -f logs/asr.logrm -rf data/*- 检查 LLM 服务是否运行
- 验证
settings.yaml配置正确 - 查看
llm_service.py日志
当前版本已移除说话人 ID 展示链路,默认不输出说话人分离结果。
欢迎贡献代码!请遵循以下步骤:
- Fork 本仓库
- 创建分支:
git checkout -b feature/xxx - 提交更改:
git commit -m 'Add feature xxx' - 推送分支:
git push origin feature/xxx - 创建 Pull Request
- Python 代码遵循 PEP 8
- 使用类型注解(Type Hints)
- 异步代码使用
async/await - 提交前运行
python -m py_compile检查语法
本项目基于 MIT 许可证开源。
EchoCore - 让会议记录更智能