人工智能AI 应用桌面应用交互助手【免费下载链接】ClawXClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://clawx.com.cn.项目地址https://gitcode.com/gh_mirrors/cl/ClawX点击查看免费下载导读本文围绕 ClawX 语音听写Voice Dictation / Speech-to-Text功能的协议扩展展开讲解如何以AsrConfig.protocol为开关同时支持 OpenAI Audio Transcriptionsmultipart 上传与 OpenAI Chat CompletionsJSON 请求体内嵌input_audio两套线上协议并为后者内置阿里云百炼Alibaba Cloud Model Studio / bailian与自定义端点两类预设。读完本文你将掌握两套协议的请求构造差异、input_audio的两种编码方言、协议维度的预设体系、设置界面的交互规则以及主进程/渲染进程的职责边界与配套测试验证方法。背景与动机为什么需要第二条协议流式 ASR 没有统一线上协议——各家厂商讯飞、Deepgram、AssemblyAI、腾讯各自定义 WebSocket 方言而 OpenAI 的POST {baseUrl}/audio/transcriptions已成为事实标准被 OpenAI、Groq、SiliconFlow、DeepInfra、Fireworks 以及 whisper.cpp、LocalAI 等本地服务共同采纳见 voice-dictation.md。因此 ClawX 采用批量转写而非流式本地录音、停止后上传一个 WAV 文件、插入返回文本。在此基础上add-asr-chat-protocol.md 定义了第二条通道OpenAI Chat Completionsinput_audio协议。它走 JSON 请求体而不是 multipart让语音识别服务以聊天补全的形式返回转写文本并借此接入阿里云百炼的 OpenAI 兼容 ASR 接口模型qwen3-asr-flash。两条协议由配置中的protocol字段选择老配置缺省回退到transcriptions实现平滑升级。核心配置模型AsrConfig 与协议归一化AsrConfig在 shared/host-api/contract.ts 中定义是一个单端点配置文件非多账号结构export type AsrPreset openai | groq | siliconflow | bailian | custom; export type AsrProtocol transcriptions | chat; export type AsrConfig { preset: AsrPreset; protocol?: AsrProtocol; // 可选缺省按 transcriptions 处理 baseUrl: string; model: string; language?: string; // 仅 transcriptions 协议使用ISO-639-1 };关键设计在于protocol是可选字段老版本存储的配置没有该字段依然能按transcriptions正常工作。这一兼容性由 shared/asr/presets.ts 中的normalizeAsrProtocol保证——任何非chat的值包括undefined、空串、未知值都归一化为transcriptionsexport function normalizeAsrProtocol(protocol: unknown): AsrProtocol { return protocol chat ? chat : transcriptions; }归一化在主进程完成normalizeAsrProtocol被asr-client.ts与设置表单共用存储的旧配置无需迁移即可继续使用原/audio/transcriptions端点。两套协议的请求构造对比请求分支完全发生在主进程的 electron/services/asr/asr-client.ts 中渲染进程始终只调用hostApi.asr.transcribe(wav)从不感知协议差异。transcriptionsmultipart 表单const form new FormData(); form.append(file, new Blob([new Uint8Array(wav)], { type: audio/wav }), recording.wav); form.append(model, config.model); const language config.language?.trim(); if (language) { form.append(language, language); }文件字段固定为recording.wav、audio/wav内容为 16 kHz 单声道 PCM16由渲染端ScriptProcessorNode重采样并编码见 voice-dictation.md。language仅在非空时追加如zh、en留空时整个字段被省略由服务端自动检测。端点拼接有两条规则标准预设openai/groq/siliconflow在 baseUrl 后追加/audio/transcriptionscustom预设把用户输入的 URL 当作完整端点直接请求因为自定义服务可能暴露非标准路径baseUrl.replace(/\/$/, )只去除尾部斜杠见 asr-client.ts。响应读取{ text }字段trim 后返回。chatJSON 请求体 input_audioconst inputAudio config.preset bailian ? { data: data:audio/wav;base64,${base64Wav} } : { data: base64Wav, format: wav }; const payload { model: config.model, stream: false, messages: [ { role: user, content: [ { type: input_audio, input_audio: inputAudio }, ], }, ], };实际发出的请求等价于{ model: qwen3-asr-flash, stream: false, messages: [ { role: user, content: [ { type: input_audio, input_audio: { data: data:audio/wav;base64,base64 编码的 WAV } } ] } ] }端点为{baseUrl}/chat/completionschat 协议下输入的 URL永远是 baseUrl/chat/completions由客户端追加对应单元测试 asr-client.test.ts 验证了去除尾斜杠后再追加的行为。Content-Type: application/jsonAuthorization: Bearer apiKey。转写文本从choices[0].message.content读取可能是字符串也可能是文本 part 数组按part.text拼接由 extractChatContent 处理choices为空、message缺失或content为空串时统一抛出EMPTY_RESULT。input_audio 方言百炼 Data URI 与 OpenAI 原生 schema同一份 JSON 请求体input_audio的编码因预设而异——这是本次协议扩展最核心的细节预设input_audio结构format字段bailian阿里云百炼{ data: data:audio/wav;base64,base64 }Data URI 方言无其余custom 自定义端点{ data: 裸 base64, format: wav }OpenAI 原生 schemaformat: wav代码注释点明了原因Alibaba Cloud Model Studio only accepts its Data-URI dialect; other (custom) endpoints follow OpenAIs input_audio schemaasr-client.ts。设置表单在选中bailian时也会显示对应的本地化提示——百炼 API 要求input_audio使用 Data URI 而非裸 Base64ClawX 会自动适配并附带指向阿里云 OpenAI 兼容 ASR 指南的内联文档链接见 AsrSettings.tsx 与 settings.json。两种方言均使用stream: false且不发送任何厂商扩展字段如asr_options保证请求体最小化、可移植。协议维度的 Provider 预设体系预设列表按协议划分定义在 shared/asr/presets.tsexport const ASR_PROTOCOLS: readonly AsrProtocol[] [transcriptions, chat] as const; export const ASR_PRESETS_BY_PROTOCOL: RecordAsrProtocol, readonly AsrPreset[] { transcriptions: [openai, groq, siliconflow, custom], chat: [bailian, custom], };各预设的默认 baseUrl 与模型ASR_PRESET_DEFAULTS协议预设默认 baseUrl默认模型transcriptionsopenaihttps://api.openai.com/v1whisper-1transcriptionsgroqhttps://api.groq.com/openai/v1whisper-large-v3transcriptionssiliconflowhttps://api.siliconflow.cn/v1Qwen/Qwen3-ASR-1.7Bchatbailianhttps://WorkspaceId.cn-beijing.maas.aliyuncs.com/compatible-mode/v1qwen3-asr-flash两者custom空空bailian的 baseUrl 含WorkspaceId占位符用户需替换为自己的百炼工作空间 ID并按需调整地域域名默认北京cn-beijing。表单会额外显示一条占位符/地域提示AsrSettings.tsx。选择预设或切换协议会用默认值覆盖baseUrl 与 modelhandleProtocolChange/handlePresetChange见 AsrSettings.tsx因此顺序是先选协议再选预设最后微调地址与模型。设置界面交互协议选择器与动态表单设置入口位于Models → Speech-to-text需先开启开发者模式模式关闭时组件与麦克风按钮均不渲染。表单实现见 src/components/settings/AsrSettings.tsx核心交互规则如下API 类型protocol选择器提供OpenAI Audio Transcriptions与OpenAI Chat Completions两个选项i18n 文案见 settings.json。切换类型会重置预设列表并预填第一个预设的 baseUrl 与模型。Providerpreset选择器按协议过滤ASR_PRESETS_BY_PROTOCOL[protocol]决定可选项。切换协议后预设立即重置为当前协议的第一个预设。/audio/transcriptions后缀仅当协议为 transcriptions且预设为标准预设openai/groq/siliconflow时Base URL 输入框右侧渲染一个不可编辑的后缀标签/audio/transcriptionscustom 预设与 chat 协议下该后缀被隐藏AsrSettings.tsx。语言选择仅 transcriptions 协议显示zh/en/ 自动检测chat 协议下整个语言选择器被隐藏protocol chat ? null : ...。百炼专属提示选中 bailian 时API 类型与 Provider 选择器共享同一行下方依次渲染 Data URI 要求提示含内联文档链接与WorkspaceId占位符/地域提示。获取 API Key 链接仅 siliconflow 与 bailian 两个预设显示 provider 控制台链接AsrSettings.tsx点击通过hostApi.shell.openExternal打开。保存校验baseUrl 必须以http://或https://开头、model 非空否则本地 toast 报错invalidBaseUrl/modelRequired。保存时AsrConfig仅包含{ preset, protocol, baseUrl, model }language只在 transcriptions 协议且非空时才写入。共享的请求基础设施与错误码体系两条协议共用同一套主进程请求底座保证行为一致30 秒超时ASR_REQUEST_TIMEOUT_MS 30_000通过AbortController实现asr-client.tsfetch 自身失败统一映射为NETWORK。Bearer 鉴权Authorization: Bearer apiKey。HTTP 状态 → 错误码映射assertResponseOkHTTP 状态错误码401 / 403AUTH429RATE_LIMITED≥ 500SERVER其他REQUEST附带响应前 200 字符片段空结果即业务错误两条协议在返回空/缺失文本时都抛出EMPTY_RESULT而不是当作成功。错误码跨进程传递Electron 会把主进程抛出的错误拍平为字符串因此 ASR 错误序列化为ASR:CODE:message格式由渲染端parseAsrErrorCodeshared/asr/errors.ts解析回错误码全部 8 个码INVALID_INPUT、NOT_CONFIGURED、AUTH、RATE_LIMITED、SERVER、REQUEST、NETWORK、EMPTY_RESULT在设置表单与输入框 toast 中都有对应 i18n 文案REQUEST作为兜底。配置校验validateAsrConfigasr-client.ts在两个协议下统一执行preset 必须存在于ASR_PRESET_DEFAULTS、protocol 只能是已知值、baseUrl 必须是非空且 http(s) 的合法 URL、model 非空违者抛出INVALID_INPUT。配置与密钥的持久化配置与密钥分开存储electron/services/asr/config-store.ts配置写入独立的 electron-store 文件clawx-asr键为asrConfig含protocol字段AsrConfig完整落盘。API Key复用 provider 密钥库secret store固定账号 id 为asr。空字符串调用deleteProviderSecret清除密钥undefined则完全不触碰实现留空保持原 Key的语义。密钥不透出渲染进程getConfig只返回{ configured, config, hasApiKey }渲染端永远看不到明文 KeysaveConfig校验通过后先写配置、再可选写密钥最后返回就绪状态electron/services/asr-api.ts。所有 ASR 配置不会推送到 OpenClaw 网关属于纯本地桌面侧能力。架构边界与安全设计本次协议扩展严守主/渲染进程边界对应 add-asr-chat-protocol.md 中的renderer-main-boundary规则协议分支只存在于主进程asr客户端渲染进程继续使用hostApi.asr.transcribe携带相同 WAV 载荷从不构建协议相关请求。渲染进程不直接 fetch 外部端点所有出站请求由主进程asr模块经 host-invoke 注册表发出getConfig/saveConfig/transcribe见 asr-api.ts。transcribe的载荷校验WAV 必须是Uint8Array且byteLength 44RIFF 头最小长度MIN_WAV_BYTES未配置缺配置或缺 Key时抛出NOT_CONFIGURED。录音侧同理getUserMedia采集、重采样、PCM16 编码、RIFF 头封装全部发生在渲染端麦克风权限状态由主进程getMicrophoneAccess读取被拒时打开系统设置指引。测试验证矩阵仓库为本次协议扩展配备了从单元到 E2E 的完整验证见 add-asr-chat-protocol.md 的requiredTests主进程客户端单测tests/unit/asr-client.test.tsstubfetch验证 chat 请求体形状bailian Data URI vs custom 裸 base64 format: wav、/chat/completions尾斜杠拼接、文本数组 content 拼接、空 choices/空白 content →EMPTY_RESULT、HTTP 状态码映射、validateAsrConfig对未知 preset/protocol、非法 URL、空 model 的拒绝。设置表单组件测试tests/unit/asr-settings.test.tsx覆盖协议切换、预设重置、保存载荷中protocol的写入、language 按协议条件写入。E2E 测试tests/e2e/voice-dictation.spec.ts通过installIpcMocks模拟asr宿主动作、以 oscillator 音频流 stubgetUserMedia覆盖光标处插入的 happy path、未配置引导路径以及协议选择器与 bailian 预填麦克风始终被 mock属普通并行用例。i18n 校验全部新增用户可见文案在 en、zh、ja、ru 四种语言中同步i18n-locale-parity.test.ts守护。总结add-asr-chat-protocol以协议选择器 协议作用域预设的方式为 ClawX 语音听写注入第二条主流线上通道一条 JSON 化、支持input_audio的 Chat Completions 协议并以方言自适配的方式同时服务阿里云百炼与 OpenAI 兼容端点。它保持了三项关键不变量——旧配置无缝回退、主进程独占协议分支、错误处理跨协议统一——为后续接入更多 ASR 厂商预留了清晰的扩展点。深入阅读 voice-dictation.md 可了解完整的录音管线与权限设计直接在Models → Speech-to-text页面即可体验两种 API 类型的切换与百炼预设的自动填充。赞分享人工智能AI 应用桌面应用交互助手【免费下载链接】ClawXClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://clawx.com.cn.项目地址https://gitcode.com/gh_mirrors/cl/ClawX点击查看免费下载相关推荐AIRI 接入阿里云百炼 CosyVoice 语音合成从 API Key 到全链路配置实战AIRI 接入阿里云百炼 CosyVoice 语音合成从 API Key 到全链路配置实战 本文是 AIRI 语音合成Text to Speech提供者配AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染GetQzonehistory3 步完整备份 QQ 空间全部历史说说GetQzonehistory3 步完整备份 QQ 空间全部历史说说 账号一封平台上的记录说没就没了。GetQzonehistory 是本地 QQ 空间备份网页爬虫数据分析IronClaw OpenAI 兼容接入层深度解析Chat Completions / Responses 线协议、路由描述符与幂等设计ironclaw_openai_compatIronClaw OpenAI 兼容接入层深度解析Chat Completions / Responses 线协议、路由描述符与幂等设计ironclaw_o人工智能AI 应用交互助手AI Agent上一篇终极网络工具箱MooTool的6个必备网络调试功能完整指南下一篇vanilla-extract/integration 集成层源码解析构建工具如何把 .css.ts 编译为零运行时 CSS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
