anarlog 1.0.37 版本解析:说话人重分配、Sonoma 转录修复与本地笔记上下文的可靠性改进
2026/9/16 19:04:52 网站建设 项目流程

anarlog 1.0.37 版本解析:说话人重分配、Sonoma 转录修复与本地笔记上下文的可靠性改进

【免费下载链接】anarlogOpen source Granola AI Alternative项目地址: https://gitcode.com/GitHub_Trending/hy/anarlog

本文基于 anarlog(开源 Granola AI 替代方案)仓库中的 1.0.37 版本更新说明(packages/changelog/content/1.0.37.md),围绕 Transcripts、Recording、Notes、Chat 四个模块的系统性可靠性改进展开:说话人标签可从参与者/联系人重新分配并随片段漂移保持稳定、Soniqo 转录在 macOS Sonoma 上恢复可用、时间线笔记创建与图片复制行为修正、聊天获得本地笔记上下文能力。读完本文,你将理解这些改进背后的实现机制、相关源码位置,以及它们如何共同提升会议转录工作流的可用性。

版本概览

1.0.37 发布于 2026-06-02,frontmatter 中的官方摘要为:"Speaker assignment, local note context for chat, Sonoma transcription, and timeline note creation are more reliable."(说话人分配、聊天的本地笔记上下文、Sonoma 转录与时间线笔记创建更加可靠)。

这是一次以稳定性与可靠性为核心的版本迭代,四大模块各有明确改进:

模块核心改进面向问题
Transcripts说话人标签可重分配,且分配在片段移位/提示乱序时保持稳定转写后说话人标注修正繁琐、已有标注易丢失
RecordingSoniqo 转录恢复 macOS Sonoma 支持;会议自动停止更可靠系统升级后转录失效、残留进程导致会话未停止
Notes时间线新建笔记立即置顶;复制保留 Markdown 图片引用;联系人含电话号码笔记组织与内容搬运效率
Chat笔记可拖入聊天、本地笔记可读可搜、Escape 关闭不丢上下文聊天缺乏会议笔记上下文、误操作丢失位置

下文按模块逐一展开,并引入仓库源码佐证实现细节。

Transcripts:说话人标签重分配与分配稳定性

从转录界面直接重分配说话人

1.0.37 起,转录中的说话人标签(speaker label)可以直接从转录文本上重新分配到三类对象:

  • 会话参与者(session participants):正在参加会议的人;
  • 已有联系人(existing contacts):通讯录中已存在的人;
  • 新联系人(new contact):直接创建新联系人并绑定。

这一交互背后对应前端 apps/desktop/src/stt/utils.ts 中的upsertSpeakerAssignment函数。它支持两种分配作用域:

  • mode: "segment":仅作用于当前片段内的指定词(word_ids),生成user_speaker_assignment:segment类型的 hint;
  • mode: "all":作用于整个声道 + 说话人索引(channel+speaker_index),生成user_speaker_assignment类型 hint,等效于"这位说话人全程改名"。
// apps/desktop/src/stt/utils.ts 中分配 hint 的数据结构示例 { id: `${anchorWordId}:user_speaker_assignment[:segment]`, word_id: anchorWordId, type: "user_speaker_assignment", value: JSON.stringify( // segment 模式:{ human_id, scope: "segment", word_ids, extend_to_adjacent } // all 模式:{ human_id, scope: "speaker", channel, speaker_index } ), }

分配结果通过transcripts表的speaker_hints单元格持久化(见parseTranscriptHints/updateTranscriptHints),因此刷新界面或重启应用后标注不会丢失。从源码结构看,hint 体系包含三种类型:provider_speaker_index(转写提供商给出的原始说话人索引)、automatic_speaker_assignment(自动分配的标签)与user_speaker_assignment(用户手动分配),用户的手动分配优先级最高。

片段移位时分配保持稳定

改版本解决了此前的一个痛点:当转录片段发生移位(segments shift)或说话人提示(speaker hints)以不同顺序到达时,已保存的说话人分配容易失效

实现上由reconcileSegmentSpeakerAssignmentHint负责"调和对账":每当新一批词(new_words)替换旧词(replaced_ids)时,它会基于时间范围(getWordRange)与说话人 segment key(channel+speaker_index),把旧分配中引用的word_ids重新映射到新词上:

  • 若旧 anchor 词被替换,则以对账后的第一个词作为新 anchor;
  • extend_to_adjacent为真,会向时间相邻且属于同一说话人的词双向扩展(受MAX_SEGMENT_GAP_MS = 3000毫秒的间隙约束,见canMergeSegmentWords);
  • 若对账后找不到任何存续词,该 hint 才会被移除。

同样的稳定性逻辑也存在于 Rust 侧。实时转录状态机 crates/listener-core/src/live_transcript/segments.rs 中的RenderedSegmentState维护speaker_assignmentschannel_assignments两份身份映射,并提供update_identities方法:替换身份输入后立即重新渲染保留窗口内的词,使已显示在屏幕上的片段马上采用新名字,而无需等待下一次流式响应。

// crates/listener-core/src/live_transcript/segments.rs /// Replaces the identity inputs and re-renders the retained window so /// segments already on screen pick up the new names without waiting for /// the next stream response. pub(super) fn update_identities( &mut self, channel_assignments: Vec<IdentityAssignment>, speaker_assignments: Vec<IdentityAssignment>, segment_options: SegmentBuilderOptions, ) -> Option<LiveTranscriptSegmentDelta>

仓库同文件的测试identity_update_relabels_rendered_segments_and_keeps_partials验证了该行为:为 speaker 0 分配 "artem" 后,已渲染片段立即被重命名为 "hello there",旧的未命名片段被移除,且后续新词继续沿用 "artem" 标签;identity_update_without_changes_emits_nothing则保证无变化时不产生冗余重渲染。

此外,渲染窗口有明确的资源边界(MAX_RENDERED_WORDS = 4_096MAX_RENDERED_TEXT_BYTES = 64 KiBMAX_RENDERED_WINDOW_MS = 30 分钟),保证长时间会议的实时面板内存与流量可控(见同文件的prune_rendered_wordsbounded_partials)。

实时转录面板间距一致性

本版本还统一了实时转录面板(live transcript panel)在折叠与展开两种状态下的间距表现,避免切换状态时布局跳动。该调整属于纯 UI 一致性修复,与上文的分段渲染逻辑配合,提升长时间会议中的阅读体验。

Recording:Soniqo 转录与会议自动停止

macOS Sonoma 上 Soniqo 转录恢复

1.0.37 修复了Soniqo 转录在 macOS Sonoma 系统上无法工作的问题。Soniqo 是 anarlog 内置的本地语音识别后端:从 crates/transcribe-soniqo/swift-lib/src/lib.swift 看,它基于 Swift + CoreML 运行本地模型,采样率为 16 kHz,模型类型包括:

  • soniqo-parakeet-streaming(Parakeet-EOU-120M-CoreML-INT8,支持流式);
  • soniqo-parakeet-batch(Parakeet-TDT-v3-CoreML-INT8-30s,批量分块 20~29.5 秒);
  • soniqo-omnilingual(Omnilingual-ASR-CTC-300M-CoreML-INT8-10s,分块 35 秒);
  • soniqo-qwen3-small/soniqo-qwen3-large(Qwen3-ASR 0.6B / 1.7B,MLX 量化)。

并集成了Community1DiarizationPipeline用于说话人分离。作为本地转录方案,它不依赖云端,对隐私敏感场景尤为重要;此次修复针对 Sonoma 系统上的兼容性问题(crates/transcribe-soniqo 目录下包含构建脚本、Swift 桥接库与错误定义),确保升级 macOS 后本地转录能力不再失效。

会议自动停止补全残留进程场景

本版本还补上了自动停止(auto-stop)逻辑中的一个边界情况:会议应用已关闭、但麦克风辅助(microphone helper)进程仍在运行时,会话此前可能无法正确结束。修复后,自动停止检测会覆盖该场景,避免"会议结束了但还在录音/转写"的隐私与资源浪费问题。

Notes:时间线笔记、图片复制与联系人电话

时间线模式新建笔记立即置顶

在时间线(Timeline)模式下,新创建的笔记此前可能出现在Create new note卡片之后;1.0.37 修正为:新建笔记在创建后立即排列在 Create new note 卡片之前,使"继续记录新内容"的入口始终位于最新笔记之后,时间线阅读顺序更自然。

复制笔记内容保留图片为 Markdown 引用

复制笔记内容时,被选中的图片现在会以 Markdown 图片引用(...)形式保留,而不是丢失或退化为纯文本路径。这保证了笔记在跨应用粘贴、迁移或导出为 Markdown 文件时,图片引用仍然可解析、可复用。

联系人纳入电话号码

联系人(Contacts)体系在三个入口同步纳入了电话号码字段:

  • 联系人详情页(details)展示;
  • 联系人搜索(search)可命中号码;
  • 参与者匹配(participant matching)可将通话/会议中的参与者与联系人的电话号码关联。

从 apps/desktop/src/contacts/queries.ts 等前端查询模块可以继续追踪联系人数据的读取与匹配实现。

Chat:本地笔记上下文与更自然的交互

笔记拖入聊天作为上下文

1.0.37 支持将笔记直接拖拽(drag & drop)进聊天窗口,作为对话上下文注入。这解决了此前"聊天无法感知会议笔记"的割裂:你在聊天中询问的问题,可以明确引用某条笔记的内容作为背景。

聊天可读取与搜索本地文件笔记

更进一步,聊天具备**读取并搜索本地文件型笔记(file-backed notes)**的能力——当对话需要更多上下文时,聊天会自动从本地笔记文件中检索相关片段。相关实现位于 apps/desktop/src/chat/tools/note-files.ts(配套测试 note-files.test.ts),从命名与目录结构可以推断,它是聊天工具(chat tools)体系的一员,与其他工具如 search-meetings.ts、web-search.ts 并列。这意味着"查询笔记内容"是聊天可主动调用的能力,而非仅靠用户手动粘贴。

Escape 关闭聊天不丢位置

最后一项交互修正:按下 Escape 关闭聊天面板后,当前所在笔记保持不变。此前关闭聊天可能触发导航回到其他笔记,打断阅读流;修复后 Escape 只负责收起聊天,不影响正在浏览的笔记上下文。

小结:1.0.37 的可靠性主线

纵观整个版本,四条改进线共同指向同一目标——让"说话人标注—本地转录—笔记组织—聊天问答"这条会议工作流在真实使用中更少出错、更可依赖

  1. Transcripts:说话人重分配入口下沉到转录界面本身,且通过前端 hint 对账(reconcileSegmentSpeakerAssignmentHint)与后端分段重渲染(update_identities)双重机制,保证分配在流式纠错与片段漂移下依然稳定;
  2. Recording:本地 Soniqo(CoreML)转录恢复 Sonoma 支持,自动停止补全麦克风辅助进程残留场景;
  3. Notes:时间线创建顺序、图片 Markdown 引用、联系人电话号码三项细节让笔记组织与复用更顺手;
  4. Chat:拖拽、本地笔记检索与 Escape 行为让聊天真正融入笔记工作流。

如需查阅全部历史版本记录,可浏览 packages/changelog/content 目录下的各版本文件;仓库还维护了一份 nightly.md 用于跟踪每日构建的变更。

【免费下载链接】anarlogOpen source Granola AI Alternative项目地址: https://gitcode.com/GitHub_Trending/hy/anarlog

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询