Repository navigation
feat: 搜索框语音输入(macOS 离线听写);以声搜声按实测不上 - #7
Merged
Merged
Conversation
查询 ↔ 片段向量(8 帧 + 音轨联合编码):top-1 3/12,正例 z 0.20–2.71 vs 负例 z 最高 3.34, 画面主导联合向量,声音被淹没;查询 ↔ 纯音频向量:top-1 8/12,正例最低余弦 0.917 < 非目标最高 0.959(粉噪对瀑布 0.947)。两路都标不出'没有明显匹配就直说'的门槛, 按产品原则不上(脚本留作证据与复测入口)。
语音 → 文字 → 正常文字搜索(直接拿语音向量搜索实测不可靠:中文失败、门槛不可分)。 转写走 macOS 26+ 的 SpeechAnalyzer(vixel-speech 辅助程序,swiftc 构建产物不进 git): 模型是系统组件、全程本机运行、文件输入无需语音识别授权;模型未下载时不代下载, 界面指引去系统设置。实测合成查询 zh CER 6.4%(3/47 同音字错)、en WER 0%,单条 < 0.5 s。 引擎取舍:Embed2ASR(EG2 音频塔 + GRU-CTC reader,Apache-2.0)需要 pooling 前的 hidden states,LiteRT-LM C API 只给池化向量,跑不了;其公布中文 CER 15.6% 也不达标。 Windows / 网页版暂不提供(无达标离线引擎;Web Speech API 上传音频,违背离线承诺)。 渲染进程 getUserMedia 录音(≤15 s,电平表,Esc 取消)→ 16 kHz WAV 经 IPC 到主进程。 打包:mac extraResources + NSMicrophoneUsageDescription + audio-input entitlement。
RGB-loop
force-pushed
the
feat-voice-search
branch
from
October 17, 2026 17:29
5880b04 to
451c366
Compare
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
做了什么
搜索框语音输入(macOS 桌面版):点麦克风说一句话,离线转写成文字进搜索框(可编辑),随后走正常文字搜索。遵循实测结论(2026-10-17 probe):语音不直接编码成向量去搜,而是 语音 → 文字 → 文字搜索。
以声搜声:这次不上(量化证据见下)。
转写引擎选择(按证据)
候选 A:Embed2ASR(EG2 音频塔 + 9.66M GRU-CTC reader,Apache-2.0)— 否
候选 B:macOS 系统离线听写(SpeechAnalyzer,macOS 26+)— 采用
com.apple.security.device.audio-input+NSMicrophoneUsageDescription已加)。转写质量(20 条合成短查询:
say -v Tingting/-v Samantha→ 16 kHz mono WAV,经打包用的 vixel-speech 实测)语音搜索 vs 打字搜索 top-1 一致性(demo 库拷贝)
footage 库 17/20、照片 demo 库 19/20(合计 36/40)。4 处不一致里 2 处是转写同音字造成(狗→走、和→河),2 处是句末标点让边界查询在相关性门槛两侧翻转("a dog barking" vs "A dog barking.")——门槛边缘的固有抖动,不是语音链路问题。
没上的平台(诚实说明)
voice.status恒不可用)。原任务书里"HTTPS 下才有麦克风"的提示因此暂不适用——根本没有可用引擎时给个"需要 HTTPS"的提示反而误导。以声搜声:不上,证据如下
标定脚本
scripts/audio-search-eval.cjs(已入库,可复测):12 个正例 = footage 有音轨片子在 37% 时长处另截的 8 s 音频;负例 = 正弦/粉噪/中英文语音 + 跨库查询。两路都标不出"没有明显匹配就直说"的门槛——上了只会自信地给错结果,与产品原则(库里没有的直说)冲突。EG2 音频嵌入空间对环境声过于紧致;换更有判别力的音频模型后可用该脚本复评。
验证
npm run typecheck✅npm test✅(365 通过,新增 pcm 纯函数单测)npm run test:db✅tsc -p tsconfig.server.json✅(接口契约测试锁定 voice.* 为 desktop-only)--user-data-dir指向 demo data 拷贝)CDP 实测端到端:voice.status→ 麦克风按钮渲染 → 以 WAV 字节代替实时麦克风走window.api.voice.transcribeIPC(zh_1.wav → "海边的日落")→ 文字进搜索框触发正常搜索。复现方法:npm run dev -- -- --user-data-dir=<数据拷贝> --remote-debugging-port=9223,在渲染进程里window.api.voice.transcribe(bytes)。npm run build && npm run package✅;sh scripts/packaged-video-check.sh→videos=3 segments=4 OK(视频索引不受影响);包内Resources/speech/vixel-speech可转写、NSMicrophoneUsageDescription与audio-inputentitlement 均在、ad-hoc 签名校验通过。风险 / 边界
say合成语音差;同音字错误(约 6% 字错率)落在搜索框里可见可改,这正是不用"语音直搜向量"的原因。SpeechTranscriber.supportedLocales是系统框架调用,与系统听写同源;应用自身零网络请求(渲染进程网络白名单未变)。