人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载simple_echo_cpp 是 TEN Framework 官方提供的一个用 C 编写的扩展extension示例套件核心行为是对收到的命令cmd回传带后缀, too的结果并将收到的数据、音频帧、视频帧原样转发回图graph中。本文以 套件说明文件 为主体结合仓库内的源码、构建脚本与集成测试完整讲解该扩展的结构、实现原理、安装方式以及在 TEN 应用中的集成配置帮助你快速掌握 TEN Framework 的 C 扩展开发与联调套路。概述这个套件是什么simple_echo_cpp 是「Simple echo extension example written in C for TEN Framework」——一个用 C 编写的简单回声扩展示例作为 TEN Framework 的软件套件组件存在。它不依赖任何第三方 AI 服务或业务库唯一的系统级依赖是ten_runtime运行时因此是学习 C 扩展生命周期、消息处理与图graph数据流的最佳入门范本。从功能上看它实现了 TEN 扩展最常见的四类消息处理命令cmd收到命令后构造一个同名、带, too后缀的结果回传例如收到hello_world则返回hello_world, too数据data将收到的缓冲区内容复制后重新发送视频帧video_frame复制帧数据与宽高、像素格式、时间戳等元数据后重新发送音频帧audio_frame复制帧数据与采样率、通道数等元数据后重新发送。这一「回显」设计使其非常适合用来验证图连接是否打通、消息路由是否正确以及 C 扩展的编译、加载与注册链路是否正常。套件结构与文件说明整个套件的文件布局如下均位于仓库 packages/example_extensions/simple_echo_cpp文件作用src/main.cc扩展核心实现继承ten::extension_t并处理四类消息manifest.json套件元数据类型、名称、版本、多语言显示名、依赖声明property.json扩展属性配置当前为空对象{}BUILD.gnGN 构建脚本打包资源、编译源码、声明依赖LICENSEApache 2.0 许可声明docs/README.zh-TW.md等多语言说明文档en-US / zh-CN / zh-TW / ja-JP / ko-KR套件类型为extension版本与当前仓库运行时保持一致0.11.73并带有cpp标签便于 TEN 生态中的检索与依赖匹配。核心实现源码解析src/main.cc扩展主体定义在 src/main.cc 中核心类simple_echo_extension_t继承自ten::extension_t头文件ten_runtime/binding/cpp/ten.h并通过宏注册为 addonTEN_CPP_REGISTER_ADDON_AS_EXTENSION(simple_echo_cpp, simple_echo_extension_t);TEN_CPP_REGISTER_ADDON_AS_EXTENSION宏定义于 core/include/ten_runtime/binding 的 C binding 头文件中将simple_echo_cpp注册为扩展类型的 addon 名称这是应用图配置中addon字段必须与之匹配的关键也是扩展被框架按名加载的入口。命令处理on_cmdon_cmd 实现 是整个套件的核心业务逻辑void on_cmd(ten::ten_env_t ten_env, std::unique_ptrten::cmd_t cmd) override { std::string cmd_name cmd-get_name(); auto cmd_result ten::cmd_result_t::create(TEN_STATUS_CODE_OK, *cmd); cmd_result-set_property(detail, cmd_name , too); ten_env.return_result(std::move(cmd_result)); }处理流程清晰可见通过cmd-get_name()取出命令名称用ten::cmd_result_t::create(TEN_STATUS_CODE_OK, *cmd)以成功状态码创建结果对象必须关联原 cmdTEN 据此才能把结果路由回发送方在结果的detail属性中写入命令名 , too实现「回声」效果调用ten_env.return_result()将结果返回给图。这里揭示了 TEN 命令机制的要点命令由上游扩展发出结果必须通过return_result回传且结果对象在创建时绑定原始命令框架据此完成跨扩展的请求-响应配对。数据处理on_dataon_data 实现 演示了缓冲区buf的完整读写流程auto buf >new_video_frame-set_width(video_frame-get_width()); new_video_frame-set_height(video_frame-get_height()); new_video_frame-set_pixel_fmt(video_frame-get_pixel_fmt()); new_video_frame-set_timestamp(video_frame-get_timestamp()); new_video_frame-set_eof(video_frame-is_eof());这里展示了video_frame_t的完整属性面宽高width/height、像素格式pixel_fmt、时间戳timestamp与结束标志eof。同时注意原帧在复制完成后调用了video_frame-unlock_buf(buf)解锁避免资源泄漏。音频帧处理on_audio_frameon_audio_frame 实现 与视频帧对称搬运的音频元数据更细new_audio_frame-set_sample_rate(audio_frame-get_sample_rate()); new_audio_frame-set_bytes_per_sample(audio_frame-get_bytes_per_sample()); new_audio_frame-set_samples_per_channel(audio_frame-get_samples_per_channel()); new_audio_frame-set_channel_layout(audio_frame-get_channel_layout()); new_audio_frame-set_number_of_channels(audio_frame-get_number_of_channels()); new_audio_frame-set_timestamp(audio_frame-get_timestamp()); new_audio_frame-set_eof(audio_frame-is_eof()); new_audio_frame-set_data_fmt(audio_frame-get_data_fmt()); new_audio_frame-set_line_size(audio_frame-get_line_size());可见audio_frame_t的属性面包括采样率、每样本字节数、每通道样本数、通道布局、通道数、时间戳、EOF、数据格式与行大小——完整覆盖了 PCM 音频在 TEN 图中的传递需求。从源码结构看这个套件刻意省略了生命周期回调on_init/on_start/on_stop等与属性读取逻辑property.json 为空对象将注意力集中在消息处理本身使代码量最小化、可读性最大化。套件元数据manifest.json 解读manifest.json 定义了套件的身份与依赖{ type: extension, name: simple_echo_cpp, version: 0.11.73, display_name: { locales: { ... } }, description: { locales: { ... } }, readme: { locales: { ... } }, tags: [cpp], dependencies: [ { type: system, name: ten_runtime, version: 0.11.73 } ], api: {} }几个关键字段type/name/version套件类型为extension名称simple_echo_cpp版本0.11.73三者共同构成套件的唯一标识也是应用 manifest 中依赖声明的匹配依据display_name/description/readme均为多语言en-US / zh-CN / zh-TW / ja-JP / ko-KR结构其中readme通过import_uri指向对应语言的说明文档即本仓库 docs/README.zh-TW.md 等文件tags[cpp]标记语言实现供生态搜索与筛选dependencies唯一的必需依赖是系统级套件ten_runtime版本0.11.73。这正对应原文档「前置条件manifest.json 中指定的必需相依性」——安装该扩展前运行时必须就绪且版本匹配api当前为空对象表示该扩展未声明对外接口interface属于纯示例套件。构建配置BUILD.gn 解读BUILD.gn 描述了套件的打包与编译规则ten_package(simple_echo_cpp) { package_kind extension resources [ LICENSE, manifest.json, property.json ] // docs 目录下的多语言 README 通过 glob 脚本一并打包 sources [ src/main.cc ] include_dirs [ //core/src, //core ] deps [ //core/src/ten_runtime, //third_party/nlohmann_json, ] }要点package_kind extension与 manifest 中的type: extension保持一致resources将LICENSE、manifest.json、property.json与docs/**打包进套件产物sources指定源码src/main.ccdeps链接运行时//core/src/ten_runtime与 JSON 库//third_party/nlohmann_json源码中确实使用了nlohmann/json.hpp当ten_enable_ten_manager开启时会额外生成ten_package_publish目标用于发布套件到远端仓库。安装按原文档说明安装遵循 TEN Framework 套件安装指南。在 TEN 生态中扩展套件的安装由包管理器tman完成。典型流程详见 C 扩展开发指南# 验证 tman 环境 tman --version # 在应用项目目录安装依赖套件含 simple_echo_cpp 及其依赖 ten_runtime tman install --standalonetman install会根据应用 manifest 中的依赖声明解析并下载匹配版本的扩展套件到本地.ten/app/ten_packages/目录。由于 simple_echo_cpp 的版本声明与ten_runtime严格绑定均为0.11.73安装时会自动完成版本兼容校验。集成到 TEN 应用图配置实战原文档指出「此套件可以根據框架規範整合到 TEN 應用程式中」。在 TEN 中扩展之间的连接关系通过应用的property.json中的predefined_graphs定义依赖则声明在应用manifest.json中。仓库中的集成测试真实展示了完整接入方式。以 tests/ten_runtime/integration/cpp/restful 为例应用 manifest 声明依赖{ type: app, name: default_app_cpp, version: 0.11.73, dependencies: [ { type: system, name: ten_runtime, version: 0.11.73 }, { type: extension, name: simple_http_server_cpp, version: 0.11.73 }, { type: extension, name: simple_echo_cpp, version: 0.11.73 } ] }应用图配置restful_app/property.json中将simple_echo_cpp作为图节点并建立命令路由{ ten: { predefined_graphs: [ { name: http_service, auto_start: true, graph: { nodes: [ { type: extension, name: simple_http_server_cpp, addon: simple_http_server_cpp, extension_group: default_extension_group }, { type: extension, name: test_extension, addon: simple_echo_cpp, extension_group: default_extension_group } ], connections: [ { extension: simple_http_server_cpp, cmd: [ { name: hello_world, dest: [ { extension: test_extension } ] } ] } ] } } ] } }对照源码即可验证完整链路HTTP 服务扩展收到hello_world命令后按connections路由到test_extension即 simple_echo_cpp 实例其 on_cmd 将返回 detail 为hello_world, too的结果最终由 HTTP 端回传调用方。这也是回声语义在真实应用中的典型用法用回声扩展充当联调桩验证请求是否成功穿越图拓扑。在 tests/ten_runtime/integration/cpp/import_graph 的 test_graph.json 中同样的节点与连接被独立成图文件展示了将图配置外置为独立 JSON 的另一种集成方式。两处测试共同证明了该扩展在真实应用中被反复用作消息链路的验证节点。验证与调试建议以回声结果校验路由发送任意命令检查返回的detail是否为命令名 , too即可确认图连接与命令路由是否生效用数据/帧回显校验媒体流向扩展发送 data、audio_frame 或 video_frame对比收发内容的缓冲区与元数据是否一致可用于排查媒体链路的复制与转发逻辑结合集成测试定位问题仓库 tests/ten_runtime/integration/cpp 下的 restful、import_graph、interface_schema_check 等测试均引入了 simple_echo_cpp可作为复现与对照环境。授權此套件是 TEN Framework 專案的一部分遵循 Apache License 2.0 许可见 LICENSE。使用与二次开发时请遵守相应许可条款。通过本文可以看到simple_echo_cpp 虽然代码量极少却完整覆盖了 TEN C 扩展的注册、命令结果回传、缓冲区锁定读写、音视频帧元数据搬运等核心范式是理解 TEN Framework 扩展机制与图数据流的最佳入门素材。掌握它之后你便有了一个可随时插入任意图拓扑、用于验证链路通畅的通用回声组件。赞分享人工智能AI Agent多模态语音AI 应用【免费下载链接】ten-frameworkOpen-source framework for conversational voice AI agents项目地址https://gitcode.com/TEN-framework/ten-framework点击查看免费下载相关推荐TEN Framework 官方 Python 回声扩展示例 simple_echo_python 完全解读从安装集成到消息回显实现TEN Framework 官方 Python 回声扩展示例 simple_echo_python 完全解读从安装集成到消息回显实现 本篇技术指南围绕 TEN人工智能AI Agent多模态语音AI 应用TEN Framework 中 Groq TTS Python 扩展的集成与实现解析TEN Framework 中 Groq TTS Python 扩展的集成与实现解析 导读 本文以 TEN framework 仓库中的 groq_tts_py人工智能AI Agent多模态语音AI 应用TEN Framework 语音助手长期记忆扩展实战PowerMem / EverMemOS 对话记忆集成深度解析TEN Framework 语音助手长期记忆扩展实战PowerMem / EverMemOS 对话记忆集成深度解析 本指南围绕 TEN framework 仓人工智能AI Agent多模态语音AI 应用上一篇exelban/stats恢复方案数据丢失应对措施下一篇10分钟极速上手go-zero RPC代码生成goctl提升开发效率的实战技巧创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
自建日志异常检测系统实战:从日志采集到智能告警的完整指南 日志爆炸、告警疲劳、凌晨三点被电话叫醒去查一个其实已经持续了两个小时的故障——这些事情我相信做运维和SRE的朋友都不陌生。我最早接触日志分析自动化,就是因为一次印象极其深刻的线上事故:业务日志量在凌晨突然暴涨,磁盘直接被写满&… · 2026/9/25 3:03:21
碳资产保险框架落地:劳合社辛迪加承保交通能源领域 从劳合社市场看到这条消息的时候,我第一反应是:碳信用额这个长期被保险公司当成“烫手山芋”的标的,终于有人开始认认真真做承保架构了。1089 Inc. 联合 Price Forbes 和 Oka-Lloyd,通过 Syndicate 1922 推出面向交通与能源领域的… · 2026/9/25 3:03:21
微信小程序影院选座系统高并发实战 /* 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 3:03:21
HTTP头大小写引发的静默故障:从协议到Nginx、Go、Node.js的排查与规范 1. 问题现场:一个头名字引发的“静默故障”先讲一个我实际处理过的线上故障。用户调我们的网关接口,用一个自定义头X-Auth-Token做鉴权。本地用 Postman 测,一切正常;换到 Java 客户端调,服务端日志里永远取不到这个头… · 2026/9/25 3:31:13
计量芯片封装选型:面积、功能与良率的三重权衡 /* 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 3:31:13
SYN Flood实验:用WinXP复现TCP半开连接攻击原理 /* 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 3:31:07
TwinCAT3运动控制:MC_Power与MC_Home功能块的工程应用实践 /* 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 3:31:07
C语言结构体内存对齐全解析:sizeof背后的字节填充规则 刚学C语言的时候,很多人会卡在结构体这一关,尤其是当别人告诉你"结构体的大小不等于成员大小之和"的时候。明明就是几个变量放在一起,为什么sizeof算出来的结果比预想的多好几个字节?这就是结构体内存对齐在起作用。这篇… · 2026/9/25 3:31:07
BAML C 桥接层程序引导证据探针:从编译器字节恒等到原生初始化失败缓存的完整验证 编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读
BAML 编译器输出的 .baml 程序字节码最终要进入 C# 运行时,这一路径上每一… · 2026/9/25 3:31:01
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* 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 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* 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 1:00:37