feat(chat): 输入栏增加 Web Speech API 语音输入#276
Conversation
桌面 GUI 与桌面浏览器 WebUI 在 Composer 工具栏提供麦克风按钮, 识别结果写入输入框(不自动发送)。手机端 WebUI 不展示内置语音按钮, 优先使用系统输入法语音。
Code Review 意见先说结论:方向和工程规范(双端镜像同步、CI、测试计划)都不错,但存在 1 个高频触发的正确性 bug 和 1 个对现有功能的回归,以及桌面 GUI 端实际可用性的疑问,建议修复/澄清后再合入。 P1 · 自动重启后文本重复(必须修)引擎在说话停顿后会触发 复现:开始听写 → 说 "world" → 停顿几秒(Chrome continuous 模式下必然 end/restart)→ 再说 "again",输入框会变成 修复方向:hook 内部区分首次 start 与 auto-restart,重启时不重放 P2 · 听写会打平输入框中的富文本结构(回归)
P3 · 平台实际可用性与描述不符(请作者澄清)
P4 · 小问题
做得好的地方:GUI/WebUI 双端镜像完全一致并更新了 mirror-manifest;识别结果不自动发送;错误码→i18n 映射、CJK 拼接不加空格、卸载清理、输入禁用时自动停止都考虑到了。 |
|
已根据本轮 Code Review 更新,最新提交:
说明:当前没有实体 Mac 做端到端录音验证;macOS 修复基于 Tauri/Wry 的权限配置,并由配置测试和双端构建验证。运行时仍会按 WebView 是否实际暴露 SpeechRecognition 做能力门控。 |
摘要
SpeechRecognition/webkitSpeechRecognition)。浏览器或操作系统可能调用远程识别服务,不承诺音频仅在本地处理。lib/voice实现,并保持 mirror-manifest 同步。实现说明
lib/voice:Web Speech API 封装、可测试的 recognition session controller 与useSpeechInputhook。onStart,已提交文本在 pause/end 重启后继续累积;致命错误不会无限重启。NSMicrophoneUsageDescription、NSSpeechRecognitionUsageDescription与com.apple.security.device.audio-inputentitlement,开发/发布配置均启用 hardened runtime entitlement。已知限制
http://<内网 IP>访问属于 insecure context,内置语音入口不可用;需使用 HTTPS/localhost。测试
pnpm buildpnpm buildnode scripts/check-mirror.mjs