项目

SuperNono:可以语音唤醒的会议 AI 助手

在会议中持续转写与整理讨论,通过语音唤醒参与问答,结束后保存本地会议记录并导出 Markdown 纪要。

更新于

目录

在会议里临时问 AI 一个问题,往往需要有人停下讨论,打开聊天窗口,把刚才的背景重新打一遍,再把回答念给其他人听。这个动作打断的不只是操作流程,还有会议本身的节奏。SuperNono 的出发点很直接:如果 AI 已经在听,能不能需要它的时候直接喊一声?

SuperNono 是一个面向线下会议的桌面助手。开始会议后,它持续转写讨论,按时间整理主题摘要;听到唤醒词后进入语音问答,使用已有会议上下文回答;问答结束再回到记录状态。结束会议时,内容被整理成 Markdown 纪要,也保留在本机的历史记录中。

SuperNono v0.9.2 的测试会议界面,左侧为本地会议历史,中央显示正在采集的问题,底部为唤醒后的声音状态
作者保留的 v0.9.2 测试会议截图。界面处于唤醒后的问题采集阶段,并非回答效果或响应速度的测量。

大多数时候安静,需要时才加入

它的界面围绕一场正在发生的会议组织。左侧保留历史会议,主区域呈现当前讨论的摘要与 AI 问答,声音状态让人知道它在记录、等待提问还是发言。进入过去的会议则以回顾为主,不要求用户重新启动一次对话才能找回记录。

持续转写和 AI 发言是不同的模式。日常讨论时,语音识别提供增量文本,系统保留原始转写,并周期性整理主题摘要。摘要不是机械地每隔几分钟新建一个同样大小的块:整理逻辑会结合前一张摘要判断当前话题是延续还是切换。这样,长会议可以保留主题结构,而不必一直盯着逐字稿。

当用户说出“嘿 Nono”一类唤醒词,系统把声音交给实时语音问答。这里不是把一个按钮换成语音命令:用户仍在原来的会议里,提问可以依赖刚刚讨论过的内容。提供给问答的上下文包含已有摘要和近期原始发言,前者保留较早讨论的轮廓,后者补充当前话题的细节。

唤醒后也不只允许一问一答。当前实现保留同一次语音会话以支持追问,一轮回答播完后留下短暂等待窗口;用户继续说话就继续对话,沉默、明确的退出语或取消操作则把控制权交还给会议记录。等待窗口与会话上限都是可调整的交互参数,不是对人类停顿习惯的普遍判断。

两条语音路径,共用一支麦克风

SuperNono 使用 Tauri,将桌面界面与本机能力连接起来。界面侧负责麦克风采集、产品状态和展示,Rust 侧处理需要特定请求头与二进制协议的语音 WebSocket、系统凭据存储及其他桌面能力。

音频采集后交给路由器,由它决定当前送往持续识别还是实时问答。持续识别侧负责会议转写;实时问答侧使用端到端语音服务,接收问题、生成回答并返回声音。摘要和最终纪要则走独立的文本模型接口。这三个用途没有被强行塞进同一个模型请求:会议记录需要连续,问答需要对话节奏,纪要需要整理较长的材料。

这里一个容易忽略的问题是扬声器回声。如果 AI 正在说话,自己的声音又被麦克风当成用户问题送回去,就可能产生错误打断或重复对话。接管逻辑因此包含丢弃音频的状态,并等待已经排队的回答声音播放完毕后再恢复输入。服务端说“这一轮结束”,也不等于本机扬声器已经播完;这两个时刻需要分开处理。

从问答回到记录时,系统还会把这段问答文本接回会议转写中。否则,AI 参与过的一段讨论会成为纪要里的空洞:前后的人类讨论有记录,中间的问题与回答却不见了。问答本身也单独保存,便于回顾。

摘要和纪要,不应依赖一条永不失败的网络连接

会议不会因为语音连接中断而自动暂停。应用需要区分正在连接、重连、暂停和结束,让使用者知道当前是否还在记录;网络错误可以重试,凭据错误则应明确提示处理,而不是无限等待。

结束会议时,应用停止采集和摘要调度,再请求生成纪要,组织讨论要点、决定与待办事项。模型整理失败时,已有摘要仍然能够作为保底内容保存。这个取舍是让已获得的记录留下来,而不是为了等待一份完整纪要,把整场会议的成果悬在一个最后的请求上。

本地存储也按信息性质拆开:会议元数据记录身份与时间,转写逐条追加,摘要保存当前结构,AI 问答单独记录,最后形成可阅读的 Markdown 纪要。它们共同构成一次会议,而不仅是一段聊天窗口里的文字。导出是把已有结果交给用户,不是保存结果的唯一机会。

本地保存,与云端推理的边界

SuperNono 不要求为会议历史另建一个自己的云端账户。会议材料落在本机应用目录,凭据交给操作系统的安全存储。语音能力连接火山引擎服务,摘要和纪要的文本模型则可以在设置中选择提供商;当前代码支持多种服务预设,以及自定义兼容接口。

这意味着“本地会议助手”描述的是应用与记录的位置,而不是推理完全离线。音频会发送给语音服务,相关文本也会发送给所选模型提供商。云端保存政策不能由一个桌面项目替这些服务作保证。

产品没有把重点放在共享工作区或复杂知识库上。它首先处理的是会议现场的一条连续路径:讨论时能够记录,需要帮助时能够直接提问,回答之后能够自然回到讨论,最后得到一份可以带走的记录。这条路径中,AI 什么时候保持安静、什么时候接话,与它能回答什么同样重要。

所有项目

AI 助手与对话数据

团子是 AI 角色,不是本人。掷骰子等开场互动使用预先整理的公开资料,不调用模型。实时对话是否可用,以聊天框中的状态说明为准。

启用实时对话后,发送问题会将问题、当前文章的标识,以及服务器保存的近期对话与早期对话目录发送到本站后端;后端会将这些内容和检索到的公开资料发送给阿里云百炼生成回答。首次建立会话时使用 Cloudflare Turnstile 验证访客,无需注册。不要输入密钥或私人信息。模型与验证服务的数据处理适用各服务商的政策。

浏览器使用当前标签页的会话存储保存最近十条互动,便于在文章和对话间返回;清空对话会清除这些本地记录。服务器会话有效期为一小时,最多保存二十轮已完成对话;最近三轮直接作为上下文,较早记录按需读取。过期记录在后续请求时清理。“重新开始”会放弃当前会话,但不会立即删除服务器上的记录。在同一标签页的 HTTPS 页面间切换时,一小时会话凭证保存在该标签页的会话存储中,供后端恢复近期上下文和早期对话目录;它不是模型服务的 API 密钥。凭证过期或存储不可用时,需要重新验证,之前显示的记录不会自动进入新会话。

服务器另保存额度、预算和短期请求限制记录;连接标识经过带密钥的哈希处理。应用不额外记录问题日志,但服务器会话存储中包含上述对话文本。模型请求失败时,仅记录随机请求编号、错误类别、处理阶段、调用次数及是否已有部分输出,不记录问题、回答、IP 地址或密钥。AI 只能使用网站提供的公开资料工具,不能访问个人文件、私人聊天或密钥。来源链接不保证每句话准确;请检查原文,并区分作者观点、引用观点与模型推断。

嗨,我在。

不知道从哪里开始?我们可以掷个骰子。

我是 AI 角色,不是煜欣本人。当前可以玩开场互动;自由对话尚未接通。