lgy1027/matrix-live-diarizer

Local-first meeting transcription — audio & transcripts never leave your machine. Live captions + upload diarization + voice matching.

132

stars

294

commits

Python

primary language

Aug 3, 2026

updated

asr
docker
fastapi
funasr
llm
local-first
meeting-transcription
modelscope
ollama
openai-compatible
privacy
pytorch
qwen
realtime-transcription
speaker-diarization
speaker-identification
speech-to-text
vite
vue
websocket
Browse cluster: Whisper-based speech recognition

README

Matrix Live Diarizer

本机优先的会议录音转写工具 · 默认数据不外传 · 上传多人分离 + 实时字幕 + 声纹匹配

License: MIT Python Node Release

English · 使用说明 · LLM 配置 · 隐私 · 安全 · API · 模型

这是面向单台受信任机器的本地单机工具,适合本地试用和迭代;当前不面向公网部署、多租户、合规存档或自动身份判定。

它解决什么

把"一段会议录音"变成"带说话人归属、可校正、可导出"的结构化纪要,音频和转写永远不出本机。飞书/讯飞/在线 ASR 都要把音频传上云——本项目不上传音频。LLM 纪要可选本机 Ollama,公网 LLM 只在你显式允许时发送转写文本(永不发音频、永不发声纹)。

两条路径合一,覆盖会议从现场到会后的全程:

  • 📤 上传录音(会后高质量处理):解码 → ASR → 可选 pyannote 多人分离 → 声纹匹配已登记人物 → 入库 → 校正/纪要/导出。
  • 实时字幕(会议进行中):浏览器录音 → VAD 切段 → ASR → 声纹识别已登记人物 → 边说边出,落段入库。

核心能力

  • 🖥️ 本地优先:默认全本机推理,下载模型后可在无网环境运行(LLM 关闭时)。
  • 👥 多人说话人分离:上传会议模式用 pyannote community-1 切出匿名说话人 turn。
  • 🧬 声纹匹配:把匿名 Spk_01 按严格阈值匹配到已登记人物,可随时人工纠正,不是身份认证。声样支持上传文件或浏览器在线录音注册。
  • 📝 可校正纪要:双击改文稿、批量重指说话人、合并/拆分说话人、生成/编辑摘要(LLM 或本地 TextRank 兜底)。
  • 📤 多格式导出:Markdown / SRT / VTT / JSON。
  • 🔧 可切换引擎:ASR(Qwen3-ASR / SenseVoice / Paraformer)、声纹(CamPlus / ERes2Net / Wespeaker)运行时可切。

产品边界

  • 上传录音做会后高质量处理(多人分离 / 纪要 / 导出);实时模式做会议进行中的近实时字幕。
  • "说话人分离"只产生匿名标签;声纹匹配可按严格规则自动显示已登记人物,但不构成身份认证,且可随时纠正。
  • 未配置 pyannote 时,会议仍可完成转写,但保持匿名并明确提示分离不可用。
  • 默认数据保存在本机且不启用 LLM。首次启动下载模型时会联网。
  • macOS MPS 偶发死锁,加载超时(默认 90s)会自动回退 CPU;服务为单进程(WORKERS=1),请勿调高。
  • 不建议直接暴露到公网,也不承诺满足医疗、法律等受监管行业要求。

关于项目名:实时与上传是同一会议的两个入口,均为一等功能。多人说话人分离(diarization)在上传模式完成;实时模式靠声纹识别已登记说话人,不做多人分离。

界面预览

会议工作区

会议工作区 · 转写、校正、说话人归属、纪要与导出,全程本地

实时字幕会议库
实时字幕会议库
人员声样(含在线录音)引擎与设置
人员声样设置

核心流程

上传录音(会后)

  1. 上传录音并选择"快速转写"或"会议模式"。
  2. 后台任务完成解码、转写和可选的说话人分离。
  3. 在会议详情中检查自动匹配、确认中置信度建议,并校正文稿。
  4. 生成或编辑纪要,随后导出所需格式。

实时字幕(会中)

  1. 浏览器授权麦克风并开始录音。
  2. VAD 自动切段、ASR 实时转写、声纹识别已登记说话人,边说边出。
  3. 结束录音后落段入库,与上传会议进入同一套校正/纪要/导出流程。

快速开始

要求 Python 3.10–3.12、Node.js 20+ 和 FFmpeg。CI 在 Ubuntu 验证 Python 3.10–3.12,并在 macOS、Windows 验证 Python 3.12。首次启动会下载约 1.8GB 模型,视网速可能需要数十分钟;下载完成后 LLM 关闭时可永久断网运行。

git clone https://github.com/lgy1027/matrix-live-diarizer.git
cd matrix-live-diarizer
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt
cd web && npm ci && npm run build && cd ..
python main.py

浏览器打开 http://127.0.0.1:8000。默认只监听本机回环地址。默认账户 admin/admin,首次登录强制改密。

项目接口仍在迭代,请勿将其作为会议资料的唯一副本或长期归档系统。

Docker CPU 版:

docker compose up --build

CUDA 用户建议使用本地 Python 环境并按 PyTorch 官方说明安装对应版本(Docker 镜像仅含 CPU)。多架构镜像需发布者自行 docker buildx build --platform linux/amd64,linux/arm64 并验证目标架构,项目不提供预构建镜像承诺。

可选配置

复制 .env.example.env。多数本机单机场景无需修改,常用项如下:

HOST=127.0.0.1
ASR_DEVICE=auto
ASR_ENGINE=qwen3
SPEAKER_ENGINE=campplus
HF_TOKEN=
LLM_ENABLED=false

ASR_ENGINE 可选 qwen3 / sensevoice / paraformer / paraformer_streamingSPEAKER_ENGINE 可选 campplus / eres2net / wespeaker。其余项见 .env.example。启用 LLM(摘要/行动项/纪要)见 LLM 配置指南

何时需要 HF_TOKEN(其余情况留空即可):

  • ✅ 要用上传会议的多人说话人分离(pyannote community-1,gated 模型)→ 需填,且需在 HF 页面接受条款。
  • ✅ 要启用字级时间戳(Qwen3-ForcedAligner)→ 建议填以避开 HF 限流。
  • ❌ 只用实时字幕 / 快速转写 / 本机声纹匹配 → 不需要

只有明确部署到局域网时才使用 HOST=0.0.0.0DEPLOYMENT_MODE=lan,并同时设置强随机 JWT_SECRET、可信 ALLOWED_ORIGINS。跨机器访问还需要 HTTPS(见下文「跨机器访问」)。

跨机器访问(可选)

默认 HOST=127.0.0.1 只监听本机——本机用 http://127.0.0.1:8000 即可,麦克风和上传都正常。

要从别的机器访问(上传录音、在线录音都要麦克风),浏览器要求 HTTPS:http://IP 非 localhost 下 getUserMedia 会被禁用。项目支持让服务直接跑 HTTPS 自签证书。请先确保系统已安装 OpenSSL,随后使用项目的跨平台 Python 脚本生成包含本机 IPv4 地址的证书。

macOS / Linux:

python3 scripts/gen_self_cert.py
ENABLE_HTTPS=1 HOST=0.0.0.0 \
DEPLOYMENT_MODE=lan ALLOWED_ORIGINS=https://<本机IP>:8000 \
python main.py

Windows PowerShell:

python .\scripts\gen_self_cert.py
$env:ENABLE_HTTPS = "1"
$env:HOST = "0.0.0.0"
$env:DEPLOYMENT_MODE = "lan"
$env:ALLOWED_ORIGINS = "https://<本机IP>:8000"
python main.py

macOS / Linux 也可以继续使用兼容入口 bash scripts/gen_self_cert.sh

浏览器访问 https://<本机IP>:8000,首次提示"不安全"点"高级 → 继续前往"即可。

数据和网络

  • 会议音频:data/media/(上传录音原文件,按会议 id 命名)
  • 人物声样音频:data/media/voices/<person_id>/
  • 转写、人物、声纹向量、设置和 LLM API Key:data/matrix.db
  • 模型缓存:默认在项目根 models/(可由 MODELS_DIR 配置)
  • 可选公网 LLM:仅在用户显式允许时发送转写文本

这些数据默认不加密,请使用操作系统磁盘加密并保护本机账户。删除会议或人物会删除应用管理的对应音频文件;删除整个 data/ 前应先停止服务。

开发验证

python -m pytest tests/ -q --ignore=tests/test_smoke_boot.py
cd web
npm run check:i18n
npm run typecheck
npm run build
npm audit --omit=dev --audit-level=high

真实模型冒烟测试会下载并加载大模型,因此常规 CI 默认不运行:MATRIX_TEST_REAL_DEPENDENCIES=1 pytest tests/test_smoke_boot.py -v。PowerShell 请先执行 $env:MATRIX_TEST_REAL_DEPENDENCIES="1"

贡献

欢迎通过 Pull Request 贡献代码,流程与约定见 CONTRIBUTING.md

问题反馈

  • 缺陷或功能建议请提 GitHub Issue
  • 安全漏洞请按 SECURITY.md 的指引私下报告,不要在 Issue 中附带录音、转写或凭据。

许可证

项目代码采用 MIT License。模型权重和部分数据集拥有各自的许可证与使用条款,不随 MIT 自动授权;部署前请阅读 模型说明 并核对上游条款。

Contributors

lgy1027

277 commits

claude

17 commits

lgy1027/matrix-live-diarizer

Local-first meeting transcription — audio & transcripts never leave your machine. Live captions + upload diarization + voice matching.

132

stars

294

commits

Python

primary language

Aug 3, 2026

updated

asr
docker
fastapi
funasr
llm
local-first
meeting-transcription
modelscope
ollama
openai-compatible
privacy
pytorch
qwen
realtime-transcription
speaker-diarization
speaker-identification
speech-to-text
vite
vue
websocket
Browse cluster: Whisper-based speech recognition

README

Matrix Live Diarizer

本机优先的会议录音转写工具 · 默认数据不外传 · 上传多人分离 + 实时字幕 + 声纹匹配

License: MIT Python Node Release

English · 使用说明 · LLM 配置 · 隐私 · 安全 · API · 模型

这是面向单台受信任机器的本地单机工具,适合本地试用和迭代;当前不面向公网部署、多租户、合规存档或自动身份判定。

它解决什么

把"一段会议录音"变成"带说话人归属、可校正、可导出"的结构化纪要,音频和转写永远不出本机。飞书/讯飞/在线 ASR 都要把音频传上云——本项目不上传音频。LLM 纪要可选本机 Ollama,公网 LLM 只在你显式允许时发送转写文本(永不发音频、永不发声纹)。

两条路径合一,覆盖会议从现场到会后的全程:

  • 📤 上传录音(会后高质量处理):解码 → ASR → 可选 pyannote 多人分离 → 声纹匹配已登记人物 → 入库 → 校正/纪要/导出。
  • 实时字幕(会议进行中):浏览器录音 → VAD 切段 → ASR → 声纹识别已登记人物 → 边说边出,落段入库。

核心能力

  • 🖥️ 本地优先:默认全本机推理,下载模型后可在无网环境运行(LLM 关闭时)。
  • 👥 多人说话人分离:上传会议模式用 pyannote community-1 切出匿名说话人 turn。
  • 🧬 声纹匹配:把匿名 Spk_01 按严格阈值匹配到已登记人物,可随时人工纠正,不是身份认证。声样支持上传文件或浏览器在线录音注册。
  • 📝 可校正纪要:双击改文稿、批量重指说话人、合并/拆分说话人、生成/编辑摘要(LLM 或本地 TextRank 兜底)。
  • 📤 多格式导出:Markdown / SRT / VTT / JSON。
  • 🔧 可切换引擎:ASR(Qwen3-ASR / SenseVoice / Paraformer)、声纹(CamPlus / ERes2Net / Wespeaker)运行时可切。

产品边界

  • 上传录音做会后高质量处理(多人分离 / 纪要 / 导出);实时模式做会议进行中的近实时字幕。
  • "说话人分离"只产生匿名标签;声纹匹配可按严格规则自动显示已登记人物,但不构成身份认证,且可随时纠正。
  • 未配置 pyannote 时,会议仍可完成转写,但保持匿名并明确提示分离不可用。
  • 默认数据保存在本机且不启用 LLM。首次启动下载模型时会联网。
  • macOS MPS 偶发死锁,加载超时(默认 90s)会自动回退 CPU;服务为单进程(WORKERS=1),请勿调高。
  • 不建议直接暴露到公网,也不承诺满足医疗、法律等受监管行业要求。

关于项目名:实时与上传是同一会议的两个入口,均为一等功能。多人说话人分离(diarization)在上传模式完成;实时模式靠声纹识别已登记说话人,不做多人分离。

界面预览

会议工作区

会议工作区 · 转写、校正、说话人归属、纪要与导出,全程本地

实时字幕会议库
实时字幕会议库
人员声样(含在线录音)引擎与设置
人员声样设置

核心流程

上传录音(会后)

  1. 上传录音并选择"快速转写"或"会议模式"。
  2. 后台任务完成解码、转写和可选的说话人分离。
  3. 在会议详情中检查自动匹配、确认中置信度建议,并校正文稿。
  4. 生成或编辑纪要,随后导出所需格式。

实时字幕(会中)

  1. 浏览器授权麦克风并开始录音。
  2. VAD 自动切段、ASR 实时转写、声纹识别已登记说话人,边说边出。
  3. 结束录音后落段入库,与上传会议进入同一套校正/纪要/导出流程。

快速开始

要求 Python 3.10–3.12、Node.js 20+ 和 FFmpeg。CI 在 Ubuntu 验证 Python 3.10–3.12,并在 macOS、Windows 验证 Python 3.12。首次启动会下载约 1.8GB 模型,视网速可能需要数十分钟;下载完成后 LLM 关闭时可永久断网运行。

git clone https://github.com/lgy1027/matrix-live-diarizer.git
cd matrix-live-diarizer
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
pip install -r requirements.txt
cd web && npm ci && npm run build && cd ..
python main.py

浏览器打开 http://127.0.0.1:8000。默认只监听本机回环地址。默认账户 admin/admin,首次登录强制改密。

项目接口仍在迭代,请勿将其作为会议资料的唯一副本或长期归档系统。

Docker CPU 版:

docker compose up --build

CUDA 用户建议使用本地 Python 环境并按 PyTorch 官方说明安装对应版本(Docker 镜像仅含 CPU)。多架构镜像需发布者自行 docker buildx build --platform linux/amd64,linux/arm64 并验证目标架构,项目不提供预构建镜像承诺。

可选配置

复制 .env.example.env。多数本机单机场景无需修改,常用项如下:

HOST=127.0.0.1
ASR_DEVICE=auto
ASR_ENGINE=qwen3
SPEAKER_ENGINE=campplus
HF_TOKEN=
LLM_ENABLED=false

ASR_ENGINE 可选 qwen3 / sensevoice / paraformer / paraformer_streamingSPEAKER_ENGINE 可选 campplus / eres2net / wespeaker。其余项见 .env.example。启用 LLM(摘要/行动项/纪要)见 LLM 配置指南

何时需要 HF_TOKEN(其余情况留空即可):

  • ✅ 要用上传会议的多人说话人分离(pyannote community-1,gated 模型)→ 需填,且需在 HF 页面接受条款。
  • ✅ 要启用字级时间戳(Qwen3-ForcedAligner)→ 建议填以避开 HF 限流。
  • ❌ 只用实时字幕 / 快速转写 / 本机声纹匹配 → 不需要

只有明确部署到局域网时才使用 HOST=0.0.0.0DEPLOYMENT_MODE=lan,并同时设置强随机 JWT_SECRET、可信 ALLOWED_ORIGINS。跨机器访问还需要 HTTPS(见下文「跨机器访问」)。

跨机器访问(可选)

默认 HOST=127.0.0.1 只监听本机——本机用 http://127.0.0.1:8000 即可,麦克风和上传都正常。

要从别的机器访问(上传录音、在线录音都要麦克风),浏览器要求 HTTPS:http://IP 非 localhost 下 getUserMedia 会被禁用。项目支持让服务直接跑 HTTPS 自签证书。请先确保系统已安装 OpenSSL,随后使用项目的跨平台 Python 脚本生成包含本机 IPv4 地址的证书。

macOS / Linux:

python3 scripts/gen_self_cert.py
ENABLE_HTTPS=1 HOST=0.0.0.0 \
DEPLOYMENT_MODE=lan ALLOWED_ORIGINS=https://<本机IP>:8000 \
python main.py

Windows PowerShell:

python .\scripts\gen_self_cert.py
$env:ENABLE_HTTPS = "1"
$env:HOST = "0.0.0.0"
$env:DEPLOYMENT_MODE = "lan"
$env:ALLOWED_ORIGINS = "https://<本机IP>:8000"
python main.py

macOS / Linux 也可以继续使用兼容入口 bash scripts/gen_self_cert.sh

浏览器访问 https://<本机IP>:8000,首次提示"不安全"点"高级 → 继续前往"即可。

数据和网络

  • 会议音频:data/media/(上传录音原文件,按会议 id 命名)
  • 人物声样音频:data/media/voices/<person_id>/
  • 转写、人物、声纹向量、设置和 LLM API Key:data/matrix.db
  • 模型缓存:默认在项目根 models/(可由 MODELS_DIR 配置)
  • 可选公网 LLM:仅在用户显式允许时发送转写文本

这些数据默认不加密,请使用操作系统磁盘加密并保护本机账户。删除会议或人物会删除应用管理的对应音频文件;删除整个 data/ 前应先停止服务。

开发验证

python -m pytest tests/ -q --ignore=tests/test_smoke_boot.py
cd web
npm run check:i18n
npm run typecheck
npm run build
npm audit --omit=dev --audit-level=high

真实模型冒烟测试会下载并加载大模型,因此常规 CI 默认不运行:MATRIX_TEST_REAL_DEPENDENCIES=1 pytest tests/test_smoke_boot.py -v。PowerShell 请先执行 $env:MATRIX_TEST_REAL_DEPENDENCIES="1"

贡献

欢迎通过 Pull Request 贡献代码,流程与约定见 CONTRIBUTING.md

问题反馈

  • 缺陷或功能建议请提 GitHub Issue
  • 安全漏洞请按 SECURITY.md 的指引私下报告,不要在 Issue 中附带录音、转写或凭据。

许可证

项目代码采用 MIT License。模型权重和部分数据集拥有各自的许可证与使用条款,不随 MIT 自动授权;部署前请阅读 模型说明 并核对上游条款。

Contributors

lgy1027

277 commits

claude

17 commits

Languages

Python

76.1%

Vue

12.6%

TypeScript

9.8%