用途与实际影响
这项功能怎样使用
为什么需要它
顺滑的一句话也可能是模型补出来的;空白可能是真的安静,也可能是没识别到。要把重要数字和否定句留在原声音旁边复核,不能用润色掩盖疑点。
举个实际例子
“这里到底说的是十五还是五十?把两套结果和对应声音留给我看。”先列出真实分歧与时间位置,听不清就保留未知,不用语境顺口改成某一个数。
最后我会得到什么
拿到原结果、疑点和可回听位置;人工结论与模型输出分别保留,可重新核对。
正常时
录音与两路原结果都在,能把重要文字与回听位置对应起来时,交回可核对正文和疑点。
发现问题时
两路不一致、关键句可疑或只有一路成功时把文字标为待复核;可选解释不能覆盖原始结果。
入口不可用或证据不足时
原音或原始结果缺失时不从旧文档猜回证据;可选的补充解释不可用,也不影响已有本地识别结果。
从哪里开始
要求标出重要录音里的数字、否定句和双模型分歧供回听。
需要准备什么
- 要复核的原录音
- 姓名、金额、日期等重点(如有)
从开始到拿到结果
- 1
系统核对并处理
比较两路识别,将疑点连回原音时间;可听到的才据声音修正,不以流畅润色遮盖分歧。
- 2
交付与接续
正文和疑点清单并存;原音缺失或仍听不清时保留未知。
技术实现与依据
这里保留实现、关键条件、精确入口、历史记录和验证结果。
本地质量复核页、片段笔记绑定与比较门已实现;原始证据完整不等于文字真值关键规则与设计选择
静音出字和模板废话进入高风险复核。
空文本不再自动等于无语音。
主引擎失败会改变证据等级。
LLM 仲裁默认关闭;只有显式启用且 chunk 带 flags、needs_review 或低相似度时才触发。
仲裁只读结构化 audit 证据、不读音频,只写 merged audit / metrics;两路 raw ASR(自动语音识别) JSON 永不被它覆盖。
本地 Ollama 不可用或返回无效 JSON 时保留原始分歧和人工复核队列,基础转写不依赖它成功。
内容文件与回执不一致时 verified 自动失效。
阅读从 `*.strict.md` 开始,不让用户先钻进 raw JSON。
`*.strict.audit.md` / `.json` 解释两路分歧,`*.strict.review.json` 与长流程 `review.md` 把最值得回听的位置排成队列。
receipt(执行回执) 只核对路径、大小、SHA-256、语义声明和 bundle hash(内容指纹);关键姓名、数字和争议句仍必须回到原音频核听。
本模块用到的名词
- strict transcript(严格正文)
- `*.strict.md` 是给人先读的最终候选;其中的疑似和听不清标记不得被静默删掉。
- strict audit(严格审计)
- Markdown 便于阅读,JSON 便于机器处理;两者保存两路原文、分歧、规则命中、错误和选择依据。
- review projection(复核投影)
- `*.strict.review.json` 是单份严格结果的结构化队列;评测 / benchmark 的 `review.md` 再按 P0/P1/P2 汇总最值得人工复核的位置。
- objective outcome
- 只表达音频内容的客观状态,不混入执行和覆盖失败。
- indeterminate(无法确定)
- 当前证据不足,不能断言有语音或无语音。
- evidence receipt
- 列出六项严格内容制品的相对路径、大小、SHA-256、声明与 bundle hash(内容指纹);它不是签名、可信时间戳、文字真值或事实认证。
- review queue(复核队列)
- 按风险收集需要回听的句段,而不是让用户从头听完整录音。
- evidence-only arbitration(只读证据仲裁)
- 可选本地 LLM 只看不确定 chunk 的两路文字、相似度、规则和上下文,结论进入 audit / metrics;它不听音频、不改 raw,也不替代人工核听。
专业定义
先读正文,再点开值得回听的差异;数字、否定和实际声音一起核对,补充模型或可选 LLM 都不能替我改掉原始证据。
解决什么
解决流畅幻觉、空文本误判、双模型分歧被隐藏、结果文件被替换后仍显示通过,以及结构化回执被误当成外部真实性证明的问题。
当前怎样实现
- risk_rules.py 保留静音出字、异常重复、繁体与格式等风险;实际差异比较另保留小数点、正负号、否定与关键项,正常说出的“字幕”“点赞”不单独成为删除或改写理由。
- audit.py 汇总主/对照原始结果、错误和风险。
- audio_outcome.py 正交表达 execution、coverage、quality 和 objective outcome。
- strict_writer 分开写正文、audit、review、raw、客观结果和 receipt(执行回执);quality.review.json/html 再呈现上下文音频、时间和补充识别。复核失败只降低质量状态,不删除原正文、raw 或原审计。
- arbitration.py 从 `configs/models.yaml` 读取默认关闭的 `llm_arbitration`;启用时使用本地 `http://127.0.0.1:11434/api/chat`、主模型 `qwen-main-v1:latest`、fallback(后备路线) `qwen3.6-27b-256k:latest`、`uncertain_only` 与 `keep_alive=0`,仅传结构化分歧证据。 它不读取音频,不覆盖主转写与原审计;merged audit / metrics 只保存这份补充判断,响应无效不妨碍基础双 ASR(自动语音识别) 结果交付。
- 长音频 manifest(清单)/metrics 记录覆盖、身份和耗时;评测同时分开普通 CER、关键符号错误、静音出字、错误放行与复核负担,不能用整段高相似度掩盖金额或否定差异。
- metadata.py 与回执绑定输入、模型、六项严格内容制品、相对路径、大小、SHA-256 和 bundle hash(内容指纹)。
- 质量HTML只播放本地音频,SenseVoice仅在不是原两路且有复核片段时补听;笔记导出绑定该片段和审计哈希,不能误用于别的录音。复核失败、quality_result.needs_review=null或lexical_truth_verified=false均保持明确,不伪装为没有疑点。
执行流程
- 1
日常先打开 `outputs.final` 指向的 `*.strict.md`,阅读正文并保留其中的 `[疑似]` / `[听不清]` 标记。
- 2
遇到标记、关键姓名数字或争议句时,打开 `*.strict.audit.md` 或 `*.strict.audit.json`,比较主/对照原文、相似度、规则命中、错误和选择依据。
- 3
长音频只有在配置显式启用时,才把带 flags、needs_review 或低相似度的 chunk audit 送给本地 Ollama;调用在 ASR(自动语音识别) chunk 处理之后进行,`keep_alive=0` 让模型用完卸载。
- 4
把仲裁决定追加到 merged audit / metrics,同时保留两路 strict raw JSON;Ollama 失败、缺失或响应不可解析时不改写基础结果。
- 5
再读 `*.strict.review.json` 的结构化队列,按可用时间区间回到原音频逐项核听;评测 / benchmark 的聚合复核队列另看 `review.md`。
- 6
需要追查模型到底返回什么时,分别打开主引擎和对照引擎的两路 `*.raw.json`,不把 raw 直接当最终稿。
- 7
用 `*.strict.receipt.json` 复核六项内容制品的相对路径、字节数、SHA-256、引擎声明和 bundle hash(内容指纹);任何不一致都使 evidence unavailable,但一致仍不证明文字正确。
- 8
长音频继续读 `manifest.json` 的输入/模型/切片/每段状态和 `metrics.json` 的耗时、相似度、风险;有人工 truth 的评测再读 `benchmark.md` 与 `benchmark.json`。
- 9
只有执行、覆盖、质量和正式负向证据都闭合时才判断无语音;否则保持 indeterminate 或 speech_detected_but_not_transcribable。
边界
- SHA-256 一致只能证明字节未变,不能证明文字正确。
- verified 回执不能替代原音频和人工核听。
- Ollama 仲裁默认关闭;没有它时基础链必须稳定,启用它也不能把 LLM 偏好当成原始证据或最终真值。
- `keep_alive=0` 避免模型长期驻留 GPU;仲裁在 ASR(自动语音识别) chunk 完成后运行,不与两路 ASR(自动语音识别) 同时争抢资源。
- 低分、空文本和失败必须分别表达。
- 公开仓库不包含任何用户结果包。
失败与恢复
- 正文存在但主证据引擎失败
- 保留文本但标为 provisional,并列出 evidence failure。
- 正文出现 `[疑似]`
- 保留标记,按 audit 的两路原文和 review 时间/chunk 回听原音频;人工确认前不把候选润色成确定事实。
- 正文出现 `[听不清]`
- 查看两路 raw、执行错误和客观结果,再回听原音频;它表示当前不能可靠转写,不等于没有语音。
- 空文本且覆盖或执行不完整
- 返回 indeterminate,不宣称无语音。
- 回执引用的文件缺失、大小或指纹不符
- 证据状态降为 unavailable,要求重新生成或恢复。
- 两路模型对关键句冲突
- 保留两路原始输出、audit 依据和时间位置,进入人工回听;没有时间戳时按长音频 chunk 或原文上下文定位并保留未知。
- 显式启用仲裁但本地 Ollama 不可达或响应不是有效 JSON
- 只把该 chunk 的仲裁标为不可用或低置信,保留两路 raw、原 audit 与人工复核队列;不重启服务、不覆盖正文,也不让基础长音频任务失败。
真实入口
E:\Projects\Tools\ChineseASR\src\zh_asr\audit.py双模型审计与风险汇总
E:\Projects\Tools\ChineseASR\src\zh_asr\risk_rules.py幻觉和格式风险规则
E:\Projects\Tools\ChineseASR\src\zh_asr\audio_outcome.py执行、覆盖、质量和客观结果
E:\Projects\Tools\ChineseASR\src\zh_asr\strict_writer.pystrict 正文、audit、review、raw 与 receipt(执行回执) 成品写入
E:\Projects\Tools\ChineseASR\src\zh_asr\result_writer.py内容制品与 sidecar(侧车文件) 写入
E:\Projects\Tools\ChineseASR\src\zh_asr\metadata.py输入、模型和制品身份
E:\Projects\Tools\ChineseASR\src\zh_asr\benchmark.py人工 truth 对齐、指标与 benchmark/review 成品
E:\Projects\Tools\ChineseASR\src\zh_asr\arbitration.py默认关闭的本地 Ollama evidence-only 仲裁、结构化请求与失败回退
E:\Projects\Tools\ChineseASR\configs\models.yamlllm_arbitration、uncertain_only、模型、11434 与 keep_alive=0 配置
如何验证
- audit、risk rules、audio outcome、result writer 和 metadata(元数据) 单元测试包含在2026-08-31 的 345 项通过结果中。
- strict writer 与 benchmark 测试覆盖成品文件名、两路 raw、review 投影、静音出字、空文本、partial coverage、回执损坏、模型失败和 truth 对齐。
- test_arbitration.py 与 test_config.py 覆盖默认关闭、Ollama 主模型 qwen-main-v1:latest、fallback(后备路线) qwen3.6-27b-256k:latest、结构化请求、`uncertain_only`、`keep_alive=0`、有效 JSON 解析和无效响应回退;本轮没有调用真实 Ollama 模型。
- 没有任何自动测试能够代替关键片段人工核听,页面明确保留该缺口。
与其他模块的关系
模型、长音频和说话人模块产生的所有结果最终都经过本模块;可选 Ollama 只在长音频不确定 chunk 上增加一层不覆盖原证据的解释。模块向用户说明证据强度,但不负责决定真实人物、外部事实或最终文字真值。
