openclaw-cn 语音消息转写实战:Deepgram 音频转写(tools.media.audio)接入与配置详解
人工智能AI Agent即时通讯后端本地部署语音【免费下载链接】openclaw-cn中文社区版OpenClaw同原版保持定期更新已内置钉钉、企业微信、飞书、QQ、微信以及国内网络环境优化。你的专属个人AI助手。支持所有操作系统和平台。项目地址https://gitcode.com/gh_mirrors/op/openclaw-cn点击查看免费下载本文是 openclaw-cn中文社区版 OpenClaw / Clawdbot项目中 Deepgram 语音转写Speech-to-Text功能的完整接入指南。它讲解如何通过tools.media.audio配置把收到的语音消息上传到 Deepgram 并转成文字、注入回复管道同时结合 Deepgram 实现源码、配置类型定义 与 测试用例带你理解从收到音频到LLM 拿到转写文本的完整链路。读完本文你将能独立完成 API 密钥配置、模型与语言参数调优、代理端点覆盖以及多模型回退等实战配置。Deepgram 在 openclaw-cn 中的角色接收语音消息的转写引擎Deepgram 是一个语音转文字Speech-to-TextAPI 服务。在 openclaw-cn 中它被注册为媒体理解Media Understanding体系下的一个音频转写供应商通过tools.media.audio配置生效专门负责接收侧inbound的音频/语音消息转写——也就是别人发来的语音条、音频文件而不是助手自己生成的语音。其工作模式是收到带音频附件的消息后定位第一个音频附件本地路径或 URL必要时先下载把音频文件通过POST上传到 Deepgram 的预录音转写端点将转写结果以{{Transcript}}模板变量与[Audio]块的形式注入回复管道供后续的 LLM 与命令解析使用。需要特别强调的是这不是流式转写。仓库中的 Deepgram 供应商实现调用的是预录音prerecorded转写接口一次上传、一次返回全文不会输出实时中间结果。从源码看Deepgram 供应商在 媒体理解供应商注册表 中以deepgram为 id 注册能力capabilities仅声明为[audio]对应实现见 deepgram/index.tsexport const deepgramProvider: MediaUnderstandingProvider { id: deepgram, capabilities: [audio], transcribeAudio: transcribeDeepgramAudio, };快速开始两步启用 Deepgram 音频转写第 1 步设置 API 密钥Deepgram 采用最简单的环境变量方式即可完成认证。在环境或配置加载处设置DEEPGRAM_API_KEYdg_...从 model-auth.ts 的供应商密钥映射 可以看到deepgram供应商对应的环境变量就是DEEPGRAM_API_KEY。仓库的 live 测试 audio.live.test.ts 也直接通过process.env.DEEPGRAM_API_KEY读取密钥并支持用DEEPGRAM_MODEL、DEEPGRAM_BASE_URL环境变量覆盖模型与端点方便你在不修改配置文件的前提下做验证。第 2 步在配置中启用音频媒体理解在clawdbot.config.json5或等价配置入口中写入{ tools: { media: { audio: { enabled: true, models: [{ provider: deepgram, model: nova-3 }] } } } }启用后每当收到音频附件Clawdbot 就会把音频文件上传到 Deepgram并把转写结果注入回复管道。若只想验证转写是否生效可参考 docs/nodes/audio.md 中提到的Provider-only (Deepgram)最小配置它与上面的示例等价。配置参数详解模型、语言与 Deepgram 专属选项完整的音频媒体理解配置项定义在 types.tools.ts并经过 zod-schema.core.ts 的运行时校验。以下是 Deepgram 相关的核心参数。model模型 ID类型字符串默认值nova-3作用指定 Deepgram 使用的转写模型。模型默认值有两处源码佐证一处是 defaults.ts 的 DEFAULT_AUDIO_MODELS 中deepgram: nova-3另一处是 deepgram/audio.ts 的 DEFAULT_DEEPGRAM_AUDIO_MODEL。即便你在配置中省略modelrunner 也会回落到这个默认值。若显式配置但值为空字符串实现里同样会回落到默认模型function resolveModel(model?: string): string { const trimmed model?.trim(); return trimmed || DEFAULT_DEEPGRAM_AUDIO_MODEL; }language语言提示可选类型字符串作用为转写提供语言提示例如中文可指定zh。指定语言后该值会作为language查询参数附加到 Deepgram/listen请求上。示例配置{ tools: { media: { audio: { enabled: true, models: [ { provider: deepgram, model: nova-3, language: zh } ] } } } }language也可以在tools.media.audio.language层级统一定义优先级为模型条目entry上的language 能力级config.languagecfg.tools.media.audio.language见 runner.ts 的音频调用段。适合所有模型统一用中文提示的场景。providerOptions.deepgramDeepgram 专属转写选项这些选项最终会被转成 Deepgram/listen接口的查询参数snake_case。支持的三个开关配置键对应查询参数作用detect_languagedetect_language启用语言自动检测punctuatepunctuate启用标点符号逗号、句号等smart_formatsmart_format启用智能格式化数字、日期、金额等规范化带 Deepgram 选项的完整示例{ tools: { media: { audio: { enabled: true, providerOptions: { deepgram: { detect_language: true, punctuate: true, smart_format: true } }, models: [{ provider: deepgram, model: nova-3 }] } } } }从 zod-schema.core.ts 的 DeepgramAudioSchema 可见这三个字段均为可选布尔值且 schema 是 strict 的——拼写错误的键会被校验拒绝。兼容性说明旧的 deepgram 顶层字段已废弃仓库在 types.tools.ts 和 zod-schema.core.ts 中保留了一组已标记 deprecated的顶层deepgram字段detectLanguage/punctuate/smartFormat用于兼容旧配置。runner 在 resolveProviderQuery 中会优先采用providerOptions.deepgram再以旧字段兜底同时通过normalizeDeepgramQueryKeys把 camelCase 写法如detectLanguage归一化为 snake_casedetect_language后发给 Deepgram。如果你使用的是较新版本建议统一写在providerOptions.deepgram下。底层原理一次 Deepgram 转写请求的完整调用链理解请求细节有助于排查问题和做性能预估。核心实现位于 src/media-understanding/providers/deepgram/audio.ts其调用链如下端点组装默认 base URL 为https://api.deepgram.com/v1常量DEFAULT_DEEPGRAM_AUDIO_BASE_URL实际请求地址为${baseUrl}/listenmodel、language以及所有 providerOptions 都以查询参数形式拼入 URLconst url new URL(${baseUrl}/listen); url.searchParams.set(model, model); if (params.language?.trim()) url.searchParams.set(language, params.language.trim());认证与请求头若未显式提供authorization则设置authorization: Token ${apiKey}同时按音频 MIME 类型设置content-type无 MIME 时回落为application/octet-stream。上传方式使用fetchWithTimeoutGuarded发起POST请求体是原始音频字节Uint8Array而非 base64并携带调用方传入的超时timeoutMs。响应解析从 Deepgram 返回的 JSON 中逐层取results.channels[0].alternatives[0].transcript作为最终转写文本若取不到文本则抛出Audio transcription response missing transcript错误。失败处理HTTP 非 2xx 时读取响应体并抛出Audio transcription failed (HTTP status)便于上层 fallback 逻辑捕获并尝试下一个模型。值得注意的是 runner.ts 的音频执行段provider 模式下会先通过resolveApiKeyForProvider解析密钥要求必须拿到 apiKey再合并三层配置来源——models.providers.deepgram供应商级、tools.media.audio能力级、models条目级——得到最终的baseUrl、headers与 provider 查询参数。认证顺序与密钥来源Deepgram 的认证遵循项目统一的标准供应商认证顺序。文档明确指出DEEPGRAM_API_KEY是最简单的方式这与 model-auth.ts 的实现一致deepgram直接映射到DEEPGRAM_API_KEY环境变量。若你配置了认证 profile密钥解析会按标准顺序依次尝试 profile 存储、环境变量、models.providers.*.apiKey等来源环境变量始终是零配置首选。通过 baseUrl 与 headers 覆盖端点代理/自建网关场景当你的网络环境需要走代理或需要把请求转发到兼容 Deepgram 协议的自建网关时可在tools.media.audio下覆盖端点与请求头{ tools: { media: { audio: { enabled: true, baseUrl: https://your-proxy.example.com/v1, headers: { X-Custom-Header: value }, models: [{ provider: deepgram, model: nova-3 }] } } } }对应的行为有测试用例直接验证runner.deepgram.test.ts 构造了供应商级、能力级、条目级三层baseUrl/headers并存的情况断言最终生效的是条目级baseUrlhttps://entry.example而 headers 会按 供应商级 → 能力级 → 条目级 的顺序合并X-Provider、X-Config、X-Entry同时存在。这意味着baseUrl是就近覆盖模型条目上的优先级最高headers是合并叠加越靠近条目的键值越靠后、可覆盖同名键。同时该测试还验证了providerOptions的合并语义条目级的detectLanguage: false覆盖能力级的detect_language: true最终发送给 Deepgram 的查询参数为detect_languagefalse, punctuatefalse, smart_formattrue且不会残留 camelCase 键。转写结果的注入{{Transcript}} 与 [Audio] 块转写成功后结果会按照统一的媒体理解输出格式注入消息上下文。相关逻辑在 format.ts 与 apply.ts单条音频转写时Body被替换为[Audio]块[Audio] Transcript: 转写文本如果原始消息里还带有用户文字则会保留为User text:段[Audio] User text: 用户附带文字 Transcript: 转写文本多条音频mode: allmaxAttachments时块标题带序号如[Audio 1/2]、[Audio 2/2]多段之间用空行分隔。同时ctx.Transcript被设置为转写文本多条时按Audio 1:... / Audio 2:...拼接模板中可直接使用{{Transcript}}。命令解析层面见 apply.ts转写成功后CommandBody/RawBody也会被设为转写文本或原始用户文字从而保证语音下达的斜杠命令slash command依然能正常解析。对应断言可在 apply.test.ts 中看到例如expect(ctx.Body).toBe([Audio]\nTranscript:\ntranscribed text);与其他音频规则的协同大小限制、超时与多模型回退文档强调输出遵循与其他供应商相同的音频规则。这些规则的默认值定义在 defaults.ts大小限制音频默认maxBytes为 20MB20 * MB。超限的附件会触发 skiprunner 会继续尝试列表中的下一个模型见 runner.ts 的 runAttachmentEntries。超时音频默认timeoutSeconds为 60 秒可在能力级或条目级覆盖。输出长度音频默认maxChars为未设置保留完整转写需要截断时可配置tools.media.audio.maxChars或条目级maxChars。多模型回退models是一个有序数组第一个成功且输出非空的条目胜出失败/跳过后自动尝试下一个每个条目的成败与原因都会记录进MediaUnderstandingDecisions便于在 verbose 日志中追踪。并发控制tools.media.concurrency控制媒体理解任务的最大并发数默认值为 2defaults.ts。未配置时的自动探测顺序如果你没有显式配置tools.media.audio.models且enabled未被设为false系统会按 docs/nodes/audio.md 描述的自动探测顺序尝试并在第一个可用选项处停止本地 CLI若已安装sherpa-onnx-offline、whisper-cliwhisper-cpp、whisperPythonGemini CLIgemini通过read_many_files读取音频Provider 密钥OpenAI → Groq → Deepgram → Google对应 runner.ts 的 AUTO_AUDIO_KEY_PROVIDERS。也就是说即使你不写任何 Deepgram 配置只要环境里有DEEPGRAM_API_KEY系统也会把它作为音频转写的候选供应商之一反之如果你想完全关闭自动探测设置tools.media.audio.enabled: false即可。验证与测试仓库为 Deepgram 音频转写提供了两级测试可直接用于验证配置正确性单元级合并逻辑测试runner.deepgram.test.ts用 mock provider 验证providerOptions、baseUrl、headers的三层合并与键名归一化不依赖真实网络。真实转写 live 测试audio.live.test.ts需要设置DEEPGRAM_API_KEY且开启 live 开关如OPENCLAW_LIVE_TESTtrue才会运行。它默认下载 Deepgram 官方示例音频.wav并调用transcribeDeepgramAudio断言转写文本非空并可通过DEEPGRAM_MODEL、DEEPGRAM_BASE_URL环境变量切换模型与端点。这两个文件也是排查配置没问题但转写失败时的最佳参照前者说明参数是否被正确透传后者说明密钥与网络是否可用。注意事项小结转写是非流式的一次上传、一次返回全文长音频请合理预估 60 秒默认超时必要时调大timeoutSeconds。认证优先走标准顺序DEEPGRAM_API_KEY是零配置的最简方式自建代理时用tools.media.audio.baseUrlheaders覆盖。providerOptions.deepgram中的键使用 snake_casedetect_language、punctuate、smart_format旧的顶层deepgram.detectLanguage等字段虽仍兼容但已标记废弃新配置应迁移到providerOptions.deepgram。音频超过 20MB 默认上限会被跳过并尝试下一个模型想处理多条语音用tools.media.audio.attachments.mode: all配合maxAttachments。转写文本会同时注入{{Transcript}}模板变量、[Audio]块Body以及CommandBody/RawBody因此语音下达的命令也能正常执行。赞分享人工智能AI Agent即时通讯后端本地部署语音【免费下载链接】openclaw-cn中文社区版OpenClaw同原版保持定期更新已内置钉钉、企业微信、飞书、QQ、微信以及国内网络环境优化。你的专属个人AI助手。支持所有操作系统和平台。项目地址https://gitcode.com/gh_mirrors/op/openclaw-cn点击查看免费下载相关推荐OpenClaw 接入 Deepgram为语音留言启用 Nova-3 音频转写OpenClaw 接入 Deepgram为语音留言启用 Nova 3 音频转写 Deepgram 是 OpenClaw 内置的语音转文字speech to人工智能大模型LLM 网关AI Agent即时通讯openclaw-cnClawdbot语音消息自动转写指南音频下载、转录与回复注入openclaw cnClawdbot语音消息自动转写指南音频下载、转录与回复注入 本文是 openclaw cn中文社区版 OpenClaw核心代码人工智能AI Agent即时通讯后端本地部署语音基于 ai-sdk/deepgram 的语音转写与语音合成实战AI SDK Deepgram Provider 能力全解析基于 ai sdk/deepgram 的语音转写与语音合成实战AI SDK Deepgram Provider 能力全解析 本篇文章以 ai sdk/de人工智能AI 应用AI Agent工具调用MCP Clients创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

小程序反编译实战:wxappUnpacker解包还原wxapkg源码

小程序反编译实战:wxappUnpacker解包还原wxapkg源码

简介:这是一份面向微信小程序开发者与安全研究人员的反编译工具资源包,内含 wxappUnpacker 完整项目文件。它支持解析微信小程序的主包与分包,将 .wxml、.wxss、.js、.json 等二进制格式还原为可读代码,便于分析业务逻辑、定位性能…

2026/10/15 15:10:54 阅读更多 →
AI Agent驱动的Android逆向工作流设计与实践

AI Agent驱动的Android逆向工作流设计与实践

1. 项目概述:当逆向工程遇上AI Agent,不是“拆APK”,而是让机器理解安卓世界的运行逻辑你有没有试过打开一个陌生的APK,点开JADX,盯着满屏的Smali代码发呆?不是看不懂,而是看懂了也难说清——这…

2026/10/15 15:09:53 阅读更多 →
UVa 1098 Robots on Ice

UVa 1098 Robots on Ice

题目描述 在一个 mnm \times nmn 的网格上,机器人从起点 (0,0)(0,0)(0,0) 出发,需要访问网格中的每一个方格恰好一次,最终到达终点 (0,1)(0,1)(0,1)。机器人每次只能向上下左右四个方向移动一格。网格中有三个指定的“签到点”,机…

2026/10/15 15:09:53 阅读更多 →

最新新闻

STM32F103C8T6万年历Proteus仿真:时钟配置与日期边界全解析

STM32F103C8T6万年历Proteus仿真:时钟配置与日期边界全解析

简介:基于STM32F103C8T6的多功能电子万年历Proteus仿真工程,面向单片机初学者、电子设计竞赛备赛者及课程设计者。系统以STM32最小系统板为控制器,使用DS1302时钟芯片记录日历,DS18B20采集温度,1602A液晶屏显示年月日、…

2026/10/15 15:58:15 阅读更多 →
Kube-Bench实战:Kubernetes安全基线扫描与自动化合规实践

Kube-Bench实战:Kubernetes安全基线扫描与自动化合规实践

上周安全部门丢过来一张表格,密密麻麻列着:集群版本多少、API Server有没有开匿名访问、etcd是否启用了TLS、kubelet的只读端口关没关……要求一周内交一份基线合规报告。以前遇到这种事,基本都是对着官方文档一项一项人工核对,一…

2026/10/15 15:58:15 阅读更多 →
STM32CubeMX入门:图形化配置GPIO点亮LED实战教程

STM32CubeMX入门:图形化配置GPIO点亮LED实战教程

1. 什么时候开始,我建议你直接跳到CubeMX先说句实话,如果到现在你还在纠结“到底要不要先学寄存器再学CubeMX”,那我建议你放下这个执念。我就是从寄存器一路折腾过来的,当时翻手册、查寄存器位定义,光配置一个GPIO就要…

2026/10/15 15:58:15 阅读更多 →
石化罐区HART温度传感器联网改造实战:从模拟表到TCP以太网监控

石化罐区HART温度传感器联网改造实战:从模拟表到TCP以太网监控

做石化仓储电仪的人,几乎都遇到过这样的尴尬场景:罐区里一排带HART协议的防爆温度传感器,铭牌上明明白白写着“智能仪表”,可到了中控室,监控画面上孤零零一个温度数值,仪表内部的诊断信息、量程状态、设备…

2026/10/15 15:58:15 阅读更多 →
存量HART仪表接入以太网:油库温度监测改造实战解析

存量HART仪表接入以太网:油库温度监测改造实战解析

干过现场仪表改造的人一定懂这个场景:油库罐区几十台防爆温度变送器,走的是HART协议,现场信号质量没问题,数据却全憋在仪表里,中控室想看个实时温度还得靠人工去罐区抄表,又慢又不安全。前几个月我接手了一…

2026/10/15 15:58:15 阅读更多 →
HART温度传感器接入Modbus TCP网关:光伏车间监控改造实战

HART温度传感器接入Modbus TCP网关:光伏车间监控改造实战

最近刚完成一个光伏车间的温度监控改造项目,核心就是把现场几十台HART协议的温度传感器组件,通过网关统一转成TCP以太网协议,送进中控室上位机实时监控。项目本身不是特别复杂,但牵扯的环节很杂——从仪表端的HART轮询参数、网关里…

2026/10/15 15:57:12 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →