MagicFrog 在桌面应用与 web 应用上都支持语音输入与语音回复。语音链路从不离开你的基础设施:识别与合成在设备上、或在你配置的自部署端点上运行,并且代码库里有一条静态测试,强制任何第三方语音云都进不了这条链路。
语音输入(听写)
听写捕获你的麦克风,并把它变成 composer 里的文字。
- 两种捕获模式。
hold一直录音直到你停止;endpoint在页面测得的静音间隙(约 1.2 秒)之后自动结束一句话。 - **你自己的识别器。**音频发送到说 OpenAI-audio 请求形状的自部署转写端点——whisper.cpp server、faster-whisper、LocalAI 等本地服务器开箱即用。默认端点是 loopback(
http://127.0.0.1:8080)。 - **语言与模型提示。**可以设置主语言子标签(例如
zh或en);省略模型则让端点用自己的默认值。 - **有界且可取消。**请求有时间盒,响应大小有上限,卡死的服务端挂不住 composer。
浏览器云识别器(SpeechRecognition API 一族)被刻意弃用——它们会把音频流式发给浏览器厂商的云,而零外部 SaaS 契约禁止这样做。

图为网页端 Settings → Preferences 页面的真实 Voice 分区:语音引擎选择、转写端点与听写语言设置。
语音回复(text-to-speech)
agent 回复可以被读出来,有全局开关与按会话覆盖(按会话记录的值胜过全局值)。
两个合成引擎,都在同一边界之内:
- 系统语音——设备上的
speechSynthesis语音,过滤为没有网络跳数的本地 OS 语音。 - 自部署端点——你自己运行的合成服务,同样说 OpenAI-audio 形状(默认 loopback
http://127.0.0.1:8000)。
长回复分块朗读,播放因此快速开始;字幕显示正在读的内容;每条消息至多播报一次——流式更新或恢复标签页都不会导致重复朗读。
桌面与 web
同一功能跑在两种宿主里:
| 能力 | 桌面(Electron) | Web(浏览器) |
|---|---|---|
| 麦克风捕获 | 是 | 是(getUserMedia + MediaRecorder) |
| 系统语音播放 | 是 | 是(speechSynthesis) |
loopback http:// 端点 |
允许 | http:// 源上允许;https:// 页面上提前拒绝(混合内容) |
web 宿主会提前检查能力,在安全页面上于你录音之前就拒绝 http loopback 端点,而不是录到一半才失败。
免提对话
语音会话表单是一段连续对话:状态机在 listening → thinking → speaking 之间流转,带静音控件与滚动更新的对话记录。
与 barge-in 设计有一个刻意的不同:因为转写在你自己的端点上「先录音、后转写」,播放期间麦克风保持关闭。播放结束后有约 0.6 秒的回声守卫才重新打开——助手永远不会听见它自己。
隐私边界
语音链路里没有任何地方指向第三方语音云。引擎只允许触达用户自己的 loopback 或自部署端点以及设备上的语音栈;一条静态测试扫描每个语音模块源文件中的第三方语音主机与云识别器标识——任何新的云依赖都会让构建的测试运行失败。
语音设置按应用安装本地持久化:听写语言、两个端点与模型、合成引擎、全局朗读回复开关,以及按会话覆盖。