01
核心业务 声纪是面向会议的录音、实时转写和 AI 纪要工作台,目前以受邀试用的 Web 服务上线。它把录音视为会议记录的原始资料:实时转写用于跟随发言,会议结束后还能回听、校对、整理行动项和生成纪要。产品支持浏览器实时采集与文件任务,线上会议的声音可以和麦克风一起录入;多场会议可以组成集合,按原句检索和提问。后端使用 Rust / Axum,会议数据、版本和任务记录保存到 SQLite。
可靠性的重点在录音长时间运行及失败之后。采集授权、音轨、录音分片、ASR 连接和总结请求会分别失败,页面需要准确呈现每个状态;本机备份、服务端归档和可撤销分享则决定用户能否恢复和安全交付会议资料。
01 会议资料音频、原始识别、校对文本、笔记、纪要版本和行动项分别保存并保持关联。
02 采集与转写麦克风、浏览器标签页、客户端与回环设备都可作为音源;进行中的会议可以把线上会议声音和麦克风混成一路,录音与 ASR 生命周期独立。
03 会议集合用户把多场会议组成集合,在集合内检索原文、语义检索和提问,回答附原句引用并可回听。
04 权限与分享私人空间按会议所有者授权,限时分享只提供指定内容,撤销后重新校验访问。 02
会议入口 一键进入记录页,麦克风采集、实时识别、结束后自动生成纪要。
实现 音源、语种、热词集、纪要模板和模型在快速会议设置里预先配置;录音按片备份,识别连接 30 分钟换票续接。
输出 逐句转写、说话人颜色、笔记与纪要并排,底部常驻状态栏显示录制、暂停与结束。
边界 两小时实体麦克风、锁屏、弱网与低磁盘尚未系统验收。 先开始会议,再在底部栏接入在线会议声音,远端发言与本人麦克风合成一路。
实现 浏览器标签页、客户端与回环设备三种入口;两路分别开关、至少保留一路,暂停时禁用的按钮说明原因。
输出 一场会议一条录音、一条转写时间线。
边界 采集测试使用合成信号与协议夹具,尚未在真实线上会议产品中验证混音识别质量。 上传已有录音,后台分段转写,可选快速模式或说话人分离模式。
实现 输入与任务原子保存,FFmpeg 分段,失败续跑、停止与继续;以本地解码时长为准过滤越界片段。
输出 与实时会议相同的会议记录,可继续校对、总结与检索。
边界 单文件上限 50 MiB、两小时;逐句时间轴依赖上游返回。 03
技术栈
前端 Vue 3 Element Plus Web Audio MediaRecorder IndexedDB
服务端 Rust Axum Tokio WebSocket
持久化 SQLite 音频分片 本机录音备份
模型与多端 Amphion ASR OpenAI 兼容总结接口 Android Demo Tauri 桌面工程 04
系统架构与部署 采集、存储与整理
浏览器保留本机音频备份;服务端独立持久化会议与转写任务。ASR 与总结分别接入,音频访问经过权限校验。 浏览器工作台 Vue 3 / Element Plus / Web Audio / IndexedDB 音源选择与混音采集、分片备份、转写跟随、校对和恢复草稿。
Rust 服务 Axum / Tokio / systemd / HTTPS 反代 统一会议权限、ASR 接入、文件任务和总结;运行目录与私有数据分离。
数据与文件处理 SQLite WAL / 增量 BLOB / FFmpeg 录音按片写入和按 Range 读取,文件解码分段,备份使用数据库一致性快照。
多端入口 Web / Android AudioRecord / Tauri 工程 Web 提供试用工作流;Android 麦克风前台服务与桌面壳分别适配采集和恢复。
05
检索问答:原句、语义与问会议 会议多了以后,用户要找的往往是“谁在哪场会上说过什么”。检索分三层:按原句查、按意思查、直接提问,回答都要能回到原句和录音。
512 维 本地向量 中文 embedding 在服务端 CPU 运行,向量单独存放,不依赖外部向量服务。
FTS5 + 向量 混合检索 原句、笔记、纪要分开建索引,关键词与语义结果合并排序。
8 问 公网人工核对 问会议的回答附原句引用,点击可定位原句并回听片段。
100 场 单次检索范围 按集合、文件夹、日期、状态与标签限定范围。
当前使用中文模型,英文与多语种只做了小样本;外部重排模型的质量不作承诺。
06
加载性能:工作台与会议列表 固定接口延迟的受控测试,指标为页面首批数据呈现耗时,对比工作区性能优化前后的两版前端。
优化前 优化后 单位:毫秒 这组数据用于比较前后两版前端,不代表公网性能承诺;跨会议行动项的后端仍会读取完整会议记录,存在规模风险。
07
核心业务链路 暂停后真正停止设备采集 1 停止音轨2 暂停录音与转写3 重新申请设备4 恢复会话暂停释放浏览器麦克风输入,继续时重新取得原设备。权限拒绝或恢复失败时维持暂停状态,不以计时器继续运行伪装录音成功。系统共享无音轨时拒绝开始,不静默切回麦克风。
长文件任务与页面生命周期分离 1 输入 + 任务落库2 FFmpeg 分段3 ASR4 分段保存5 纪要上传的文件和任务原子保存,后台逐段处理;页面关闭不会丢掉已经接收的任务,失败重试保留已确认结果。会议回听只使用可靠的时间偏移,缺少逐句时间的片段不伪装成精确字幕定位。
08
关键机制与取舍 01 双侧分片存储与录音抢救
约束 长会议可能遇到页面关闭、弱网和服务重启,整段音频只放在浏览器内存或只在结束时上传都会扩大数据丢失范围。
做法 浏览器按片备份与上传,服务端归档逐片校验并写入增量 BLOB。未归档分片存在时拒绝直接结束会议;异常后根据本机副本和服务端残片继续保存,仍在写入的音频不强制归档。
效果 录音保存失败和转写失败可以分别恢复;大音频播放使用 Range 按需读取,避免先下载整场会议。 02 文本修改使用版本基线保护
约束 会议校对可能与其他页面更新并发,重新生成纪要也可能使用已经变化的转写。覆盖最新数据会破坏可回溯性。
做法 文字校对保留首次识别和本机草稿,保存校验会议版本;冲突时保留草稿。纪要生成时对输入版本做关联,转写或笔记变化后标记需要更新,并保留历史纪要版本用于恢复。
效果 原始识别、人工修订与生成内容可以区分,用户能判断当前纪要是否对应最新会议。 03 音频分享的权限贯穿每次读取
约束 一次打开分享页面后,如果播放器仍持有长期公开文件地址,撤销分享无法阻止后续音频请求。
做法 音频通过短期授权流读取,每次请求检查分享权限和保存期限。页面周期复查分享状态,撤销、过期或网络异常后清除内容和播放源;恢复会议不恢复已经撤销的旧链接。
效果 分享权限与实际数据读取保持一致;已经被接收者下载的内容仍属于独立副本。 04 线上会议:远端声音和本人发言混成一路
约束 线上开会时只录麦克风会漏掉远端发言,只录会议标签页又录不到本人;两路分别转写会让同一场会议出现两份时间线。
做法 新建在线会议默认采集浏览器标签页声音,也支持客户端与回环设备入口;会议进行中可以再接入线上会议声音,与麦克风在浏览器端混成同一路,两路分别开关、至少保留一路。
效果 一场会议仍是一条录音和一条转写;采集测试 50/50 通过。验证使用合成信号与协议夹具,尚未接入真实线上会议产品复核识别质量。 05 会议集合:回答必须能回到原句
约束 跨会议提问容易得到无出处的概括,用户无法判断答案来自哪场会议、是否被改写。
做法 集合内同时提供原文检索和向量语义检索;问答只基于检索到的原句生成,回答附原句引用,点击可回到对应会议并回听。每个用户最多 100 个集合、每个集合最多 100 场会议。
效果 回答可以逐句核对;目前只用小样本验证,不作为召回质量或成本结论,集合也不支持协作共享。 09
发布与运维 每次发布使用原子替换并保留可回退目录,前端资源逐字节校验,后端不随前端重启,进行中的录音不受影响。服务端每天备份并校验,另一台机器定时拉取异地副本。
1 构建 版本号随发布递增2 原子发布 保留上一版回退目录3 逐字节校验 15 项静态资源4 接口回查 未登录请求仍被拒绝5 每日备份 备份后自动校验6 定时巡检 每 5 分钟检查服务与磁盘10.6 秒 真实断连补转写 识别连接中断后自动重连,并把中断期间的录音补转写。
31 分钟 换票续接实测 识别凭据 30 分钟到期前续接,真实会议跨过到期点不断流。
146 项 工作流接口检查 会议集合与检索问答发布时的接口全流程检查。
尚未验收的部分 长会极限场景 两小时实体麦克风、弱网、锁屏、低磁盘与设备断开。真实线上会议 尚未在真实线上会议产品中验证混音转写。原生端 Android、iOS、鸿蒙只在模拟器或编译层验证,没有正式签名。运维告警 巡检告警只写日志,外部通知与独立云灾备未接入。10
AI 协作开发 版本迭代由 Agent 编写代码与测试,并按日期写下约 40 份验收文档;迭代路线图也从历次会话记录中整理而来。
Agent 负责采集链路与验收文档 完成 50 项采集测试、20 项生命周期测试和 2 项真实 Chrome 采集测试,每轮改动对应一份带日期的验收记录。
验证口径模拟环境不算标签页验收 Playwright 默认静音会让标签页采集为空,通用权限参数返回的是默认音源;最终用真实 Chrome 播放 440 Hz 正弦波,核对采集音频与原始波形相关。
边界未验收的部分写清楚 物理麦克风两小时会议、真实线上会议通话、手机端真机签名和外部告警,在页面中单独列为尚未验收。
采集与转写的结论都标明环境:真实浏览器、受控样例还是模拟参数。
12
阶段成果 Web 试用服务覆盖采集、转写、校对、纪要、回听、导出、会议集合问答与受控分享。 将音源权限、录音恢复、任务持久化和内容版本纳入产品体验,既处理成功路径,也处理用户实际会遇到的中断。