Gradium ASR 扩展实战指南在 TEN 框架中接入低延迟流式语音识别【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址: https://gitcode.com/TEN-framework/ten-framework导读本文围绕 TEN 框架TEN-framework官方仓库中提供的gradium_asr_python扩展完整讲解如何通过 Gradium AI API 为会话式语音 AI Agent 接入基于 WebSocket 的实时语音转文本ASR能力。读完本文你将掌握该扩展的配置方式、音频输入规格、TEN 应用图中的接线方法、输出消息格式以及底层 WebSocket 协议与错误处理机制并能直接照搬示例搭建一条可运行的实时转录链路。扩展概述为语音 Agent 提供低延迟转录gradium_asr_python是 TEN 框架下的一款 Python ASR 扩展位于仓库的 ai_agents/agents/ten_packages/extension/gradium_asr_python 目录。它使用 Gradium AI API 提供实时语音转文本转录服务核心传输通道为 WebSocket 流式传输从而获得低延迟的转录体验。从源码看该扩展以 extension.py 中的GradiumASRExtension类为核心实现继承自ten_ai_base的AsyncASRBaseExtension并借助ten_runtime_python与ten_ai_base两个系统级依赖完成与 TEN 运行时的对接。扩展通过 addon.py 中的register_addon_as_extension(gradium_asr_python)注册为 TEN 扩展应用图graph中通过addon字段引用即可加载。功能特性根据扩展文档与源码实现该扩展具备以下能力通过 WebSocket 实现实时语音识别start_connection/_receive_loop/_send_loop三个异步方法构成完整的数据通路支持多个区域美国us与欧洲eu由config.py中的get_websocket_url()按区域选择端点语音活动检测VAD集成接收服务端下发的vad类型消息可配置的音频格式PCM、WAV、Opus由input_format参数控制低延迟流式转录音频帧经 base64 编码后逐块推送同时输出中间结果与最终结果通过final字段区分。配置指南环境变量设置 API 密钥Gradium API 密钥通过环境变量注入避免明文写入配置文件。在运行 TEN 应用前执行export GRADIUM_API_KEYyour_api_key_here扩展的 property.json 中使用${env:GRADIUM_API_KEY|}语法引用该环境变量|后为空表示未设置时不提供默认值。属性配置property.json在扩展包目录下的property.json中配置参数。仓库自带的默认配置如下{ params: { api_key: ${env:GRADIUM_API_KEY|}, region: us, model_name: default, input_format: pcm, sample_rate: 24000, language: } }扩展在on_init阶段通过ten_env.get_property_to_json()读取全部属性并使用 pydantic 模型GradiumASRConfig进行校验见 config.py。若校验失败扩展会记录错误日志并通过标准 TEN 错误接口向上层发送ModuleErrorFATAL_ERROR。配置参数表参数类型默认值描述api_keystring-Gradium API 密钥必需支持${env:GRADIUM_API_KEY}环境变量引用regionstringusAPI 区域取值us美国或eu欧洲由 pydanticLiteral[eu, us]强约束model_namestringdefaultGradium ASR 模型名称随setup消息上报服务端input_formatstringpcm音频格式取值pcm、wav或opus同样受Literal约束sample_rateinteger24000音频采样率HzGradium 服务期望 24 kHzlanguagestring可选语言代码仅在非空时随setup消息发送除了上述参数config.py 中的 pydantic 模型还定义了三个对调用方透明的内部参数channels默认1声道数Gradium 期望单声道bits_per_sample默认16位深Gradium 期望 16 位dump/dump_path默认false//tmp是否转储音频以辅助调试。这些参数由update()方法从property.json的params对象中合并而来只要在params中声明对应键即可覆盖。to_json(sensitive_handlingTrue)方法会在日志输出时把api_key掩码为***避免敏感信息泄露对应on_init中KEYPOINT vendor_config日志。音频要求Gradium ASR 服务期望的音频规格如下这也是input_audio_sample_rate()、input_audio_channels()、input_audio_sample_width()三个方法向 TEN 运行时声明输入格式的依据见 extension.py采样率24,000 Hz24 kHz格式PCM或 WAV/Opus位深度16 位有符号整数bits_per_sample // 8即每采样 2 字节声道单声道1 个声道推荐块大小每块 1920 个采样点80ms对应 const.py 中的GRADIUM_FRAME_SIZE 1920扩展的缓冲策略为ASRBufferConfigModeDiscard()即对输入音频帧不做复杂缓存、直接流转以保障实时性。API 端点区域 URL区域WebSocket 端点美国uswss://us.api.gradium.ai/api/speech/asr欧洲euwss://eu.api.gradium.ai/api/speech/asr端点选择逻辑实现在 config.py 的get_websocket_url()中region eu时返回欧洲端点否则返回美国端点。使用示例在 TEN 应用图中配置扩展在 TEN 应用的 graph 配置中将 Gradium ASR 扩展声明为一个节点并注入必要参数{ nodes: [ { type: extension, name: gradium_asr, addon: gradium_asr_python, extension_group: gradium_asr_group, property: { params: { api_key: ${env:GRADIUM_API_KEY|}, region: us, model_name: default } } } ] }其中addon必须与 addon.py 中注册的名称gradium_asr_python一致。property.params中的字段结构由 manifest.json 的api.property.properties.params声明api_key、region、model_name、input_format、sample_rate、language。连接音频输入将上游音频源如麦克风采集扩展的pcm_frame输出连接到gradium_asr扩展{ connections: [ { extension_group: audio_input_group, extension: audio_input, audio_frame_out: [ { name: pcm_frame, dest: [ { extension_group: gradium_asr_group, extension: gradium_asr } ] } ] } ] }连接建立后扩展通过send_audio()接收AudioFrame用frame.lock_buf()取出裸字节放入AsyncQueue再由_send_loop()任务逐帧取出、base64 编码后封装为{type: audio, audio: base64}消息推送到 WebSocket。底层 WebSocket 协议结合 const.py 与 extension.py可梳理出完整的消息类型与握手流程消息类型type方向说明setup客户端 → 服务端携带model_name、input_format可选languageready服务端 → 客户端握手成功确认收到后扩展才启动收发任务audio客户端 → 服务端base64 编码的音频数据text服务端 → 客户端转录文本结果vad服务端 → 客户端语音活动检测事件end_of_stream客户端 → 服务端流结束信号对应stop_connection()连接建立流程扩展调用websockets.connect(url, additional_headers{x-api-key: api_key})建立连接API 密钥通过 HTTP 头x-api-key传递见start_connection()发送setup消息若配置了language则附加语言代码等待服务端返回ready消息确认后置connected True并同时启动_receive_loop与_send_loop两个异步任务若收到的不是ready抛出异常并走错误处理分支。断开流程stop_connection()依次执行发送end_of_stream消息 → 取消接收与发送任务 → 关闭 WebSocket → 复位connected状态。由于 Gradium 不需要按会话显式终结finalize()方法为空实现。输出格式扩展以标准 TEN ASR 格式输出转录结果_handle_text_message()将服务端下发的text消息解析后通过_handle_asr_result()向上游透出{ text: 转录的文本, final: true, start_ms: 0, duration_ms: 1000, language: zh }结果字段说明字段类型说明textstring转录的文本内容finalboolean是否为最终结果false表示中间部分结果可用于流式展示start_msinteger该片段相对开始时间毫秒取自服务端消息的start_msduration_msinteger持续时间毫秒由服务端end_ms - start_ms计算得出languagestring检测到的或配置的语言取自config.language错误处理扩展通过标准 TEN 错误接口ModuleErrorModuleErrorVendorInfo向上层报告错误vendor()返回gradium。主要错误场景与处理逻辑连接错误WebSocket 连接失败start_connection()中的连接或握手异常会发送FATAL_ERROR级别的ModuleError并附带vendor_info.code connection_error身份验证错误无效的 API 密钥API 密钥通过x-api-key请求头传递服务端拒绝时同样在start_connection()的异常分支被捕获上报转录错误处理失败_receive_loop()接收或解析消息异常时发送NON_FATAL_ERROR级别的ModuleErrorvendor_info.code receive_error并复位连接状态。此外on_init阶段的配置校验失败也会产生FATAL_ERROR错误。所有错误消息均携带module asr标识见MODULE_NAME_ASR便于上层按模块路由处理。依赖项扩展的依赖在 requirements.txt 与 pyproject.toml 中声明运行时依赖如下websockets14.0WebSocket 客户端库负责与 Gradium 服务的流式通信pydantic2.0.0配置模型校验GradiumASRConfigtyping-extensions4.5.0override等类型标注支持ten_runtime_python0.11TEN 运行时 Python 绑定见 manifest.json 中的系统依赖声明ten_ai_base0.7TEN AI 基础类AsyncASRBaseExtension、ASRBufferConfig、消息与错误类型等。扩展包版本为0.1.1见 manifest.json要求 Python3.10。许可证与支持本扩展与 TEN 框架采用相同许可证。如在使用中遇到问题可参考以下途径Gradium API 文档https://gradium.ai/api_docs.html确认服务端协议与配额TEN 框架官方文档仓库的 docs 目录以及框架根目录的 README.md获取应用图配置与调试方法查看仓库内其他语音示例如 ai_agents/agents/examples/voice-assistant中 ASR 扩展的接线方式作为集成参考。【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址: https://gitcode.com/TEN-framework/ten-framework创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Kornia `depth_from_disparity` 批量增强:为每批次立体相机独立设置基线与焦距 计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 本篇技术指南讲解 Kornia 几何模块中 depth_from_disparit… · 2026/9/24 17:20:30
TCP协议栈管理、文件符表映射机制与TCP资源关闭流程介绍 文章目录
一、进程与内核
1.用户态的Java程序进程
2.内核态的操作系统内核
2.1操作系统
2.1.1内核
二、文件描述符与表引用
1.文件描述符
2.文件描述符表
3.引用比例
三、TCP资源管理与连接维护
1.TCP协议栈
1.1TCB
1.1.1端点
1.1.1.1TCP连接状态
四、Socket引用… · 2026/9/24 17:52:44
基于 Java Spring Boot 的幼儿早教微信小程序设计与实现 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 引言
随着移动互联网的普及和微信生态的快速发展,微信小程序凭借其即用即走、无需下载安装、传播便捷等优势,已成为教育服务领域的重要载体。… · 2026/9/24 17:52:44
视频素材格式转换:多款视频转换工具能力客观记录 自媒体素材整理、课件转码、监控视频归档时,经常遇到视频格式不兼容、平台上传受限的问题。批量转格式、压缩体积、提取音频、转 GIF,不同工具支持的格式种类、批量上限、编码自定义范围差别较大。下文客观记录多款视频转换工具基础能力与使用边界&#… · 2026/9/24 17:52:38
教学反思怎么写才不只是感想:四步各留一处能回查的痕迹 一节课上完,随笔写下几行,往往只是当堂的感受;真正立得住的反思,是每一步都留下了一处日后能翻回来核对的凭据。知学术AIPaperGPT 把这条线看得比字数更重。先要一个框架,让免费智能大纲接手;图表这类素材&… · 2026/9/24 17:52:38
独立站建站平台有哪些?Shopify、WooCommerce和外贸建站方案盘点 搜索“独立站建站平台有哪些”的企业,往往已经决定不只依赖第三方平台或社媒入口,而是希望拥有自己的官网、产品展示、询盘或交易阵地。但独立站并不是单一工具,它包括B2B外贸询盘站、跨境电商交易站、品牌展示站、内容型网站和复杂定制系统&… · 2026/9/24 17:52:19
Large Bin Attack 学习 Large Bin Attack,最重要的一点是不要被它的名字吓倒。虽然它属于高级的堆利用技巧,但它的本质其实非常简单:利用 glibc 在维护“有序双向链表”时,缺乏足够的安全检查,从而让我们能在一个任意的内存地址里&#… · 2026/9/24 17:52:19
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44