TEN Framework 视频语音助手示例 voice-assistant-video:快速上手与架构深度解析
人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载视频语音助手Voice Assistant with Video是 TEN Framework 官方提供的一个具备视觉感知能力的对话式语音 AI 示例在经典「ASR → LLM → TTS」语音链路之上额外接入 RTC 视频帧与视觉分析工具让智能体既能听、能说还能看。本文以 ai_agents/agents/examples/voice-assistant-video/README.md 为主线完整讲解从环境安装、一键启动到图Graph架构、主控扩展源码实现的全部细节读者将掌握该示例的运行方法、图编排原理以及基于事件驱动模型二次开发视频语音 Agent 的具体路径。示例定位一个带视觉能力的语音 Agentvoice-assistant-video是 TEN Framework 的 AI Agent 示例集ai_agents/agents/examples中面向视频交互场景的参考实现。相比纯语音示例它在会话中引入了视频帧的采集与分析通过 Agora RTC 订阅远端视频流将视频帧送给视觉分析工具vision_analyze_tool_python再借助一个独立的视觉 LLM 实例vllm完成图像内容理解使 Agent 具备看图说话的能力。整个示例以 TEN Framework 的Graph预定义图为核心组织方式所有能力RTC 接入、ASR、LLM、TTS、视觉分析、主控逻辑、转写收集都被抽象为 extension 节点通过 property 配置完成节点间的数据流编排无需修改任何运行时代码即可调整链路。快速开始三步跑起视频语音助手官方 README 给出的启动流程非常简洁共三步。第一步安装依赖task install该命令通过仓库内的 Taskfile.yml 定义的任务链完成四件事子任务目录实际执行install-tenapp./tenapptman install按 manifest.json 声明安装全部 TEN 扩展依赖install-tenapp-python-deps./tenapp执行 scripts/install_python_deps.sh安装 Python 侧依赖install-frontend../../playgroundbun install --verbose安装前端 playground 的依赖build-api-server../../servergo mod tidy go mod download go build -o bin/api main.go编译 server 目录下的 API 服务执行task install前需要确保本机已具备Task任务执行器、tmanTEN 包管理器安装方式见 tools/tman/install_tman.sh、bun前端依赖管理与Go工具链。第二步启动应用task runtask run会以并行方式拉起三个进程见 Taskfile.yml 中run任务的depsrun-gd-server在./tenapp下执行tman designer启动 TMAN Designer 的 HTTP 开发服务run-frontend在playground目录执行bun run dev启动 Web 前端run-api-server执行./bin/api -tenapp_dir{{.PWD}}/tenapp以 tenapp 目录为参数启动 API 服务即上一步编译出的 Go 二进制。其中tenapp目录下的 main.go 是 TEN 应用入口它通过ten.NewApp创建应用实例并支持通过-property参数显式指定property.json路径未指定时使用默认 property.json随后appInstance.Run(true)阻塞运行。第三步访问应用启动完成后示例会开放三个端口服务地址说明前端界面http://localhost:3000playground 提供的 Web 交互页面负责连接 RTC、展示对话与视频API 服务http://localhost:8080Go 实现的 HTTP API供前端调用TMAN Designerhttp://localhost:49483TEN 图可视化设计与调试工具环境变量运行前必须准备Taskfile.yml 第 3 行通过dotenv: [../../../.env]加载环境变量文件因此使用前应在对应位置即ai_agents目录下的.env配置第三方服务密钥。结合 property.json 中${env:...}的引用本示例需要以下变量环境变量用途默认/取值示例AGORA_APP_IDAgora RTC 应用 ID必填无默认值AGORA_APP_CERTIFICATEAgora 证书用于生成 token${env:...|}语法表示可为空空字符串DEEPGRAM_API_KEYDeepgram ASR 密钥必填无默认值OPENAI_API_KEYOpenAI 兼容 LLM 密钥必填无默认值OPENAI_MODELLLM 模型名无默认值OPENAI_PROXY_URL可选代理地址空字符串ELEVENLABS_TTS_KEYElevenLabs TTS 密钥必填无默认值需要注意的是本示例在代码与配置层面只负责读取这些密钥并转发给对应扩展密钥本身的获取与费用由各第三方服务商负责属于运行前提而非仓库内容。核心架构预定义图Predefined Graph编排示例的精华在于 property.json 中名为voice_assistant的预定义图。它声明了 9 个 extension 节点与它们之间的数据连接理解这张图就等于理解了整个示例的工作方式。节点Nodes一览节点名Addon作用agora_rtcagora_rtc音视频实时通信接入订阅远端音视频、发布本地音频并上报用户加入/离开事件streamid_adapterstreamid_adapter在 RTC 多流与 ASR 单流之间做流 ID 适配sttdeepgram_asr_python语音识别模型nova-3语言en-USllmopenai_llm2_python主对话 LLM负责自然语言理解与回复生成ttselevenlabs_tts2_python语音合成输出pcm_16000格式main_controlmain_python整个 Agent 的主控逻辑会话状态、打断、转写分发message_collectormessage_collector2收集并转发对话转写/消息数据vision_tool_pythonvision_analyze_tool_python视觉分析工具接收视频帧向 LLM 注册 toolvllmopenai_llm2_python第二个 LLM 实例专用于视觉内容理解由vision_tool_python触发其中主控扩展main_python的自述文档位于 ten_packages/extension/main_python/README.md是理解本示例业务逻辑的第一手资料。关键数据流Connections图中连接关系定义了各能力的协作方式按数据方向可分为三类1音频上行用户说话 → 识别agora_rtc (audio_frame: pcm_frame) → streamid_adapter → stt (audio_frame: pcm_frame) stt (data: asr_result) → main_control (data: asr_result)远端用户音频经 RTC 采集、流适配后送入 Deepgram 做语音识别识别结果含中间/最终结果以asr_result数据流进入主控扩展。2音频下行回复合成 → 播放main_control → tts (tts_text_input) [通过 send_data 命令直发] tts (audio_frame: pcm_frame) → agora_rtc (audio_frame 的 source)主控扩展把 LLM 回复按句子切分后通过_send_to_tts发送给 TTS 扩展见下文源码合成的 PCM 音频再回流到 RTC 发布给远端用户。3视频上行视觉感知agora_rtc (video_frame: video_frame) → vision_tool_python vision_tool_python (cmd: chat_completion) → vllmRTC 订阅到的视频帧被送入视觉工具视觉工具以 tool 形式向 LLM 注册能力main_control的tool_register命令来源即vision_tool_python当 LLM 需要看图时通过chat_completion命令调用vllm完成多模态推理。4用户会话与消息agora_rtc (cmd: on_user_joined / on_user_left) → main_control main_control → message_collector (data: message) [转写/消息下行] message_collector (data: data) → agora_rtc (data 的 source) [发回前端展示]LLM 双实例的设计意图图中存在llm与vllm两个openai_llm2_python实例llm承载主对话带greeting、max_memory_length: 10等记忆参数vllm仅作为视觉推理通道由视觉工具按需触发。这种对话推理与视觉推理分离的编排方式是本示例在工程上区别于纯语音 Agent 的关键设计。主控扩展 main_python 源码级解析main_controladdon 为main_python是整个 Agent 的大脑采用事件驱动 异步队列的架构核心代码集中在 ten_packages/extension/main_python 下。1. 事件模型agent/events.pyevents.py 定义了 5 种 Agent 事件统一继承自AgentEventBase事件类型触发来源UserJoinedEventcmdRTC 用户加入UserLeftEventcmdRTC 用户离开ToolRegisterEventcmd视觉工具注册携带LLMToolMetadata与来源扩展名ASRResultEventdataSTT 识别结果text/final/metadataLLMResponseEventdataLLM 流式回复delta/text/is_final/type2. Agent 核心agent/agent.pyagent.py 中的Agent类提供三块核心能力事件注册与分发on()方法同时支持agent.on(EventType, handler)与agent.on(EventType)两种注册方式_dispatch()将事件按类型顺序派发给已注册处理器双队列异步消费_asr_queue与_llm_queue两个asyncio.Queue分别缓存 ASR 与 LLM 事件由_consume_asr/_consume_llm两个常驻协程消费保证事件处理有序LLM 消费时通过asyncio.create_task包装处理器便于在打断时取消进行中的任务LLM 控制register_llm_tool()向 LLM 注册工具、queue_llm_input()将用户文本入队、flush_llm()清空队列并取消活动任务、stop()完成优雅停机。3. 主控扩展extension.pyextension.py 中的MainControlExtension继承AsyncExtension在on_init中加载配置并自动扫描带agent_event_handler装饰器的方法完成事件绑定decorators.py 通过给方法附加_agent_event_type属性实现标记。其业务逻辑包括问候语首个用户加入_rtc_user_count从 0 变 1且配置了greeting时向 TTS 发送问候语并输出转写。问候语来自 config.py 中的MainControlConfig默认值为Hello, I am your AI assistant.ASR 流式处理非空文本触发_interrupt()打断正在进行的 LLM/TTS 输出提升交互实时性最终结果入队交给 LLMLLM 流式处理与句子切分借助 helper.py 的parse_sentences()按标点中英文逗号、句号、问号、感叹号切分增量文本完整句子立即送 TTS 播报剩余片段缓存等待下一增量——这是实现边说边出低延迟体验的关键打断机制_interrupt()清空句子缓存、flush_llm()中断 LLM 推理并向 TTS 发送tts_flush、向 RTC 发送flush命令保证用户抢话时系统立即停止播报。4. LLM 执行器agent/llm_exec.pyllm_exec.py 的LLMExec负责与 LLM 扩展的完整交互通过AsyncQueue串行处理用户输入以chat_completion命令向llm扩展发起流式请求streamingTruetemperature0.7携带tools列表使用parse_llm_response解析流式响应按LLMResponseMessageDelta / MessageDone / ReasoningDelta / ReasoningDone / ToolCall分派处理工具调用LLMResponseToolCall时根据tool_registry找到注册该工具的来源扩展向其发送tool_call命令再把工具结果以function_call_output消息回填上下文并继续追问 LLM形成完整的 Function Call 循环flush()时通过abort命令携带request_id通知 LLM 侧终止当前请求。5. 直发辅助函数helper.pyhelper.py 提供_send_cmd/_send_cmd_ex/_send_data三个便捷方法通过Loc(, , dest)指定目标扩展即可在不显式建立连接的条件下向图内任意扩展发送命令/数据。源码注释明确指出这类用法包含针对当前图结构的假设假定目标扩展必然存在于图中因此它适用于业务编排扩展通用型扩展应避免使用。运行环境细节与扩展阅读tenapp 启动脚本scripts/start.sh 是 tman 启动 tenapp 时实际执行的脚本它在启动bin/main前配置了三类运行时路径PYTHONPATH指向ten_packages/system/ten_ai_base/interface确保 Python 扩展可导入ten_ai_baseLD_LIBRARY_PATH加载agora_rtc_sdk、agora_rtm、azure_speech_sdk等原生库NODE_PATH指向ten_runtime_nodejs/lib。脚本中注释掉的TEN_ENABLE_PYTHON_DEBUG/TEN_PYTHON_DEBUG_PORT环境变量表明如需调试 Python 扩展可取消注释并配合远程调试器使用。依赖声明manifest.json 是 tenapp 的包清单声明了ten_runtime_go版本 0.11、agora_rtc0.23.9-t1、ten_ai_base0.7等版本化依赖并通过path形式引用仓库内 ten_packages/extension 下的本地扩展ASR/TTS/LLM 全家桶、streamid_adapter、message_collector2、vision_analyze_tool_python等。它同时声明了scripts.start对应start.sh与scripts.build对应install_python_deps.sh。打包发布如需将示例打包发布可执行task release该任务调用 ai_agents/scripts/release.sh 并传入 tenapp 目录路径产出可分发的 TEN 应用包。延伸阅读纯语音无视频版本参考同目录下的 voice-assistant与本示例形成对照前端交互界面源码位于 playgroundAPI 服务源码位于 server想了解图上其他扩展的完整行为可在 ai_agents/ten_packages/extension 中查找对应 addon如vision_analyze_tool_python、deepgram_asr_python、elevenlabs_tts2_python的 manifest 与 README。小结voice-assistant-video是理解 TEN Framework「图编排 事件驱动 Agent」理念的极佳范本三条命令即可启动一套完整的视频语音 Agent通过 property.json 的图配置可以清晰看到音视频上行、回复下行、视觉推理三条数据通路的协作关系而main_python扩展则以「事件 双队列 可取消任务」的方式优雅地解决了流式 ASR/LLM/TTS 协同、句子级低延迟播报与抢话打断等真实场景问题。无论是要快速验证视频语音 Agent 的效果还是以此为模板开发自己的多模态 Agent本示例都是值得从图配置与源码两个层面精读的起点。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐TEN Framework voice-assistant-video 中的 main_python 扩展语音助手核心控制逻辑的架构与实现解析TEN Framework voice assistant video 中的 main_python 扩展语音助手核心控制逻辑的架构与实现解析 导读 main人工智能AI Agent多模态语音AI 应用TEN Framework RTM Transport 示例实战基于 Agora RTC 与 RTM 双通道的语音助手架构TEN Framework RTM Transport 示例实战基于 Agora RTC 与 RTM 双通道的语音助手架构 导读 rtm transport人工智能AI Agent多模态语音AI 应用终极指南如何快速构建多用途语音助手 - TEN-framework实战案例详解终极指南如何快速构建多用途语音助手 TEN framework实战案例详解 想要构建功能强大的语音AI助手吗TEN framework作为开源的对话式语音A人工智能AI Agent多模态语音AI 应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

学习C语言途中的里程碑

学习C语言途中的里程碑

学扫雷游戏有感在完成扫雷游戏的过程中我遇到了各种各样的困难,例如分不清主次函数经常会有头文件的忘加等等语法错误编辑错误和运行错误,如果没有老师们的帮助我可以说是寸步难行,本身我感觉自己已经学的不错但从这之后我才意识到自己只是学…

2026/9/25 13:15:19 阅读更多 →
你的文件真的安全吗?这款“断网可用”的PDF转换器给出了答案

你的文件真的安全吗?这款“断网可用”的PDF转换器给出了答案

你有没有想过一个问题:当你把一份包含个人身份证、合同条款或公司财务数据的PDF上传到某个在线转换网站时,你的文件到底去了哪里? 这不是危言耸听。大多数在线PDF转换工具的工作原理很简单——你把文件上传到对方的服务器,服务器…

2026/9/25 8:57:06 阅读更多 →
KNN 算法入门指南:从近邻思想到模型调优与评估

KNN 算法入门指南:从近邻思想到模型调优与评估

在机器学习的算法家族中,KNN(K-Nearest Neighbors,K近邻)是最直觉、最容易理解的算法之一。它没有复杂的数学推导,不需要训练过程,核心思想用一句话就能说清:"看看你周围的人是谁&#xff…

2026/9/24 7:11:53 阅读更多 →

最新新闻

3D校园导航系统开发实战:Three.js与A*算法应用解析

3D校园导航系统开发实战:Three.js与A*算法应用解析

1. 项目立项与需求分析1.1 为什么选择3D校园导航这个思路来源于一次典型的“软件工程课程设计”式需求:给学校做一个校园导航系统。但一开始大家讨论的是平面地图导航,类似百度地图那种。后来聊到新生报到的时候,很多人在校园里找不到楼、找不…

2026/9/25 13:54:16 阅读更多 →
5个免费AI写作软件搭配TaoToken:效率办公告别熬夜加班苦日子

5个免费AI写作软件搭配TaoToken:效率办公告别熬夜加班苦日子

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

2026/9/25 13:54:16 阅读更多 →
AI视频生成新手第一课:用Seedance2-Skill快速上手即梦Seedance 2.0提示词(完整指南)

AI视频生成新手第一课:用Seedance2-Skill快速上手即梦Seedance 2.0提示词(完整指南)

AI视频生成新手第一课:用Seedance2-Skill快速上手即梦Seedance 2.0提示词(完整指南) 【免费下载链接】seedance2-skill skill to create best prompts for generating videos with seedance2.0 项目地址: https://gitcode.com/gh_mirrors/s…

2026/9/25 13:54:16 阅读更多 →
C#酒店管理系统源码实战:WinForms前台与SQL Server后台全解析

C#酒店管理系统源码实战:WinForms前台与SQL Server后台全解析

简介:这是一套基于C#的酒店管理系统源码,适合学习桌面应用程序开发、酒店业务信息化管理的学生或初级开发者使用。系统覆盖前台与后台两大核心场景:前台支持预约、入住、换房、退房结算、客户信息维护及按房间号消费;后台提供财产…

2026/9/25 13:54:16 阅读更多 →
Atlas 300V 24G加速卡详解与YOLO部署实战指南

Atlas 300V 24G加速卡详解与YOLO部署实战指南

如果你最近在网络上看过"atlas"这个词,八成绕不开华为昇腾系列AI加速卡。作为长期做深度学习部署的从业者,我几乎每天都要跟它打交道。最近不少朋友在问两件事:一是"atlas部署yolo怎么搞",二是"atlas 30…

2026/9/25 13:54:16 阅读更多 →
Agent技能模块化实战:解耦、注册表与稳定性设计

Agent技能模块化实战:解耦、注册表与稳定性设计

第一次尝试构建一个全能型Agent时,我很快发现了一个尴尬的事实:无论我把主循环写得多么巧妙,真正决定好不好用的,永远是那些挂在外面的小工具。我最早的那个Agent,里塞了几十种能力,从查天气到读PDF再到调用…

2026/9/25 13:53:15 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/25 11:15:26 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →