在 TEN 框架中接入智谱 GLM 多模态实时语音:glm_mllm_python 扩展全面解析
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载glm_mllm_python 是 TEN 开源仓库中面向智谱 GLM 多模态Multimodal模型的一站式实时语音扩展它将 GLM Realtime API 的 WebSocket 能力封装为标准的 TEN Extension支持端到端语音进、语音出并原生打通文本转录、函数工具调用与会话打断。读完本文你将掌握该扩展的完整配置项、消息接口约定、源码级工作链路以及如何在 TEN Agent 图中将它作为 OpenAI Realtime 的等价替代接入自己的语音助手应用。一、扩展定位与核心能力该扩展位于 ai_agents/agents/ten_packages/extension/glm_mllm_python包名glm-mllm-python版本 0.2.2见 pyproject.toml。从 addon.py 可见它通过register_addon_as_extension(glm_mllm_python)注册为 TEN 的 extension addon实例化的是 extension.py 中的GLMRealtime2Extension类。按照 README.md 的说明其核心能力包括GLM 多模态集成利用 GLM 多模态模型完成语音到语音voice to voice以及文本处理无需单独串联 ASR / LLM / TTS 三个环节可配置API Key、模型设置、提示词prompt、temperature 等均可通过 property 灵活定制异步队列处理支持实时消息处理具备任务取消与优先级控制能力源码中体现为异步事件循环 连接断线自动重连 音频发送 QPS 限流工具集成支持外部工具如函数调用注册与会话内调用README 中该条目虽处于注释状态但源码中已实现完整的 tool 注册与调用回路详见下文第七节。二、依赖关系与包结构该扩展的运行时依赖在 requirements.txt 与 pyproject.toml 中声明依赖版本要求用途aiohttp3.14.1建立并维护与 GLM Realtime API 的 WebSocket 长连接pydantic2.13.4配置模型GLMRealtimeConfig校验与解析pydub0.25.1将裸 PCM 封装为 WAV 音频块_pcm_to_wav_bytes辅助方法同时 manifest.json 声明了两类系统包依赖ten_runtime_python0.11提供运行时 APIAsyncTenEnv、AudioFrame、Data等ten_ai_base0.7提供 MLLM 扩展基类AsyncMLLMBaseExtension以及MLLMServer*系列标准化消息结构体。包内文件组织如下extension.py—— 扩展主逻辑生命周期管理、WebSocket 客户端循环、消息分发、会话更新realtime/connection.py——RealtimeApiConnection负责 WebSocket 连接、音频上行、消息收发与解析realtime/struct.py—— Realtime 协议的完整消息定义dataclass 建模的服务端/客户端事件类型addon.py—— addon 注册入口manifest.json/property.json—— API 声明与默认配置。三、配置参数全解Property APImanifest.json 的api.property节声明了该扩展对外暴露的全部配置项property.json 提供默认值。README 的 API 表是其中核心项的精简版下面把 README 表格与 manifest、源码中的GLMRealtimeConfig定义合并为完整清单Property类型默认值说明api_keystring${env:GLM_API_KEY}智谱开放平台 API Key必填on_init中若为空会直接抛错见 extension.pybase_urlstringwss://open.bigmodel.cnGLM Realtime WebSocket 服务基地址pathstring/api/paas/v4/realtimeWebSocket 路径与base_url拼接为完整连接地址源码RealtimeApiConnection中self.url f{base_url}{path}promptstring发送给模型的默认系统指令system message会作为session.update的instructions下发temperaturefloat320.9源码默认 0.5生成随机性控制property.json 默认 0.9代码 dataclass 默认 0.5以实际注入配置为准max_tokensint322048源码默认 1024单次响应最大 token 数README 中标注为 int64manifest 实际声明 int32server_vadbooltrue是否启用服务端 VAD语音活动检测控制说话开始/停止事件与打断行为audio_outbooltrue是否输出合成音频input_transcriptbooltrue是否启用输入音频转写用户语音转文本sample_rateint3224000输入输出音频采样率同时决定input_audio_sample_rate()与synthesize_audio_sample_rate()的返回值dumpboolfalse是否开启音频 dump调试用dump_pathstringdump 输出路径说明language默认en-US也在配置 dataclass 中存在但未出现在 manifest 的 property 声明中属于源码内部保留字段。配置加载链路on_init中调用ten_env.get_property_to_json(None)取出全部属性再通过GLMRealtimeConfig.model_validate_json(properties)校验解析未显式配置的字段会回落到 dataclass 默认值extension.py。四、消息接口约定README 明确定义了扩展与图graph中其他节点交互的四类接口这也是将其接入 TEN Agent 时必须对齐的契约。4.1 Data Out数据输出NamePropertyType说明text_datatextstring外发文本数据在实现层面该扩展通过ten_ai_base的标准化事件对外发文本包括mllm_server_output_text助手增量/最终转录、mllm_server_input_transcript用户语音转写、mllm_server_session_ready会话就绪、mllm_server_interrupted打断、mllm_server_function_call函数调用请求等。以语音助手示例 voice-assistant-realtime 的图配置为例这些事件名正是与main_control节点相连的data通道名称。4.2 Command Out命令输出Name说明flush刷新当前状态后的响应当一轮响应被 flush 时扩展会通过_finalize_output_if_needed()确保把尚未终结的转录文本以finalTrue的形式补发出去GLM 有时不发送 transcript-done 事件需在此兜底见 extension.py。4.3 Audio Frame In / Out方向Name说明Inpcm_frame语音处理输入帧上游如声卡/RTC 采集的 PCMOutpcm_frame语音处理后的输出帧模型合成的 PCM 音频输入侧由send_audio(frame, session_id)承接输出侧由send_server_output_audio_data(audio_bytes)推送示例图中agora_rtc与v2vMLLM 节点之间正是通过名为pcm_frame的audio_frame通道双向连接。五、源码级工作链路剖析5.1 连接建立与会话创建start_connection()中创建RealtimeApiConnection用Authorization: Bearer api_key请求头建立 WebSocket 连接connection.py。随后进入async for message in self.conn.listen()的事件分发循环以 Python 3.10 的match模式匹配服务端事件类型extension.py。当收到SessionCreated时扩展会依次执行记录session_id→_update_session()下发指令/工具/音频格式 →_resume_context()回放历史消息 → 广播mllm_server_session_ready通知下游会话就绪。5.2 音频上行PCM 缓冲与限流send_audio是语音链路的入口。从源码看extension.py扩展将收到的 PCM 帧追加到内部缓冲_pcm_buffer并受_qps_limit 50的发送频率限制min_interval 1.0 / 50到达时间窗口才将整段缓冲通过input_audio_buffer.append事件以 base64 形式上行。类文档注释指出 GLM 输入要求 WAV代码保留_pcm_to_wav_bytes()方法用 pydub 将 int16 单声道 PCM 在内存中封装为 WAV因此实际部署时需关注 GLM 侧对输入音频格式的最终要求必要时可启用该封装路径。5.3 响应流式输出服务端事件按response.*系列逐段到达ResponseAudioTranscriptDelta—— 累积response_transcript以增量delta形式持续输出mllm_server_output_textResponseAudioTranscriptDone—— 输出finalTrue的完整转录并清空缓冲ResponseAudioDelta—— base64 解码后经send_server_output_audio_data直接下发音频帧ResponseDone—— 触发兜底 finalize保证转录不丢失。5.4 服务端 VAD 与打断当启用server_vad且收到InputAudioBufferSpeechStarted时扩展立即发送mllm_server_interrupt中断当前助手输出若此时正处于响应中会将现有转录追加[interrupted]标记以finalTrue输出并把该response_id记入flushed集合防止后续残留增量重复下发extension.py。5.5 断线重连start_connection的事件循环结束后无论正常结束还是异常退出都会进入_handle_reconnect()先关闭旧连接若未收到on_stop停止信号则等待 1 秒后重新建立连接实现语音会话的自愈恢复extension.py。5.6 协议消息建模realtime/struct.py 将整个 Realtime 协议建模为 dataclass客户端事件ClientToServerMessage子类如InputAudioBufferAppend、ItemCreate、ResponseCreate、SessionUpdate与服务端事件ServerToClientMessage子类如SessionCreated、ResponseAudioDelta、ItemInputAudioTranscriptionCompleted等并通过parse_server_message()/to_json()完成 JSON 与对象的双向转换。扩展事件分发正是基于这套建模因此若 GLM 协议版本演进主要改动点集中在此文件。六、工具Function Calling支持尽管 README 中将工具支持标注为注释项源码已实现完整的工具回路注册宿主通过send_client_register_tool(tool)注册LLMToolMetadata扩展维护available_tools列表并触发_update_session()下发_update_session()将工具元数据转换为{type, name, description, parameters}结构随session.update的tools字段下发extension.py调用收到ResponseFunctionCallArgumentsDone后由于 GLM 的工具调用不携带call_id扩展以空call_id转发mllm_server_function_call事件给宿主回填宿主执行完工具后调用send_client_function_call_output扩展以FunctionCallOutputItemParam回写结果并触发ResponseCreate让模型基于工具结果继续生成。七、在 TEN Agent 中接入该扩展在 voice-assistant-realtime 示例的manifest.json中glm_mllm_python与openai_mllm_python、azure_mllm_python等并列作为可选 MLLM addon 依赖。接入时只需在应用的manifest.json中添加该扩展依赖在property.json的predefined_graphs[].graph.nodes中新增一个节点addon指向glm_mllm_python配置api_key推荐使用${env:GLM_API_KEY}环境变量注入与 property.json 默认一致、temperature、max_tokens、prompt等参数将该节点与上游采集节点如agora_rtc以audio_frame.pcm_frame通道双向连接并将mllm_server_*系列 data 事件与宿主控制节点相连通道命名可参考 voice-assistant-realtime 的图配置。示例节点配置形态可对照示例中v2v节点替换 addon 与参数{ type: extension, name: v2v, addon: glm_mllm_python, extension_group: default, property: { api_key: ${env:GLM_API_KEY}, base_url: wss://open.bigmodel.cn, path: /api/paas/v4/realtime, prompt: You are a helpful voice assistant., temperature: 0.9, max_tokens: 2048, server_vad: true, sample_rate: 24000 } }需要注意api_key为必填项缺失时扩展会在on_init阶段抛出ValueError终止启动音频采样率建议与上游采集、下游播放环节保持一致默认 24000。八、小结glm_mllm_python 以 TEN 标准的 Extension 抽象封装了智谱 GLM Realtime 多模态能力对外暴露了清晰的 Property 配置与 data/cmd/audio_frame 四类接口对内则以WebSocket 事件循环 dataclass 协议建模 自动重连 VAD 打断 工具回填的方式实现了可投入生产的实时语音会话链路。对于希望用 GLM 多模态模型替换 OpenAI Realtime 的 TEN Agent 开发者而言该扩展是一个可直接复用、结构清晰且便于按协议演进二次修改的参考实现深入研读 extension.py 与 realtime/struct.py即可完整掌握其消息协议与扩展点。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐TEN 框架中集成 Azure 多模态实时语音 AIazure_mllm_python 扩展完全指南TEN 框架中集成 Azure 多模态实时语音 AIazure_mllm_python 扩展完全指南 导读 azure_mllm_python 是 TEN 框人工智能AI Agent多模态语音AI 应用TEN Framework 中 StepFun 多模态实时语音 Agent 扩展 stepfun_mllm_python 接入指南TEN Framework 中 StepFun 多模态实时语音 Agent 扩展 stepfun_mllm_python 接入指南 本篇技术指南围绕 TEN F人工智能AI Agent多模态语音AI 应用Appium 移动端 MJSONWP 兼容端点完全指南从 Rotation 到 Context 的协议适配与迁移Appium 移动端 MJSONWP 兼容端点完全指南从 Rotation 到 Context 的协议适配与迁移 导读 Appium 是基于 W3C WebD人工智能AI Agent多模态语音AI 应用上一篇Rodio音频效果处理失真、混响、均衡器的实现原理下一篇解决GLFW在macOS上的Metal渲染异常从根源到修复的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考