ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在 TEN Agent 中集成 OpenAI Realtime 多模态大模型:openai_mllm_python 扩展实战指南

在 TEN Agent 中集成 OpenAI Realtime 多模态大模型:openai_mllm_python 扩展实战指南 人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载本指南以 TEN-framework 仓库中的openai_mllm_python扩展为核心讲解如何在 TEN 智能体应用TEN Agent中接入 OpenAI Realtime 多模态模型实现低延迟的语音到语音voice-to-voice对话、文本处理与工具Function Call集成。读完本文你将掌握该扩展的全部配置项含义、pcm_frame等消息协议、Azure OpenAI 接入方式以及它在真实语音助手示例图中的调用链路与底层 WebSocket 实现原理。扩展概览把 OpenAI Realtime 塞进 TEN 图Graphopenai_mllm_python是位于 ai_agents/agents/ten_packages/extension/openai_mllm_python 下的一个 TEN 扩展extension其核心能力是OpenAI 多模态Multimodal集成借助 GPT Realtime 系列模型如gpt-4o-realtime-preview、虚拟模型名gpt-realtime实现语音到语音的实时对话同时支持纯文本处理高度可配置API Key、模型、提示词prompt、temperature、voice 等均可通过 property 配置异步队列处理基于 asyncio 的异步消息循环支持实时消息处理、中断interrupt、任务取消与优先级控制工具Tool集成扩展实现了LLMToolMetadata注册与 Function Call 回调可接入外部工具如天气查询当前仓库中的工具支持已就绪README 中以注释形式保留了图像识别类工具支持的位置。该扩展在 manifest.json 中声明为type: extension、name: openai_mllm_python、版本0.2.2依赖ten_runtime_python0.11与ten_ai_base0.7两个系统包并引入了ten_ai_base的mllm-interface.json接口定义因此它本质上是一个标准的 TENMLLM 类扩展——凡是符合 mllm 接口的上下游扩展ASR、LLM、TTS、消息收集器等都可以与它协同工作。配置项全解析从 manifest 到 property该扩展的 API 定义类型声明位于 manifest.json 的api.property.properties默认值位于 property.json实际运行时在 extension.py 的OpenAIRealtimeConfigpydantic 模型中被解析。核心属性表Property类型默认值说明api_keystring${env:OPENAI_API_KEY}用于 OpenAI 认证的 API Key支持从环境变量读取为空时扩展会在on_init直接报错见 extension.pybase_urlstringwss://api.openai.comWebSocket 服务地址OpenAI Realtime 走 WSS 协议pathstring/v1/realtimeWebSocket 路径最终连接 URL 为base_url pathmodelstringgpt-realtime虚拟模型名模型标识如gpt-4o-realtime-preview若不指定 vendor 且 URL 中无model参数会自动拼接?modelmodellanguagestringen模型回复及输入转写使用的语言如en-US、zh-CN会透传给input_audio_transcription.languagepromptstring空字符串发送给模型的默认系统提示词映射为 Realtime 会话的instructionstemperaturefloat320.9采样温度值越高随机性越强默认值见 property.jsonmax_tokensint322048生成的最大 token 数voicestringalloy模型说话音色如alloy、echo、fable、nova、onyx、shimmer等枚举定义见 struct.py 的Voicesserver_vadbooltrue是否启用 OpenAI 服务端 VAD语音活动检测代码默认Trueextension.pyaudio_outbooltrue是否输出音频为false时会话仅保留textmodalityinput_transcriptbool—是否开启输入转写接口层面保留sample_rateint3224000输入/输出音频采样率代码中同时用于input_audio_sample_rate与synthesize_audio_sample_ratevad_typestringserver_vadVAD 类型server_vad或semantic_vad语义 VADvad_eagernessstringauto语义 VAD 的敏感度low/medium/high/autovad_thresholdfloat320.5server VAD 的判定阈值vad_prefix_padding_msint32300server VAD 语音开始前的前置填充毫秒数vad_silence_duration_msint32500server VAD 判定语音结束所需的静音时长毫秒vendorstring空供应商标识azure表示 Azure OpenAI空表示标准 OpenAIdumpboolfalse是否开启音频 dump 用于调试dump_path指定落盘位置注README 的属性表中出现的dump在代码中对应dump: bool False与dump_path: str extension.pymanifest 的api.property中暂未列出配置时按代码实现为准。底层默认值与语义细节配置在on_init阶段通过ten_env.get_property_to_json(None)整体读取并由 pydantic 的OpenAIRealtimeConfig.model_validate_json校验extension.py类型不符会直接抛错vad_type二选一server_vad时构造ServerVADUpdateParams携带threshold、prefix_padding_ms、silence_duration_mssemantic_vad时构造SemanticVADUpdateParams仅携带eagerness二者均通过session.update下发给模型extension.py若关闭audio_out则modalities被设为[text]只做纯文本对话extension.py。消息协议数据进、数据出与命令README 将该扩展的对外消息划分为四类下面逐一结合源码说明。Data Out文本输出NamePropertyType说明text_datatextstring输出的文本数据在代码层面扩展通过send_server_output_text(MLLMServerOutputTranscript(...))发送增量finalFalse与最终finalTrue的转写/文本并通过send_server_input_transcript上送用户输入转写均携带session_id元数据见 extension.py。Command OutflushName说明flush刷新当前状态后的响应flush语义由消息协议层定义用于在状态被刷新如被新语音打断后通知下游恢复输出。代码中对“中断”的处理体现在InputAudioBufferSpeechStarted分支当服务端检测到新的语音开始扩展会发送MLLMServerInterruptsend_server_interrupted并把被截断的文本标记为[interrupted]后以finalTrue发送同时把该response_id记入flushed集合以丢弃后续过期增量extension.py。Audio Frame In / Out方向Name说明入pcm_frame输入给语音处理的音频帧出pcm_frame语音处理后的音频帧输出音频帧是原始 PCM 数据send_audio直接把AudioFrame的缓冲区frame.get_buf()交给连接层连接层按PCM16、24kHz、单声道、小端序编码为 base64 后封装为input_audio_buffer.append事件发送connection.py服务端返回的response.audio.deltabase64 音频则在扩展中被解码为原始字节经send_server_output_audio_data输出为pcm_frameextension.py。Azure OpenAI 接入README 明确给出该扩展对 Azure OpenAI Realtime 服务的支持配置示例如下{ base_url: wss://xxx.openai.azure.com, path: /openai/realtime?api-versionxxxdeploymentxxx, api_key: xxx, model: gpt-4o-realtime-preview, vendor: azure }代码层面connection.py的区别在于标准 OpenAI使用aiohttp.BasicAuth(, api_key)做 Basic 认证并附加OpenAI-Beta: realtimev1请求头Azure认证头改为api-key: api_key不再需要OpenAI-Beta头Azure 的model、api-version、deployment全部内嵌在path的 URL 查询参数中因此连接层在 URL 已含model时不再自动追加?modelconnection.py。在真实 TEN 应用中配置该扩展voice-assistant-realtime示例是一个可直接对照的完整应用其图定义位于 ai_agents/agents/examples/voice-assistant-realtime/tenapp/property.json。其中扩展节点名为v2vaddon 指向openai_mllm_python{ type: extension, name: v2v, addon: openai_mllm_python, property: { api_key: ${env:OPENAI_API_KEY}, temperature: 0.9, model: gpt-realtime, max_tokens: 2048, voice: alloy, language: en, vad_type: semantic_vad, vad_eagerness: auto, vad_threshold: 0.5, vad_prefix_padding_ms: 300, vad_silence_duration_ms: 500 } }图中消息流向与扩展的消息协议一一对应agora_rtc的pcm_frame远端用户语音经streamid_adapter转发到v2vaudio_frame入向v2v输出的pcm_frame音频帧回流到agora_rtc发布给用户v2v的mllm_server_input_transcript、mllm_server_output_transcript、mllm_server_session_ready、mllm_server_interrupted、mllm_server_function_call等 Data 消息连接到main_controlweatherapi_tool_python通过tool_register命令向main_control注册工具从而打通“模型调用工具→Function Call 回调”的链路。使用前需在环境中配置OPENAI_API_KEYproperty 通过${env:OPENAI_API_KEY}引用必要时同时配置AGORA_APP_ID等声网参数。实现原理异步 WebSocket 消息循环整个扩展的运行核心是start_connection里的异步消息循环extension.py配合RealtimeApiConnection与struct.py的消息模型完整复刻了 OpenAI Realtime API 的客户端-服务端事件协议建连RealtimeApiConnection.connect()用 aiohttp 打开 WSS按 vendor 选择认证方式会话初始化收到session.created后调用_update_session()下发session.update含instructions、model、tools、tool_choice、turn_detection、voice/modalities、input_audio_transcription等收到session.updated后向上游广播MLLMServerSessionReady上行send_audioPCM 音频、send_client_message_itemuser/assistant 文本消息映射为conversation.item.create、send_client_create_responseresponse.create、send_client_register_tool工具注册后触发_update_session重新下发 tools、send_client_function_call_output工具结果回填映射为conversation.item.create的function_call_output下行对response.audio.delta解码为音频帧输出对response.audio_transcript.delta/response.text.delta增量转发为文本输出对conversation.item.input_audio_transcription.*转发用户输入转写对response.function_call_arguments.done触发_handle_tool_call回调中断与打断input_audio_buffer.speech_started时发送MLLMServerInterrupt并截断当前输出[interrupted]标记 flushed集合去重speech_stopped时按audio_end_ms校准相对时间戳断线重连消息循环异常退出后调用_handle_reconnect()先关闭旧连接若未处于stopped状态则延时 1 秒后指数退避重连extension.py消息模型struct.py 用 dataclass 定义了全部 20 种客户端-服务端事件EventType枚举、Session、Response、Usage、ResponseAudioDelta等parse_server_message/parse_client_message按type字段动态反序列化to_json序列化时自动剔除None字段与 Realtime API 的 JSON 协议对齐。依赖方面该扩展运行需要pydantic、pydub0.25.1、aiohttp见 requirements.txtPython 版本要求3.10见 pyproject.toml。小结openai_mllm_python以约 500 行的扩展逻辑 900 行的消息协议层把 OpenAI Realtime 多模态能力完整封装成 TEN 标准 MLLM 扩展既可通过property.json灵活调整模型、音色、VAD 与转写语言也能通过pcm_frame、text_data、flush等消息无缝接入声网 RTC、消息收集器与外部工具。从源码结构看它的中断处理、增量转写与指数退避重连机制使其适合作为实时语音助手图graph中“大脑”节点的生产级参考实现。下一步可以对照 voice-assistant-realtime 示例 直接运行体验或参考 voice-assistant-companion 将其接入更复杂的伴生型语音助手场景。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐Semantic Kernel Python 实时语音多模态实战基于 OpenAI/Azure OpenAI Realtime API 的 WebSocket 与 WebRTC 语音 AgentSemantic Kernel Python 实时语音多模态实战基于 OpenAI/Azure OpenAI Realtime API 的 WebSocket人工智能大模型AI AgentAgent 框架多智能体RAGTEN Framework 集成 StepFun 实时语音模型stepfun-demo 语音 Agent 演示项目实战指南TEN Framework 集成 StepFun 实时语音模型stepfun demo 语音 Agent 演示项目实战指南 本文以 ai_agents/age人工智能AI Agent多模态语音AI 应用QbotAI 量化投研平台全解析——从策略开发、回测到自动化交易的本地部署实战指南QbotAI 量化投研平台全解析——从策略开发、回测到自动化交易的本地部署实战指南 Qbot 是一个以 Python 为核心、面向 AI 的自动化量化投资平台人工智能AI Agent多模态语音AI 应用上一篇为现代化改造项目定制 Copilot 指令doc-and-modernize 技能与 .github/copilot-instructions.md 模板实战指南下一篇Prefect callables 模块深度解析函数签名内省、参数绑定与 JSON Schema 生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表