SuperAI Agent v0.2.32
SuperAI Agent v0.2.32
输入框新增语音输入:接入 TypeFree,说话即可把文字写进对话框。
新功能
-
对话框中的语音输入按钮:位于输入框工具栏「+」旁边。点击后开始说话,识别结果会插入到光标位置——因此在已经写了一半的消息中间口述,不会覆盖或打乱已输入的内容。录音过程中按钮下方会显示实时音量条:麦克风没声音和听到了但没内容,否则用户根本无从分辨。
-
未运行 TypeFree 时,按钮不会出现——不是灰掉,而是完全不显示。大多数用户并未安装 TypeFree,而一个「一直在、但通常点不动」的按钮比没有更糟。应用每 15 秒重新探测一次,因此后启动 TypeFree 也无需重启本应用。
实现说明
语音采集与识别由 TypeFree 负责,本应用只是控制与事件的客户端,二者通过本机回环(loopback)连接。这一拆分并非风格选择:TypeFree 的引擎依赖 Node 原生模块(sherpa-onnx-node、koffi),而本应用界面运行在 Tauri 的系统 WebView 中,无法加载它们。
关于安全:那个连接令牌能够打开用户的麦克风。用户访问的任意网页都可以连接 ws://127.0.0.1:<端口>——浏览器连接回环地址毫无阻碍——因此仅绑定回环只能挡住其他机器,挡不住本机上的其他软件。令牌保存在用户目录下权限为 0600 的文件中,WebView 无法读取;只有 Rust 侧的 typefree_bridge_info 命令能取到它,并且会校验文件中记录的进程仍然存活——否则 TypeFree 崩溃后残留的文件会让界面显示一个永远连不上的麦克风按钮。
两处容易出错、已经处理的地方
-
文字重复两遍:TypeFree 默认会把结果粘贴到当前焦点窗口。若不处理,对话框自己插入一次、TypeFree 再粘贴一次,每句话都会出现两遍。因此本应用发起的会话使用
output:'callback',在会话期间暂停粘贴注入,结束后恢复用户原本的设置。 -
光标位置插入:采用「在光标处拼接」而非追加或整体赋值,并且只在确实缺少空格的位置补一个空格,避免连续口述累积出多余空格。
验证情况
新增 7 项测试(光标插入:位置、不丢失已有文本、空格处理、空语音、越界光标);TypeFree 侧另有 22 项。按测试名与基线比对,无新增失败。
并且不止于类型检查:前端产物经过实际构建,并确认新代码确实存在于打包结果中(dist/assets 中可以找到 typefree_bridge_info 与相应错误文案)。本项目的一贯教训是——代码提交了不等于部署了。