Hi !RTE 开发者社区的新老朋友们大家好,恰逢 TEN Framework 开源一周年之际,TEN 带着超厉害的 0.1.0 版 来了!
TEN Framework 本次带来了多项功能更新和开发者体验提升,相信 TEN 将成为开发者构建下一代 Voice Agent 的开发利器!
本次更新增加了简化的main概念,让开发者在不修改框架底层代码的情况下,能轻松注入和定制自己的业务逻辑,大大提升了灵活性。此外,新增了对 Node.js 的原生支持,开发更加轻松。
实时转录、AI 实时翻译、情感陪伴、语音助手、心理疗愈、营销 SIP、语音玩具等等各类热门的 Voice Agent 场景,都能通过 TEN Framework 轻松搭建。
以防大家不知道 TEN Framework 超厉害的!
TEN Framework 是一个主流对话式 AI 开源框架,由声网与社区共同支持。基于 TEN Framework,你可以搭建任何可用于生产环境的对话式 Voice Agent。
不少开发者已基于 TEN 上线了自己的 Voice Agent,从 AI 陪伴、口语陪练、语音儿童绘本、 AI 虚拟销售等等。大家也对 TEN 给予了 TEN 高度评价👇
那就让我们仔细聊聊为什么 TEN 超厉害的!
超低延迟体验:框架稳定、可用于生产环境,支持全双工通信,实现可被打断的超低延迟对话,带来更自然的语音体验。
插件灵活可拓展 :TEN 已经接入主流 STT、LLM、TTS 、S2S 模型,同时开发者也可以灵活接入自己想要的模型,高度自由。
开发者友好:不仅支持 Python、Node.js、C++、Go 等多语言开发;也可通过 TMAN Designer 进行拖拽式低代码开发。
多模态支持:TEN 同时支持级联模式与端到端模式,不仅限于语音,还可处理视觉、文本和数据流,构建更具情境感知的交互体验。
这次的 0.10 版本又有什么新内容呢?
TEN 在与开发者的沟通中不断进化。最新发布的 0.10 版本是 TEN Framework 的一个重要里程碑,在易用性与灵活性上,又有了极大的提升:
1. 引入main支持自定义业务逻辑:新增了简化的main概念,这让开发者在不修改框架底层代码的情况下,轻松注入和定制自己的业务逻辑,大大提升了灵活性。
2. 统一的实时协议 v2.0 :对 ASR、LLM、TTS 等核心实时通信协议进行了全面升级。特别是新的 TTS 协议基于 WebSocket,显著降低了延迟并提供了更好的错误处理能力。
3. 更丰富的插件生态:正式增加了对 Sonniox、Speechmatics 和 Hume.ai 的官方支持,为开发者在语音识别、情感分析等方面提供了更多选择。
4. 官方支持 Node.js:Node.js 现在与 Python 和 C++ 一样,成为 TEN 框架的 first-class runtime,为广大的 Node.js 开发者提供了原生支持。
5. TMAN Designer UI 升级 :用于设计和管理语音代理工作流(pipelines)的用户界面 TMAN 进行了更新,响应速度更快,设计体验也更加直观。
来都来了!15 min 就能用 Node.js 捏完你的第一个语音助手
百说不如一练,那就和 TEN 一起,用 Node.js 动手搭建一个语音助手吧!
你无需在 Node.js 中重复造轮子去实现 ASR、LLM 或 TTS 这些底层功能,而是可以直接复用 Python 或 C++ 编写的现有模块或库,将 Node.js 的重心放在核心流程的编排和业务逻辑的开发上。
为什么选择 Node.js + TEN?
TEN 框架为模块化、跨语言开发而设计,在本次的教程中,你将直观体验到 :
RTC-优先的pipeline → 音频/视频/数据流均为实时且延迟低。
跨语言extensions → 可以用 Python 做 ASR,用 C++ 做 TTS,用 Go 做 LLM 等等。
统一编排(orchestration) → Node.js 只需实现 Main Extension,来协调所有组件。业务逻辑用 JavaScript/TypeScript 写,而耗性能的部分交由已经优化过的 extension 进行处理。
项目结构
TEN Framework 的仓库(https://github.com/TEN-framework/ten-framework/tree/main/ai_agents/agents/examples/voice-assistant-nodejs)中,已经提供了一个可用的 Node.js 语音助手示例,无需从 0 开始手搓。
目录结构大致如下(与 GitHub 上示例一致):
.├── index.ts → MainControlExtension (Node.js pipeline logic)├── helper.ts → Utilities for sending Cmd/Data└── agent/├── agent.ts → Event queue and orchestration├── events.ts → Typed events (ASR, LLM, Tools, User)├── llm_exec.ts → Handles LLM requests/responses└── struct.ts → Zod schemas for message validation
入门指南(Getting Started)
建议按照官方的入门指南(https://theten.ai/docs/ten_agent/getting_started)完成基础设置步骤(安装、API 密钥、环境、Docker 等)。
⚠️ 注意:当你执行task use来构建 agent 时,要确保选择 Node.js 语音助手示例:
task use AGENT=agents/examples/voice-assistant-nodejs
这样可以确保你运行的是 Node.js pipeline 版本,同时仍复用 Python/C++ 的 extension 来做 ASR、LLM、TTS。
Main Extension
定义了 MainControlExtension,是 Node.js 的入口点。它会对运行时事件做出反应,并将输出发送到适当的目标(TTS、记录器等)。下面是其四个核心部分:index.ts
1. 用户加入时的欢迎(Greeting on User Join)
当第一个用户加入时,extension 将自动发送欢迎信息。它既会发送给 TTS(这样用户能够听到),也发送给 transcript collector(在对话历史中也能看到)。例如:
this.agent.on(UserJoinedEvent, async () => {this.joinedUserCount++;if (this.joinedUserCount === 1) {await this._send_to_tts(this.config.greeting, true);await this._send_transcript("assistant", this.config.greeting, true, 100);}});
这样,你的语音助手就能总是热情满满地和你 say hi 👋
2. ASR 结果处理(Processing ASR Results)
当语音识别(ASR)产生结果时,extension 将:
跟踪 session/stream ID。
如果输入很长或者是“final”状态,则中断(interrupt)正在进行的 LLM 或 TTS。
将最终用户文本放入 LLM 输入pipeline。
将识别出的文本发送到 transcript collector。
示意代码:
this.agent.on(ASRResultEvent, async (event) => {this.session_id = String(event.metadata?.session_id ?? "100");const stream_id = Number(this.session_id) || 0;if (!event.text) return;if (event.final || event.text.length > 2) {await this._interrupt();}if (event.final) {this.turn_id += 1;await this.agent.queueLLMInput(event.text);}await this._send_transcript("user", event.text, event.final, stream_id);});
这样,用户的语音输入被转换为可用于 LLM 的文本提示。
3. 处理 LLM 响应(Handling LLM Results)
当 LLM 响应时,extension 将:
使用
parseSentences将流式增量(streaming deltas)分拆为完整句子。将每个句子片段立即发送给 TTS。
对每个消息或推理片段,也将 transcript 转发给 collector。
示意代码:
this.agent.on(LLMResponseEvent, async (event) => {if (!event.is_final && event.kind === "message") {const [sentences, remainText] = parseSentences(this.sentenceFragment, event.delta);this.sentenceFragment = remainText;for (const sentence of sentences) {await this._send_to_tts(sentence, false);}}const dataType = event.kind === "message" ? "text" : "reasoning";await this._send_transcript("assistant", event.content, event.is_final, 100, dataType);});
这允许“实时语音合成” — 在用户还不知道模型“思考”完的时候,就开始听到助手机器人的语音。
4. 文本转写(Transcript Handling)
所有 ASR 和 LLM 的文本最终通过_send_transcript方法以结构化格式流向:message_collector
private async _send_transcript(role: string,text: string,final: boolean,stream_id: number,data_type: "text" | "reasoning" = "text",) {await sendData(this.tenEnv, "message", "message_collector", {role,text,is_final: final,stream_id,data_type,text_ts: Date.now(),});}
每一次用户或助手机器人的发言都被一致地记录下来,用于界面显示、调试或分析。
总结要点
在 TEN 框架下,用 Node.js 构建语音助手时,你主要负责编排与业务逻辑,而无需重写 ASR/LLM/TTS。
可以重用 Python 或 C++ 写的扩展模块。
使用 Node.js 管道时仍然能获得低延迟和实时性能。
Just Try it:测试与运行
当你完成设置后:
按照官方入门指南操作。
1. 使用 Node.js agent:
task use AGENT=agents/examples/voice-assistant-nodejstask buildtask run
2.当你修改 Node.js 扩展文件后,需要执行 来重新编译这些扩展task build
3.在浏览器中或设计界面中连接:
在本地通过
http://localhost:3000测试或者用 TMAN Designer 等工具测
4. 开始说话 —— 你的 Node.js 管道会负责协调整个流程
✨ 就酱!你的第一个实时语音助手就已经搭建完啦!请为自己鼓掌👏👏👏
如果你还有更多的创意想法想用 TEN 完成,也欢迎报名由TEN 发起的全球 Voice Agent 挑战赛: TEN Dev Challenge 2025!角逐 11 K美金奖金池!
加入我们的 Voice Agent 社区
RTE 开发者社区持续关注 Voice Agent 和语音驱动的下一代人机交互界面。如果你对此也有浓厚兴趣,也期待和更多开发者交流(每个月都有线上/线下 meetup,以及学习笔记分享),欢迎加入我们的社区微信群,一同探索人和 AI 的实时互动新范式。
加入我们:加微信 Creators2022,备注身份和来意(公司/项目+职位+加群),备注完整者优先加群。
硅谷顶级 VC 如何看语音 AI?Greylock 合伙人揭秘 Voice Agent 构建的三层策略
AI 客服还不够聪明,但已超过月薪五千的人类丨RTE Meetup 回顾
引爆 AI 会议工具潮流,Granola 打造 2.5 亿美元估值产品的秘密丨Voice Agent 学习笔记
活动回顾丨主动式语音 AI:全双工加持,让 AI 既会抢答也懂适时沉默丨RTE Meetup
GPT-4o 之后,Voice 从 Assistant 到 Agent,新机会藏在哪些场景里?|Voice Agent 学习笔记
对话 Wispr Flow 创始人 Tanay:语音输入,如何创造极致的 Voice AI 产品体验
Notion 创始人 Ivan Zhao:传统软件开发是造桥,AI 开发更像酿酒,提供环境让 AI 自行发展
ElevenLabs 语音智能体提示词指南——解锁 AI 语音交互的「灵魂秘籍」丨 Voice Agent 学习笔记
11Labs 增长负责人分享:企业级市场将从消费级或开发者切入丨Voice Agent 学习笔记
实时多模态如何重塑未来交互?我们邀请 Gemini 解锁了 39 个实时互动新可能丨Voice Agent 学习笔记

