为会议AI质量把关OpenOats 50单元测试与多语言WER基准测试实践【免费下载链接】OpenOatsA meeting note-taker that talks back.项目地址: https://gitcode.com/gh_mirrors/op/OpenOatsOpenOats 是一款跑在 Mac 上的本地会议 AI 记录工具它实时转写通话双方的语音并在关键时刻搜索你自己的笔记弹出值得说的观点。这类会议 AI 应用的质量取决于两件事——代码行为是否稳定和语音转写是否准确。OpenOats 用两套手段来把关一套是 48 个单元测试文件800 测试用例另一套是覆盖波兰语、西班牙语、法语、德语 4 种语言的WER词错误率基准测试。本文带你完整走一遍这套质量保障体系不涉及复杂代码新手也能看懂。为什么会议AI记录工具需要质量把关 想象一下转写把对方名字听错会议纪要就会记错人AI 在错误的时机弹出无关建议比不弹更尴尬。所以会议 AI的质量要同时守住两条线把关层守护对象手段代码质量状态机、存储、客户端不崩溃、不串数据单元测试swift test模型质量语音转写准确、多语言不吃亏WER 基准测试两层缺一不可代码写得再稳转写模型错了纪要照样是错的。50 单元测试文件是怎么组织的 测试目录48 个文件、800 测试用例全部单元测试集中在 OpenOats/Tests/OpenOatsTests/ 目录测试目标在 OpenOats/Package.swift 中声明。用例最密集的几组文件如下测试文件用例数守护内容SettingsStoreTests.swift98设置项的读写与默认值NotesControllerTests.swift61会议纪要生成控制器LiveSessionControllerTests.swift56实时会议会话状态流转SessionRepositoryTests.swift55会话数据持久化MeetingStateTests.swift55会议检测状态机MarkdownMeetingWriterTests.swift45Markdown 会议纪要输出格式TranscriptionBackendTests.swift36转写后端切换与行为OpenRouterClientTests.swift27云端大模型调用客户端覆盖面按职责划分设置与存储SettingsStore、SessionRepository、会议检测MeetingDetector、CameraActivityMonitor、转写管线TranscriptionEngine、StreamingTranscriptionSegmentQueue、WAVEncoder、笔记与知识库KnowledgeBase、NotesEngine、界面与引导WizardViewModel、RecommendationEngine。除了单元测试项目还有一层 UI 冒烟测试 UITests/OpenOatsUITests/SmokeTests.swift配合脚本 scripts/run_ui_smoke.sh 验证 App 能真实启动并渲染。一键运行全部单元测试在 macOSApple SiliconXcode 26 / Swift 6.2上只需两条命令cd OpenOats swift test测试用例长什么样举个例子以 BatchTextCleanerTests.swift 为例它验证批量文本清洗的两个关键行为按时间分块把 20 秒间隔的记录切成 150 秒一组的块验证 180 秒的记录正好被拆成 2 块查看断言LLM 响应解析当大模型返回的行数和原始记录对不上时必须安全地返回空而不是错位清洗——这是防止纪要张冠李戴的关键防线。这种输入→预期输出的写法就是单元测试的全部精髓不需要懂架构也能读懂。WER 是什么衡量转写准确率的那把尺子 WERWord Error Rate词错误率是语音识别领域最通用的指标计算方式很直白WER 把识别结果修正成参考文本所需的最少词级操作数 ÷ 参考文本总词数比如参考文本有 10 个词识别错 2 个词WER 就是 20%。配套还有CER字符错误率按字符统计对波兰语这类词很长、一词多义的语言更敏感。OpenOats 的基准测试刻意选了 4 种非英语语言波兰语、西班牙语、法语、德语——多语言恰恰是转写最难的场景也最贴近真实国际会议。多语言 WER 基准测试4 语言 × 8 样本 × 3 模型 样本集与参考文本基准数据全部放在 benchmark/ 目录benchmark/samples.json8 条多语言音频样本每种语言 2 条源自 MLS 有声书朗读语料并附带人工整理的参考转写文本benchmark/audio/音频文件同时提供.opus小体积和.wav测试用两种格式。一键运行基准脚本benchmark/run_benchmark.py 的完整流程依次加载large-v3-turbo、small、base三个 Whisper 模型与 App 内的模型档位一一对应对每条音频执行转写并记录耗时对参考文本和识别结果做统一归一化转小写、去标点、合并空白保证比较公平计算每条样本的 WER / CER最后输出按模型、按语言的汇总表结果落盘到 benchmark/results.json。cd benchmark python3 run_benchmark.py实测结果模型档位直接决定准确率从 benchmark/results.json 汇总的 4 语言平均 WER模型档位波兰语西班牙语法语德语总体平均large-v3-turbo1.3%1.2%1.6%6.3%2.6%small7.9%2.8%12.7%8.4%8.0%base18.4%15.0%23.1%20.5%19.3%几个结论turbo 比 small 准确 2~3 倍法语上从 12.7% 降到 1.6%差距悬殊base 档基本不可用于会议场景19.3% 意味着平均每 5 个词错 1 个纪要不可读德语是 turbo 的短板6.3%翻查 results.json 里的ref/hyp对比字段可以发现主要来自变音符号 ü 被识别成 u 这一类错误——基准结果保留了首 80 字符的对照文本让错误归因几乎零成本。Swift 版 CoreML 基准还原真实设备上的执行 Python 脚本用的是 PyTorch 版 Whisper而 App 实际运行在WhisperKit CoreMLApple 芯片加速上。为了验证设备上的真实表现项目又用 Swift 写了第二套基准 OpenOats/Sources/Benchmark/main.swift与 Python 版共用同一份samples.json参考文本保证结果可横向对比。它有两个亮点设计分块流式模式--chunked参数把音频切成 5 秒或 10 秒一段再逐段转写模拟实时转写的刷写节奏并输出 5s vs 10s 的 WER 差值按语言细分——直接回答实时模式会不会比离线整段转写更不准统一音频预处理自动重采样为 16kHz 单声道消除格式差异带来的干扰。cd OpenOats swift run Benchmark # 整段转写基线 swift run Benchmark --chunked # 5s vs 10s 流式模拟给开发者的 3 条可复用经验 双层质量网单元测试管代码不崩模型基准管机器不说错话。AI 应用只做其中一层都是半拉子工程固定样本集 版本化参考文本样本和参考文本都提交进仓库benchmark/samples.json任何人、任何时间重跑都能得到可对比的数字这是基准二字的意义所在保留原始对照数据结果文件里同时存下参考与识别文本的片段出错时一眼定位而不是只看一个冷冰冰的百分比。小结OpenOats 的质量故事很朴素用 48 个测试文件800 用例锁住代码行为用 4 语言 8 样本的 WER 基准锁定转写质量再用 Swift CoreML 版基准还原真实设备的流式表现。对普通用户来说这套体系的意义只有一句话——你看到的每一条实时字幕和每一次 AI 提示背后都跑过数字。相关模块速查单元测试目录OpenOats/Tests/OpenOatsTests/基准数据与脚本benchmark/CoreML 基准源码OpenOats/Sources/Benchmark/main.swift转写引擎实现OpenOats/Sources/OpenOats/Transcription/【免费下载链接】OpenOatsA meeting note-taker that talks back.项目地址: https://gitcode.com/gh_mirrors/op/OpenOats创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?