跳转至

语音输入

转录会编辑编辑器草稿,但不会提交智能体回合。音频是临时的客户端输入,只有正常的消息提交才会将生成的文本发送给智能体。移动端默认使用设备端转录。将音频发送到设备之外需要明确的授权,该授权需指定一个环境;对于云端转录,还需指定一个提供商。

共享控制器 负责整个操作,而客户端提供采集与转录功能。准备阶段会将转录器和解析后的 locale 绑定到整个录音过程。草稿所有权、文本和修订版本都会在录音之前捕获,并在插入之前检查,因此迟到的转录结果不会覆盖已被编辑或替换的草稿。转录器可以暴露流式会话;在这种情况下,音频会在采集期间离开设备,并由 finish 取代基于文件的 transcribe 方式。

音频可能去往何处

在移动端,设备端转录不需要音频授权。环境转录和云端转录共用一个录音器,并且只上传已完成的录音。客户端将授权保存在设备绑定的安全存储中,不纳入偏好设置备份,并在原生解码之后、上传之前重新检查该授权。

Web 授权 位于偏好设置快照之外,这样另一个窗口保存无关设置时,不能让已被撤销的授权重新生效。每个新选择都会获得一个独立的授权,即使之前已经选择过该目的地。Web 钩子 将控制器绑定到该授权以及所选环境的连接。它要求 voiceTranscription 使用该环境的模型,或要求 cloudVoiceTranscription 将音频转发到指定的提供商。更改授权,或失去连接、权限或所需能力,都会同时丢弃当前活动录音以及为重试而保留的任何录音。它绝不会选择回退目的地。设置页面的转录测试使用同一个钩子。麦克风回环测试会单独采集音频用于本地播放,并且不会发送任何内容。传输层拒绝重定向,因此凭据和音频不会跟着重定向到另一个主机。

转录清理需要自己的授权,默认关闭。它只发送文本,绝不发送音频,将其发送到草稿所在环境的文本生成模型,因为它的凭据就在那里。

云端目标同时绑定转发环境和指定提供商。它使用独立的、仅批处理的端点:更换服务器密钥无法升级环境本地授权,云端录音也绝不使用流式 socket,也不会回退到其他提供商或环境的原生模型。

OpenRouter 会路由到许多上游,因此其授权也指明确切的模型,并且模型会作为查询参数随每次上传一起传输。服务器只接受存在于 OpenRouter 公开的符合 ZDR 资格的转录目录中的 id;该目录在成功读取后会缓存十分钟;诸如 openrouter/auto 或 :nitro 之类的路由别名在那之前就会因 schema 校验失败。请求会设置 provider.zdr,并且不携带 models 回退列表。OpenRouter 在选择端点时会应用账户的安全保留策略。目录不保存任何凭据或同意状态,这就是它可以被缓存而密钥是否存在则需在每次请求时重新读取的原因。

服务端

语音服务 在子进程中运行 transcribe-cpp,这样卡住的原生调用可以在不使服务器宕机的情况下被终止;关于打包限制(Node SEA、Electron ASAR),请参阅 native.ts。一次只运行一个原生请求。批量上传会在 shared/speech.ts 中定义的正文帧中携带其选项;流式传输则在 socket 的第一条命令中发送这些选项。模型文件与所选模型、硬件放置位置和卸载超时都是服务器设置中的环境状态。

Silero 静音检测器是可选的。如果其下载失败,在重试冷却期间,录音将使用原始音频,这样检测器故障就不会阻塞听写。显式安装语音模型时,也会无等待地重试检测器。

取消与资源所有权

取消操作会立即使结果失效,但资源仍会被持有,直到底层工作完成。Apple 的原生转录调用一旦启动就无法中断。在中止信号触发时释放会话或删除其录音,会与该工作发生竞态。转录契约 因此要求实现只能在其工作停止后完成;Apple 绑定 会在原生调用之间检查取消状态,并丢弃迟到的结果。在服务端,中断批量请求则改为终止 worker 进程;下一个请求会重新加载模型。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 t3/t3code