本地优先的语音转写与协作平台:IntraScribe 完整指南
“
“开会两小时,整理纪要一整天?”
如果你在企业、学校或政府机关的内网里工作,又对数据隐私格外敏感,这句话可能戳中了痛点。
IntraScribe 的出现,正是为了让这句话成为历史。
一、它到底是什么?
一句话版本:
IntraScribe 是一款能在内网离线运行的语音转写与多人协作平台,数据全程留在本地,支持实时转写、说话人分离、AI 总结和可编辑的会议记录。
把这句话拆开,就是它的核心价值:
关键词 | 具体含义 | 你得到的好处 |
---|---|---|
本地优先 | 不依赖公网、可断网部署 | 隐私合规、无流量费用 |
多人协作 | 账号体系、模板共享、可指派编辑流程 | 团队知识沉淀不再靠个人 |
实时转写 | 边说边出文字 | 会议结束即可带走纪要 |
说话人分离 | 自动区分张三/李四/王五 | 再也不用“男声 1、女声 2” |
AI 总结 | 一键生成结构化 Markdown | 30 秒读完 2 小时会议 |
可编辑 | 双击即可改文字、改说话人名字 | 错误随时修正,无需重录 |
二、适用场景:谁最需要它?
-
企业会议室
内网隔离、资料涉密,外部 SaaS 无法接入。 -
学校课堂 / 研讨会
老师、学生、嘉宾发言混杂,需要自动标注“谁说了什么”。 -
指挥中心 / 生产调度室
延迟敏感,公网转写服务动辄 1–2 秒延迟,现场无法容忍。 -
法务、医疗、研发
一纸保密协议把云端服务拦在门外,数据必须留在本地硬盘。
三、5 分钟看懂整体流程
用一张图先建立直觉:

(点击上图可观看 B 站 3 分钟演示)
再配文字版步骤:
阶段 | 你做什么 | 系统做什么 |
---|---|---|
1. 创建会话 | 点“开始录音” | 生成唯一 session_id |
2. 实时转写 | 对着麦克风说话 | 浏览器 WebRTC 推流,SSE 实时回文字 |
3. 结束录音 | 点“停止录音” | 缓存音频→Supabase Storage→GPU 批量转写+说话人分离 |
4. 生成总结 | 点“AI 总结” | LiteLLM 根据模板输出 Markdown |
5. 后期编辑 | 双击文字或说话人标签 | Postgres 实时更新,所有人界面同步 |
四、技术栈:它肚子里装了什么?
层级 | 选型 | 作用 |
---|---|---|
前端 | Next.js + TypeScript + Tailwind | 浏览器里的“门面” |
后端 | FastAPI(Python) | 提供 REST / SSE / WebRTC 端点 |
实时音频 | WebRTC(浏览器推流)+ SSE(回传文字) | 延迟 < 500 ms |
语音识别 | FunASR 本地模型(GPU 可选) | 中英文混合也听得懂 |
说话人分离 | pyannote.audio | 把不同嗓音切成片段 |
AI 总结 | LiteLLM(可接 ollama/qwen3:8b 等) | 可配置模型、可回退 |
数据底座 | Supabase(Postgres + Auth + Storage + Realtime) | 账号、权限、文件、实时订阅一条龙 |
多媒体工具 | FFmpeg | 音频转码、切片、信息读取 |
五、手把手本地部署
“
以下命令在 Ubuntu 22.04 验证通过,macOS/Windows 请把 apt 换成对应包管理器。
1. 前置条件
-
Node.js ≥ 18 -
Python ≥ 3.10(推荐用 uv 管理) -
FFmpeg -
ollama qwen3:8b(可选,AI 总结用;不用就改 backend/config.yaml
)
# 装 FFmpeg
sudo apt update && sudo apt install ffmpeg
# 装 supabase CLI(官方脚本)
curl -fsSL https://raw.githubusercontent.com/supabase/cli/main/install.sh | bash
2. 一键启动数据库
git clone <仓库地址> intrascribe
cd intrascribe/supabase
# 完整启动
supabase start
# 若 502 错误,可跳过 edge-runtime
# supabase start -x edge-runtime
看到如下信息即成功:
API URL: http://127.0.0.1:54321
Studio URL: http://127.0.0.1:54323
初始化数据库结构:
supabase db reset
3. 配置环境变量
-
前端 web/.env.local
NEXT_PUBLIC_SUPABASE_URL=http://127.0.0.1:54321
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbG...<上面打印的值>
BACKEND_URL=http://localhost:8000
-
后端 backend/.env
SUPABASE_URL=http://127.0.0.1:54321
SUPABASE_ANON_KEY=eyJhbG...
SUPABASE_SERVICE_ROLE_KEY=eyJhbG...
HUGGINGFACE_TOKEN=hf_... # pyannote 下载模型用
PYANNOTE_MODEL=pyannote/speaker-diarization-3.1
4. 启动后端
cd backend
uv sync # 安装依赖
uv run main_v1.py # 默认端口 8000
5. 启动前端
cd web
npm install
npm run dev # 默认端口 3000
浏览器打开 http://localhost:3000,注册账号即可使用。
六、功能深潜:你可能关心的 10 个问题
1. 实时转写为什么没出文字?
-
浏览器是否授权麦克风? -
后端地址能否访问? -
控制台查看 EventSource
是否连接成功。
2. 说话人分离失败怎么办?
-
检查 .env
里的HUGGINGFACE_TOKEN
是否有效。 -
模型首次下载需要联网,之后可离线运行。 -
无 GPU 时速度会慢,但结果一致。
3. 音频转码报错了?
-
确认 FFmpeg 已安装并在 PATH
。 -
查看后端日志,常见原因是采样率不统一,系统会自动重采样。
4. 想换语音识别模型?
-
修改 backend/stt_adapter.py
继承BaseASR
,实现自己的适配器即可。 -
在 config.yaml
指向新类名,重启生效。
5. 需要接入专业麦克风阵列?
-
只要你的设备能把音频送到浏览器或后端,传输协议可随意替换。 -
后端 main_v1.py
里 WebRTC 部分可完全替换成 WebSocket、RTMP、gRPC。
6. AI 总结太长/太短?
-
在模板管理里新建 Markdown 模板,插入占位符 {{transcript}}
、{{title}}
即可。 -
支持多条回退策略:先调用 qwen3:8b,失败再试 gpt-3.5-turbo。
7. 如何批量处理历史录音?
-
调用 POST /batch-transcription
,上传单个音频文件,系统将自动完成说话人分离、重转写、生成总结。 -
支持 mp3、wav、flac、m4a。
8. 数据会丢吗?
-
Postgres 主库存所有转写、元数据。 -
原始音频存 Supabase Storage(本地 S3 兼容)。 -
建议定期做 pg_dump 和对象存储快照。
9. 账号如何同步到 LDAP / AD?
-
Supabase Auth 支持自定义 OAuth、SAML 2.0。 -
在 supabase/auth.external
配置即可接入企业目录。
10. 想二次开发?
-
目录结构清晰, backend/app/api.py
暴露所有 REST 端点。 -
前端用 Next.js App Router,API 路由在 web/app/api/*
,只做反向代理,不改也可直接用。
七、如何把它变成你的“会议助手”?路线图公开
阶段 | 计划功能 | 当前状态 |
---|---|---|
✅ 已交付 | 实时转写、说话人分离、AI 总结 | 可用 |
🚧 开发中 | 硬件接入(树莓派、麦克风阵列) | 分支已可见 |
🔮 规划中 | AI 对话:直接问“张三在会上的结论?” | 需求收集中 |
欢迎通过 Issue/PR 一起迭代。
八、FAQ:一分钟速查
问题 | 一句话答案 |
---|---|
需要联网吗? | 首次下载模型要联网,之后可纯内网。 |
GPU 必须吗? | 不必须,CPU 也能跑,只是慢一点。 |
支持多人同时录音吗? | 支持,每个浏览器就是一个采集端。 |
有移动端 App 吗? | 直接用浏览器即可,PWA 已支持。 |
商业授权? | MIT 许可证,可闭源二次开发。 |
九、结语:把会议时间还给思考
IntraScribe 并不炫技,它只是把“语音→文字→知识”这条长链搬到了你的本地服务器里,然后加上一点点 AI 魔法。
从此,会议结束的那一刻,纪要、总结、待办都已躺在你的知识库里,等待下一次灵感的连接。
如果你准备动手,回到“五、手把手本地部署”即可;
如果你还在观望,打开演示视频,3 分钟就能感受到“本地优先”带来的踏实感。