Hex Vocabulary 实验特性实战:用共享词表修正 Parakeet 转写、提示词重写与会议检索

发布时间:2026/11/3 10:20:39
Hex Vocabulary 实验特性实战:用共享词表修正 Parakeet 转写、提示词重写与会议检索 语音桌面应用本地部署人工智能音频【免费下载链接】hexLocal voice dictation for mac, windows and linux项目地址https://gitcode.com/GitHub_Trending/hex19/hex点击查看免费下载Hex 的 Vocabulary 是一个受实验开关控制的共享词表用来记录人名、项目名、产品名以及它们常见的误转写拼写sounds like。开启后同一份词表会被转写重打分、Modes 重写提示词、会议章节命名和全文检索共同使用关闭时整条链路会退回原始行为。本文以 docs/features/vocabulary.md 为主线结合 src/vocabulary.rs、src/rune_ui/vocabulary.rs、src/meeting_query.rs、src/dictation_processor.rs 等源码讲清它的开关方式、数据结构、四个消费端转写 / 重写 / 章节 / 检索的具体行为以及调参与排错要点。一、特性定位一个词表四个消费端词表的核心语义非常简单一份名单外加每个名字可选的误拼写。文档开头将其定义为One shared list of names Hex should know (people, projects, products), each with optional sounds like spellings a transcript may show instead。它不是一个独立功能面板而是被四处读取的共享数据源消费端作用源码位置转写Parakeet对贪心解码结果做跨度重打分把听错的名字换回词表里的写法src/vocabulary.rs、src/gguf_session.rs提示词重写Modes在重写提示词中加入按此拼写的词汇行src/dictation_processor.rs会议实时章节在章节提示词前加入可能出现的名称与术语src/meeting_chapters.rs检索把误转写当作词条的别名参与排序src/meeting_query.rs一个关键约束必须提前说清当前该特性仅支持 macOS文档原文 macOS only for now。设置界面走的是 Rune UI 的 General 面板src/rune_ui/settings.rs 中按platform.vocabulary条件渲染而底层词表模块本身是跨平台编译的 Rust 代码。二、开启与关闭实验门禁的完整语义2.1 开启步骤hex experiments enable vocabulary # 然后重启 Hex实验机制本身在 docs/features/experiments.md 中有完整说明实验是代码在 dev 分支上但默认休眠的特性有两个来源会被并集读取环境变量HEX_EXPERIMENTSlive-chapters,vocabulary逗号或空格分隔对本进程及其子进程生效用户配置目录下的experiments文件每行一个名字#为注释每次启动读取。进程只在首次使用时读取一次因此修改后必须重启 Hex 才生效src/experiments.rs。未知名字会写入process.log并被忽略不会导致启动失败。2.2 关闭时的行为重要文档给出了明确清单实验关闭时没有任何东西会读取词表设置界面不显示 Vocabulary 卡片hex vocabulary命令被拒绝错误码为feature-off提示文案即turn it on withhex experiments enable vocabularyand restart Hexsrc/control.rs转写、提示词与检索看到的都是空列表。这一点在源码里是入口级门禁而不是 UI 隐藏vocabulary::enabled()直接查询实验模块entries()在未开启时立即返回空Vecpub fn enabled() - bool { experiments::enabled(Experiment::Vocabulary) } pub fn entries() - VecVocabularyEntry { if !enabled() { return Vec::new(); } // ... }参见 src/vocabulary.rs。hex vocabulary的拒绝发生在控制命令处理层且--help中该子命令被标注为 experimentsrc/control/cli.rs。三、数据结构settings.json 中的vocabulary3.1 字段定义词表保存在settings.json的vocabulary字段形态为{ vocabulary: [ { term: abattoir, sounds_like: [avatar, a bat war] }, { term: Rune, sounds_like: [roon] }, { term: Parakeet } ], vocabulary_boost: normal }对应 Rust 结构src/vocabulary.rspub struct VocabularyEntry { pub term: String, #[serde(default, skip_serializing_if Vec::is_empty)] pub sounds_like: VecString, }sounds_like使用了skip_serializing_if所以没有误拼写的词条写出来只有{term: ...}。3.2 兼容性设计空表不写回AppSettings中的字段同样带skip_serializing_if Vec::is_emptysrc/app_settings.rs/// The shared vocabulary (crate::vocabulary). Left out of the file /// while empty, so settings without one stay as they were. #[serde(skip_serializing_if Vec::is_empty)] pub vocabulary: Veccrate::vocabulary::VocabularyEntry,这意味着旧版本配置文件不会因为加载一次就被补写出新字段。测试vocabulary_round_trips_and_stays_out_of_files_without_one精确验证了这一点写入{sound_effects: false}后加载内存中vocabulary为空且文件里仍然没有vocabulary键src/app_settings.rs。3.3 数量与长度限制文档与源码一致的硬约束约束值源码常量词条总数上限500MAX_ENTRIES单个 term 或 spelling 最大字符数64MAX_TERM_CHARS每词条最多拼写数16MAX_SOUNDS_LIKE参与转写重打分的词条数前 64 条MAX_BIASED_TERMS只读命令读取 settings.json 的上限4 MiBSETTINGS_READ_LIMIT见 src/vocabulary.rs。注意字符数是chars().count()而非字节数因此中文、带重音的拉丁字母不会被误判。词条忽略大小写唯一same()使用to_lowercase()比较。3.4 只读读取不加载、不迁移、不改写hex history、hex meetings、hex mcp这类只读命令通过read_saved(root)直接解析文件不经过AppSettings避免触发迁移与写盘pub fn read_saved(root: Path) - VecVocabularyEntry { if !enabled() { return Vec::new(); } match read_from(root.join(settings.json)) { Ok(entries) entries, Err(error) { tracing::warn!(%error, could not read the vocabulary; searching without it); Vec::new() } } }几个工程细节值得注意src/vocabulary.rs文件不存在返回空列表NotFound单独处理不算错误文件超过 4 MiB 直接报错避免误读超大文件JSON 非法只记录 warning检索降级为无词表继续跑不会让命令失败read_from内部用了一个最小化的struct Settings { vocabulary: Vec... }因此文件里其余字段全部被忽略。调用点包括 src/transcript_cli.rshex history、src/transcript_cli.rshex meetings search、src/meeting_mcp.rsMCP 每次检索都重读编辑无需重启。四、设置界面General › Vocabulary4.1 布局与交互设置卡片位于 General 面板的 Dictation 之后标题为 Names and terms说明文案是 Transcription and rewriting spell them right, and search finds them when misheard。实现见 src/rune_ui/vocabulary.rs。交互行为每行三个控件Term 文本框、Sounds like 文本框逗号分隔、删除按钮Add term新增一个空行只有在 term 有内容时才真正保存Add suggested一次性加入vocabulary::SUGGESTED中尚未存在的词条所有建议都已在列表中Add suggested 按钮隐藏不会出现点了没反应的空按钮列表为空显示 No terms yet.编辑防抖草稿保存与 Modes 的 corrections 一致停顿后写入vocabulary超出限制保留 term截断到 64 字符与能容纳的拼写并在下方显示危险色提示Boost四段选择器Off / Light / Normal默认/ Strong写入vocabulary_boost空状态与内容状态各有一个 UI 场景用于快照回归mac-settings-vocabulary和mac-settings-vocabulary-emptysrc/rune_ui.rs。4.2 建议词条清单SUGGESTED是编译期常量共 16 条覆盖项目内外的常见易错名src/vocabulary.rsabattoir, OpenCode, HiveMind, Scrawl, motion-lint, Rune, Parakeet, Moonshine, Effect, Anomaly, Dax, Aiden, Claude, Argon, Astra, Sparkle设计要点点击才添加。add_suggested只添加尚未存在的词条返回实际新增数量has_every_suggestion用于决定按钮是否显示。4.3 超限时的裁剪而不断言失败手工在 UI 里输入超长文本时如果直接报错拒绝保存用户体验会很差。因此界面路径使用add_clamped而 CLI 路径使用严格拒绝的add/// Like [add], but keeps what fits instead of refusing: a long term is cut /// to its first 64 characters, and a long spelling or one past the 16th is /// left out. pub fn add_clamped(list: mut VecVocabularyEntry, term: str, sounds_like: [String]) - boolterm 超过 64 字符 → 截断到 64 字符并再次归一化空白拼写超长或超过第 16 个 → 丢弃该拼写保留其余列表已满 500 条 → 新词条不会被加入函数返回true表示有内容被裁剪返回值用于驱动 UI 那行危险色提示ui.vocabulary.clamped()。对应测试clamped_adds_keep_the_term_and_the_spellings_that_fit与rows_past_the_limits_keep_their_term_and_what_fitssrc/vocabulary.rs、src/rune_ui/vocabulary.rs。4.4 行编辑如何合并成词条多行输入最终会被投影成一份干净、去重、合并过的列表VocabularyEditor::projectterm 为空的行被忽略包括只有拼写的行term 与拼写都会做空白归一化split_whitespace().join( )同一个 term 出现多次忽略大小写→ 拼写合并到第一条与 term 相同的拼写、重复拼写 → 丢弃。测试rows_project_to_cleaned_merged_entries覆盖了空 term 行 重复 term 行 前后空格的组合src/rune_ui/vocabulary.rs。五、Parakeet 转写重打分唯一真正改字的路径5.1 只有 Parakeet 的 RNN-T / TDT 生效转写偏置被封装在transcription_bias()中返回None的三种情况实验关闭、列表为空、Boost 为 Off。它的输出直接映射到推理引擎的运行参数Some(( entries.iter().map(|entry| entry.term.clone()).collect(), transcribe_cpp::ParakeetVocabularyOptions { boost: Some(boost.nats()), sounds_like, }, ))gguf_session只对满足条件的模型挂载这个扩展src/gguf_session.rslet takes_vocabulary model.arch() parakeet model.accepts_ext( transcribe_cpp::ExtSlot::Run, transcribe_cpp::sys::TRANSCRIBE_EXT_KIND_PARAKEET_VOCABULARY, );并且在with_vocabulary中再检查一次options.family.is_some()如果调用方已经指定了 Whisper 风格的 hint family就不叠加词表扩展。这就解释了文档中的那句结论——Whisper、Qwen3、SenseVoice、Cohere、Apple Speech 不做重打分。5.2 重打分不是解码时加权文档用一句很关键的话描述算法在贪心解码完成后对看起来或听起来像某个词条的最长 4 个词的跨度用同一段音频帧、同一个解码器状态重新打分只有当词条得分 每片段 boost超过实际听到的词得分时才替换。这带来两个性质音频决定结果拼写只提供候选。词表不会盲改文本——如果音频证据不支持词条不会写入。研究文档给出的实测例子是某处音频帧对 avatar 打 −0.2、对 Abattoir 打 −9.2而 Abattoir 有 5 个 piece2.5 × 5 12.5 的 boost 足以覆盖差距于是替换另一处是 −0.1 对 −13.7差距超过 boost词保留原样docs/research/vocabulary-boost-results.md。每个解码只做有界次数的重打分成本可控。5.3 明确不动的情形文档列出的四类不改写场景都是实践中容易误伤的边界情形例子原因仅大小写差异runevsRune大小写不承载语义替换无收益词形变化Abattoirs复数/屈折是合法表达不属于误听地址与路径opencode.ai点号、斜杠等结构可能是 URL 或路径少于 5 个字母且没有拼写的词条Dax、Rune短词容易被无关音频命中研究文档把最后一条细化成or one consonant sound off, only in names with 5 sounds并列出跳过的符号集. / : \ _。5.4 Boost 四档与 nats 数值VocabularyBoost是一个snake_case序列化枚举默认值为Normalsrc/vocabulary.rs档位nats per term piece含义Off0.0完全不重打分transcription_bias直接返回NoneLight2.0保守仅在音频相当接近时替换Normal默认2.5实测在召回与误插之间取得平衡Strong4.0更激进可能把普通词改成词条命令行也可设置hex settings set vocabulary_boost strong该键在 settings 元数据中注册为Kind::Choice([off, light, normal, strong])src/control/settings.rs因此hex settings get vocabulary_boost/hex settings list都能读到它。研究文档还给出了一条重要脚注Strong 的实验测量是在 3.0 上做的Hex 的 Strong 定为 4.0 是刻意上调因此 Strong 的实际误插风险高于表格数字docs/research/vocabulary-boost-results.md。这也解释了为什么文档强调 Normal 是默认值。5.5 生效时机文档写明Every run and live stream reads the list and the boost at its start。体现在代码上是transcription_bias()每次 run 都被调用在 src/gguf_session.rs 与 src/gguf_session.rs 两处包进 run options因此设置改动从下一次转写开始生效无需重启实验开关本身仍需重启。受影响的入口包括听写、会议、captures 以及 local API——它们共享同一条OfflineGgufSession路径。六、命令行hex vocabulary6.1 三个子命令hex vocabulary list hex vocabulary list --json hex vocabulary add Abattoir --sounds-like avatar,a bat war hex vocabulary add Abattoir --sounds-like a bat war hex vocabulary remove abattoir子命令参数行为list--json列出每个词条及其拼写add term--sounds-like a,b新词条若词条已存在则把新拼写合并进去remove term—忽略大小写删除整个词条含拼写定义见 src/control/cli.rs。--sounds-like是单个字符串参数内部按逗号切分且会做 trim 与空白折叠pub fn parse_sounds_like(raw: str) - VecString { raw.split(,) .map(clean) .filter(|spelling| !spelling.is_empty()) .collect() }因此--sounds-like avatar,, a bat war ,会得到[avatar, a bat war]测试sounds_like_splits_on_commas。6.2changed: false的语义add的返回不是简单的成功/失败而是列表是否发生了变化已存在且没有新拼写 →ControlReply::unchangedchanged: false消息为X is already in the vocabulary已存在但有新拼写 →ControlReply::done消息Added spellings to X不存在 →ControlReply::done消息Added Xremove找不到 →changed: false消息X isnt in the vocabulary。实现见 src/control.rs。这个布尔值不只是文案差别在桌面端它决定是否写盘并通知运行时重载——只有changed: true时才settings.save()并发送Request::ReloadSettingssrc/macos_rune/control.rs。严格模式下的错误码是invalid-value覆盖空 term、超 64 字符、超过 500 条、超过 16 个拼写。6.3 人读输出与 JSON非 JSON 模式下list的输出形如src/control/cli.rsAbattoir (sounds like avatar, a bat war) Rune (sounds like roon) Parakeet空表时输出提示The vocabulary is empty;hex vocabulary addadds one。--json模式则包装成统一的控制协议响应{version: ..., reply: {status: vocabulary, entries: [...]}} src/control/cli.rs。6.4 与运行中 Hex 的关系文档写道Running Hex saves and reloads settings; an open window adopts the change。这里有一个前提hex vocabulary是通过控制通道发给在线进程执行的send(ControlCommand::Vocabulary*)由桌面端 handler 落盘并广播重载。因此Hex 未运行时该命令无法完成编辑不像hex history那样是纯本地只读运行中编辑后已打开的设置窗口会采用新值并重建编辑器src/rune_ui.rs。七、提示词重写让 Modes 按词表拼写当 Modes重写启用时提示词会在前景应用信息之前插入一段词汇说明src/dictation_processor.rsVocabulary (spell these exactly when the speaker means them): abattoir (may be transcribed as avatar, a bat war); Rune格式规则词条之间用;连接有拼写时写成term (may be transcribed as a, b)没有拼写时只写 term词表为空或实验关闭时返回空字符串提示词完全不变整段以\n\n结尾确保与后续Foreground application: ...正常分隔。测试prompt_names_vocabulary_terms_and_their_mistranscriptions断言了完整前缀与紧邻 Foreground application的位置关系src/dictation_processor.rs。注意这里没有 64 条截断提示词路径使用完整列表受 500 条上限约束与转写路径的 64 条上限是两套独立预算。八、会议实时章节只给名字不给拼写live-chapters实验开启时章节生成与边界判定会在提示词开头加一行src/meeting_chapters.rsNames and terms that may appear: a, b, …差异点值得注意维度提示词重写会议章节上限全量≤500前 30 条MAX_TERMS 30单条长度不截断截断到 40 字符是否含拼写含不含空值空字符串空字符串此外章节侧读取的是read_saved快照每次调用重新读取因此编辑后无需重启即可影响下一次章节生成src/meeting_chapters.rs。九、检索把误转写当作别名参与排序这是词表最精细的消费端也是唯一做了完整权重设计的部分。9.1 权重表src/meeting_query.rs 定义了匹配类型与权重MatchKind权重触发条件Exact1.0词干完全一致Prefix0.5前缀扩展同词干处理Alias0.5词条的 sounds like 拼写或词条拆成两个相邻词Edit(n)0.35编辑距离内的拼写变体Phonetic0.3语料中听起来像词条的词Sound0.2仅 Soundex 相同的短词回退这直接对应文档的两条结论sounds like 拼写与拆词得 0.5等价于前缀听起来像的词得 0.3别名永远不算精确匹配精确命中永远排在最前。9.2 别名的三种生成方式vocabulary_aliases()只为单词词条生成别名多词词条按普通词处理显式拼写把每条sounds_like分词、取词干作为Alias拆词把词条按字符边界切成两半左半 ≥3 字符、右半 ≥3 字符如果两半都在语料词表里就作为相邻短语别名。这就是OpenCode→open code、HiveMind→hive mind的来源音近词遍历语料词表凡是sounds_alike()成立且通过admits()的作为Phonetic。9.3sounds_alike的四道闸门fn sounds_alike(term: str, candidate: str) - bool { let length term.chars().count().max(candidate.chars().count()); candidate ! term candidate.chars().count() 4 !STOPWORDS.contains(candidate) sound_key(term).is_some_and(|key| { key.len() SOUND_ALIKE_MIN_CONSONANTS sound_key(candidate) Some(key) }) edit_distance(term, candidate, length / 2).is_some() }四道闸门分别是src/meeting_query.rs候选词至少 4 个字符不是停用词无长度上限的 Soundex key 相同且 key 长度 2即至少 2 个辅音音素SOUND_ALIKE_MIN_CONSONANTS 2编辑距离不超过较长词长度的一半。第 3 条就是文档所说的≥2 consonant sounds规则。它的存在理由是反面案例Rune、Dax这类短名的辅音音素太少音近匹配会命中大量无关词所以它们只能靠人工写的 sounds like 拼写。测试sound_alikes_need_two_consonant_sounds_and_few_changes逐条验证了这些边界abattoir≈avatar成立claude≈cloud、scrawl≈scroll成立而rune/rain、dax/docks、effect/affect、parakeet/pirate全部不成立。9.4 常见词抑制与用户写了就永远生效admits()控制一个扩展是否被采用src/meeting_query.rsExact/Prefix/Alias→ 永远采用Phonetic→ 仅当该候选词出现的段落数 ≤common阈值Edit/Sound→ 还要求该词条的精确命中段落数 3且候选不常见或没有精确命中且编辑距离为 1这一纯拼写错误的例外。其中常见的阈值是const COMMON_SHARE: f32 0.005; const COMMON_MIN_PASSAGES: f32 5.0; let common (documents as f32 * COMMON_SHARE).max(COMMON_MIN_PASSAGES);即出现在被检索段落的 0.5% 以上且至少 5 段。测试vocabulary_never_pulls_in_common_words构造了一个场景scroll在 7 段里出现、Scrawl只出现 1 段此时scroll因过常见被抑制不再作为Scrawl的误转写但如果用户显式把scroll写进sounds_like7 段全部命中且精确命中仍排第一。9.5 排序精确优先然后分数最终排序不是单纯按 BM25 分数fn relevance(left: Scored, right: Scored) - std::cmp::Ordering { right.exact.cmp(left.exact) .then_with(|| right.score.total_cmp(left.score)) }exact表示查询的每个词都命中了精确词干。因此整句都精确命中的段落一定排在需要模糊匹配的段落之前无论后者 BM25 分数多高。测试a_vocabulary_term_finds_its_mis_transcriptions_below_exact_hits里含三次 avatar 的段落分数更高但仍排在两段精确命中之后。另外模糊匹配对总分的覆盖度会打折let coverage 0.5 0.5 * matched_weight / query.terms.len() as f32;即越依赖不可信匹配得分越被压低。9.6 三个检索入口共用同一逻辑hex meetings search、MCP 的search_transcripts、hex history --search都走meeting_query的打分函数词表来源都是read_savedCLISearchQuery { fuzzy: true, vocabulary: read_saved(root), ... }src/transcript_cli.rsMCPMeetingServer::vocabulary()每次检索重读src/meeting_mcp.rshistoryhistory_output(..., read_saved(root))传给rank_historysrc/transcript_cli.rs。注意fuzzy: false时别名不参与——测试中score(..., false, vocabulary)只返回精确命中那一段。十、可调参数的唯一修改点文档最后给出了一张Provisional defaults表明确指出每个默认值应该改在哪里。这在实践中很有价值因为它避免了在多个位置重复定义常量可调项修改位置hex vocabulary是否出现在--helpsrc/control/cli.rs加#[command(hide true)]可隐藏重写提示词措辞src/dictation_processor.rs 的vocabulary_lines章节提示词措辞src/meeting_chapters.rs 的vocabulary_line短名规则辅音音素数src/meeting_query.rs 的SOUND_ALIKE_MIN_CONSONANTS建议词条清单src/vocabulary.rs 的SUGGESTEDBoost 强度nats per piecesrc/vocabulary.rs 的VocabularyBoost::nats十一、验证与测试可以照着复现的检查点文档列出了覆盖各层的测试名它们对应的代码位置如下测试覆盖点位置adding_dedupes_by_case_and_merges_spellings大小写去重、拼写合并、空 term 与超长 term 拒绝src/vocabulary.rsclamped_adds_keep_the_term_and_the_spellings_that_fit裁剪而非拒绝src/vocabulary.rsremoving_ignores_case大小写无关删除src/vocabulary.rssuggestions_add_only_whats_missing建议只补缺失项src/vocabulary.rstranscription_bias_keeps_the_first_terms_and_their_spellings前 64 条、拼写索引、boost 数值src/vocabulary.rsboost_reads_and_writes_as_its_name序列化为strong、默认 2.5 natssrc/vocabulary.rssounds_like_splits_on_commas逗号切分与空白折叠src/vocabulary.rssaved_entries_read_without_loading_settings直接读文件、缺字段、坏 JSONsrc/vocabulary.rsvocabulary_round_trips_and_stays_out_of_files_without_one旧文件不被补写字段src/app_settings.rsa_vocabulary_term_finds_its_mis_transcriptions_below_exact_hits音近命中排在精确命中之后src/meeting_query_tests.rssounds_like_spellings_and_split_words_alias_a_term拼写别名、相邻拆词、fuzzy 关闭src/meeting_query_tests.rsvocabulary_never_pulls_in_common_words常见词抑制与显式拼写例外src/meeting_query_tests.rssound_alikes_need_two_consonant_sounds_and_few_changes辅音数与编辑距离闸门src/meeting_query_tests.rsprompt_names_vocabulary_terms_and_their_mistranscriptions提示词格式与位置src/dictation_processor.rsrows_project_to_cleaned_merged_entriesUI 行投影与合并src/rune_ui/vocabulary.rsrows_past_the_limits_keep_their_term_and_what_fitsUI 超限裁剪src/rune_ui/vocabulary.rs文档还标注了通过时间与未覆盖项这一点在引用时应保留避免过度断言场景快照mac-settings-vocabulary、mac-settings-vocabulary-empty于 2026-10-23 在 macOS 通过尚未观察到运行中的 Hex 里编辑卡片、针对运行中 Hex 的 CLI 编辑、以及带真实 provider 的重写。十二、实战配置建议12.1 从建议清单起步再补业务名词先点 Add suggested 得到 16 条基础词条然后补充团队内的项目名、服务名、客户名。判断是否值得加入的经验规则名字越不像普通英文词越值得加Abattoir会被听成avatarScrawl会被听成scroll短名3–4 字母必须配 sounds like否则检索侧的音近匹配不会生效转写侧也不会重打分文档明确说明短名only through sounds like spellings不要加纯大写缩写如API、SDK——它们既是停用词/常见词又缺乏足够的辅音音素结构。12.2 一个可直接照抄的起始词表hex experiments enable vocabulary # 重启 Hex hex vocabulary add Abattoir --sounds-like avatar,a bat war hex vocabulary add OpenCode --sounds-like open code,open coat hex vocabulary add Scrawl --sounds-like scroll hex vocabulary add Rune --sounds-like roon hex vocabulary add Dax --sounds-like dex,docks注意OpenCode与Scrawl的拼写既帮助检索0.5 权重别名也帮助转写作为候选跨度提示。12.3 Boost 的取舍默认normal研究文档实测把 Abattoir 的离线召回从 4/19 提到 12/19、流式从 6/19 提到 13/19全部词条从 136/157 提到 146/157同时无词条片段的 WER 保持不变、零误插light适合词表里有大量普通英文名的场景牺牲召回换稳妥strong仅在确认误插可接受时使用文档注脚已说明它的实测基准是 3.0 而产品值是 4.0off保留词表但完全关闭重打分此时提示词、章节与检索仍然使用词表只有转写不重打分。12.4 成本预期研究文档的延迟测量MacBook Pro机器同时跑其他构建任务绝对值偏噪场景Off 中位 / p90Normal 中位 / p90rve 离线每 10 秒音频363 / 670 ms356 / 698 mstc 离线每 10 秒音频695 / 957 ms763 / 1111 ms结论是有候选时每条片段增加约 0.05–0.15 秒没有候选时无额外成本并且重打分发生在转写引擎线程的解码之后不在音频线程上。十三、边界与限制清单在把该特性用于生产前需要明确以下限制均来自文档与源码平台设置界面当前仅 macOS词表模块与只读命令是跨平台代码但文档只承诺 macOS 行为。模型重打分只对 Parakeet 的 RNN-T / TDT 生效Whisper、Qwen3、SenseVoice、Cohere、Apple Speech 完全不参与。数量预算不一致转写只看前 64 条按列表顺序不是按重要性章节只看前 30 条并把每条截到 40 字符提示词与检索看全量。顺序有意义因为转写取前 64 条把最重要的名字放在列表前部UI 中即靠上的行。别名永不精确检索中Alias权重固定 0.5因此命中别名的段落不可能超过精确命中的段落。显式拼写优先于自动音近用户写进sounds_like的拼写绕过了常见词抑制这是有意的设计权衡。实验状态需重启HEX_EXPERIMENTS与experiments文件都只在进程首次使用时读取但词表内容与 boost 的改动在运行中即可生效转写侧从下一次 run 起检索侧每次调用重读。结语Vocabulary 的价值不在一个名单而在它把同一份领域知识以四种不同机制注入系统转写侧的音频级重打分、提示词侧的显式拼写指令、章节侧的命名一致性约束、检索侧的声学别名扩展。理解这四条路径各自的预算与闸门——64 条上限、4 词跨度、2 个辅音音素、0.5% 常见词阈值——才能把它调到既叫得准又不乱插入的状态。需要继续深入时建议从 src/vocabulary.rs 的数据模型出发再按消费端阅读 src/gguf_session.rs、src/dictation_processor.rs、src/meeting_chapters.rs 与 src/meeting_query.rs。赞分享语音桌面应用本地部署人工智能音频【免费下载链接】hexLocal voice dictation for mac, windows and linux项目地址https://gitcode.com/GitHub_Trending/hex19/hex点击查看免费下载相关推荐Hex 转录质量路线图用共享词表、Parakeet 重打分与统一推理栈修复专有名词误识别Hex 转录质量路线图用共享词表、Parakeet 重打分与统一推理栈修复专有名词误识别 本文以 Hex 的转录质量规划为主线完整拆解从「评测门槛」到「共享语音桌面应用本地部署人工智能音频MiniMax-Music3-8bit安装分步指南mlx-audio环境配置与6个常见坑全解析MiniMax Music3 8bit安装分步指南mlx audio环境配置与6个常见坑全解析 MiniMax Music3 8bit 是 MiniMax M语音桌面应用本地部署人工智能音频LinkSwift 网盘直链下载教程如何获取并推送 IDMLinkSwift 网盘直链下载教程如何获取并推送 IDM 网盘网页版下载慢、官方客户端又太笨重还想把文件批量喂给下载器LinkSwift 是一个浏览器油前端上一篇Soulmate数据管理全解load全量加载、add增量更新与remove删除的完整API参考下一篇Torch-RecHub特征工程详解DenseFeature与SparseFeature统一特征系统完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询