一条老街两小时,一位不背导游词的 AI 讲解:途说如何用端到端具身交互智能让城市导览活起来(1)
文章目录
跟团游的经典一幕:导游举着小旗站在骑楼下,用 90 秒背完这段老街的讲解词,“给大家二十分钟自由拍照,十一点半集合”。你拍完照,对这条街的了解还是零。
途说(Túshuō)就是为这些"走过了却没走进"的街道做的。她以本地向导的形象常驻在城市导览小程序里,你走到哪她讲到哪——在一栋骑楼前停下,她讲这栋楼当年的绸缎庄往事;你随口问"那个铁窗为什么是这个花纹",她顺着话头讲下去,不会把你拽回既定路线。
魔珐星云是一套端到端具身交互智能平台,让 AI 通过屏幕和机器人进入真实世界,成为能够感知、理解、表达并行动的智能体。本文拿途说当样本,拆一拆一个城市文旅应用怎么基于这套平台,用一个 SDK 把感知、大脑、表达整条链路打通,让 AI 向导跑完"定位—讲解—追问—引路"这一整套导览流程。
出发前:为什么城市导览特别适合端到端具身交互智能?
景区讲解这行做过不少数字化:扫码听录音、租导览器、AR 导航——体验基本都停在"你走到哪,它放到哪",单向广播,问不了问题。
真实的向导不是这样。
好的本地向导带队全程都在观察:游客在哪个门面前放慢了脚步,就把那个故事讲出来;游客问了个计划外的问题,他顺着答,答完自然带回主线;发现游客累了,主动砍掉一个点。这种持续感知 → 持续理解 → 持续决策 → 持续表达与行动 → 持续反馈的循环(星云管它叫 Continuous Interaction Loop,持续交互循环),才是"导览"和"播放"的区别。
得说句公道话:语音识别、大模型、语音合成这些能力本身都在快速进步,单看每一项,都比三年前好用太多。街区导览真正的坎不在某一环的能力,而在"连接"——位置触发归位置、识别归识别、生成归生成、合成归合成,四段各管一段,中间的状态不共享。游客在牌坊前问一句"这是哪个年代的",等大模型答完、语音合成完,人已经走出去五十米了。更难的是耳机场景:你听讲解时随口问了同伴一句"前面吃啥",系统分不清这句不是问它——因为在它那里,听和说是两段独立的流程。
这就是典型的"不是端到端"。
星云把"听"这件事重新做了一遍。老街是天然的高噪环境:叫卖声、车流、旅行团小喇叭、你自己的脚步声。算法降噪、AEC 抗回声、本体声音抑制、VAD、远场语音、Double Talk / Barge-in 智能打断这一整套下来,途说能分清三件事:你是在对着她说话,还是在跟同伴聊天,还是只是在清嗓子。多模态感知的核心从来不是"听见一句话",而是持续知道现场正在发生什么;视觉那一侧同样——摄像头感知到你走进讲解范围,她会主动开口"抬头看二楼",而不是等 GPS 定位到一个坐标点再播录音。主动交互的起点是"她看见你来了",不是"你踩到点了"。
导览的体验,一半在"讲得对",另一半在**“你在听的时候问,我立刻答”**。
第一站:一个 SDK 撑起一条老街
途说基于魔珐星云端到端 SDK XingyunAvatarAgent 构建,核心业务代码不到 500 行。整个前端对接只需要三步:提供一个 DOM 容器、注册一组回调、调用 agent.ask() 发送消息。
import { XingyunAvatarAgent } from '@xingyun/avatar-agent';
const guide = new XingyunAvatarAgent({
container: document.getElementById('street-root'),
avatarId: 'tushuo-local', // 控制台配置:休闲装、本地向导气质
persona: TUSHUO_PERSONA,
voice: { rate: 1.0 },
geo: { radius: 30, minIntervalMs: 15000 }, // 30米触发圈,15秒冷却
});
// 位置触发:进入讲解圈,先抛钩子再讲
guide.on('enterZone', (zone) => {
if (guide.state === 'speaking') zoneQueue.push(zone); // 正在讲就排队,不打架
else guide.ask(zone.hook); // "抬头看这个铁窗,藏了个故事"
});
// 游客追问:讲解中随时问
guide.on('interrupt', (q) => {
const answer = knowledge.qa(zoneNow, q); // 优先命中本地知识库
guide.ask(answer ?? fallback(q)); // 未命中再走大模型,禁止编造
});
await guide.init();
guide.ask(`欢迎来到赤坎老街。我们边走边聊,看到什么想问的,直接开口就行。`);
导览小程序首屏:地图上三个讲解圈点亮 + 途说向导形象待机
途说向导形象选择:


enterZone 排队这个细节花了不少时间调:两个讲解圈重叠时,传统方案会两段录音抢着播,途说的处理是"正在讲就排队,讲完用一句话过渡过去"——像真向导一样,‘说完这个故事,前面那栋楼正好接上’。这种对话级的调度,只有在端到端架构里才做得出——位置触发、识别、生成、合成在同一套 Real-time Interaction Runtime 里跑,事件流转和会话状态是统一的,"她讲到第几句"和"你此刻走到哪"永远不会对不上账(平台体验入口)。
上面这段是"顺利路径"。真上线之后,老街教给我们的另一半是:顺利路径只占八成,剩下两成才是体验的分水岭。下面这段是途说实际在跑的容错代码,三处处理都对应着一次真实的线上事故。
// ── 1. init() 失败重试:弱网下 SDK 初始化会超时 ──
// 原因:游客常常是"走到骑楼下才打开小程序",此时信号最差,
// 首次 init 拉取形象资源、建立实时通道很容易超时。
// 直接抛错会让用户看到白屏,所以退避重试,且每次重试前先销毁旧实例,
// 避免重复初始化导致音频通道被占用(表现为"有画面没声音")。
async function initGuide(retries = 3) {
for (let i = 0; i < retries; i++) {
try {
await guide.init();
return true;
} catch (err) {
console.warn(`[途说] init 第 ${i + 1} 次失败:`, err.message);
await guide.destroy?.(); // 清掉半初始化的通道
await sleep(500 * 2 ** i); // 500ms / 1s / 2s 退避
}
}
// 三次都失败:降级成"纯文字导览",至少让游客能看能问
enterTextOnlyMode();
return false;
}
// ── 2. ask() 超时降级:大模型慢的时候不能让人干等 ──
// 原因:端到端链路正常时首字延迟在 1 秒内,但节假日基站拥塞时
// 大模型回包可能拖到 5 秒以上。游客站在太阳底下等 5 秒就会走开,
// 所以设 2.5 秒硬超时,超时立刻用本地知识库兜底,保证"有回应"。
const ASK_TIMEOUT = 2500;
function askWithFallback(zone, question) {
return new Promise((resolve) => {
let settled = false;
const timer = setTimeout(() => {
if (settled) return;
settled = true;
// 超时降级:本地 FAQ 命中就答,没命中就坦白不知道
const local = knowledge.qa(zone, question);
resolve(local ?? fallback(question));
guide.ask(local ?? fallback(question)); // 让形象同步开口
}, ASK_TIMEOUT);
guide.ask(question).then((answer) => {
if (settled) return; // 已经降级过,丢弃迟到的回包
settled = true;
clearTimeout(timer);
resolve(answer);
}).catch(() => {
if (settled) return;
settled = true;
clearTimeout(timer);
resolve(knowledge.qa(zone, question) ?? fallback(question));
});
});
}
// ── 3. enterZone 队列溢出:宁可丢远的,不能丢眼前的 ──
// 原因:游客走得快时,30 米触发圈会连续压进多个点位,
// 队列无限增长会让讲解永远落后于人所处的位置——讲的是上一栋楼,
// 人已经站在下一栋楼前了。所以队列设上限,溢出时丢弃"离当前位置最远"的那个。
const ZONE_QUEUE_MAX = 3;
function enqueueZone(zone) {
if (zoneQueue.length >= ZONE_QUEUE_MAX) {
// 按与当前定位的距离排序,丢掉最远的那个(游客大概率不会再回头)
zoneQueue.sort((a, b) => distance(a) - distance(b));
const dropped = zoneQueue.pop();
console.info(`[途说] 队列已满,丢弃较远点位:${dropped.id}`);
}
zoneQueue.push(zone);
}
三处处理对应三个真实教训:init 重试是因为游客总在最没信号的地方打开小程序;ask 超时降级是因为"等太久"比"答得浅"更伤体验;队列溢出丢远的,是因为导览的锚点永远是"人此刻站在哪",而不是"还有几个点没讲"。
随走随讲:钩子、短讲和"不讲"清单
导览讲解词的写法和图文攻略完全不同——没有画面可以回看,全靠耳朵,一句都不能长。途说的知识结构是三层:钩子(1 句)、短讲(90 秒内)、追问库(FAQ):
const TUSHUO_PERSONA = `你是本地向导途说。规则:
1. 每段讲解不超过90秒,一句话一个信息点
2. 讲历史必须落到具体的人或事,禁止"历史悠久、文化底蕴深厚"这类空话
3. 游客问"这是什么年代"之类问题,知识库没有就直说不知道,禁止编年份
4. 游客连续两次走神(追问变少、步速加快),主动压缩内容
5. 讲完一段留一个钩子,指向下一个点`;
// 知识点结构(节选):钩子 + 短讲 + 追问库
const zones = {
qilou_07: {
hook: '抬头看二楼这排铁窗——百年前,这一扇后面是整条街最有钱的绸缎庄。',
story: '1921年,陈家绸缎庄从这扇窗吊货上来……(90秒)',
faq: {
'铁窗花纹': '这是当时流行的岭南style——中西混搭,卷草纹配罗马柱头。',
'为什么叫骑楼': '楼骑在人行道上,做生意遮雨,住人乘凉,一栋楼两不误。',
},
},
paifang_02: { hook: '这座牌坊的匾额,刻错过一次字——', /* ... */ },
};
// 追问优先级:知识库 > 大模型 > 坦白不知道
function fallback(q) {
return `这个我真不确定,不敢瞎讲——你可以在前面游客中心问问,或者我记下来,回去查了下次讲给你听。`;
}
讲解界面:进入骑楼讲解圈,途说抛出钩子文案 + 打断按钮高亮

“禁止编年份"那条是被测试逼出来的:早期版本大模型把一栋 1934 年的楼讲成了"清末民初”,被本地文史爱好者抓包。之后所有年份必须来自知识库结构化字段,LLM 只负责把结构化数据"讲得像人话"。

配到这还不够——街边讲解的"像不像人",一半靠嘴以外的部分。多模态表达不是给录音配上口型动画:她说到"从这扇窗吊货上来"的同一拍,视线抬向二楼、手势往上带;说到"这块匾额刻错过字"的时候眉毛一挑、头微微一歪;游客一句"真的假的",她语速会不自觉地快半拍,带点上火的语气。语音、口型、情绪表情、眼神、头部动作、手势是同一时刻生成的,不是"先合成语音再补动画",也不是预设动作循环播放。更关键的是表达的时候感知没有停——她讲得正起劲,你插一句"等会儿,这个窗为什么是铁的",她会立刻收住、转向接话,而不是硬撑着把 90 秒讲完。统一、连续、同步,这在导览场景不是炫技:一段讲解只要出现半秒音画错位,游客立刻会觉得"这是个播放器"。
路线图:智脑在六个点位上分别干什么
讲到这里,该摊开说那个最容易被误解的东西了:很多人以为给导览加个大模型,就是"知识库 + AI 讲解"。真跑下来你会发现,决定体验好坏的不是模型多聪明,而是专属智脑在这条街上具体干了哪些活。
途说的专属智脑不是一个"通用聊天机器人",它要解决三个问题:我是谁、掌握哪些知识、下一步调用哪个系统。这句听起来抽象,换个方式说就清楚了——把赤坎老街的 1.8 公里摊成一张路线图,六个点位走一遍,你看她每一步背后是谁在干活:
起点·牌坊口 ── ① 骑楼绸缎庄 ── ② 老字号茶楼 ── ③ 华侨旧宅 ── ④ 码头石阶 ── 终点·游客中心
起点·牌坊口|先定"她是谁"。 开场那句"我们边走边聊,看到什么想问的,直接开口就行",不是随口写的欢迎语,它来自专属智脑里配置好的身份与规则层:角色是"本地向导"而不是"百科问答机",任务目标写的是"让人走着走着就停下来看",规则写死了"不背空话、不编年份、游客走神就压缩"。可配置的不止人设——身份、角色、任务、规则、音频、Agent、Workflow、对话流程、工具调用都在这一层。同一个底座,配成途说是街头向导,配成馆内讲解员就是另一套语气和路线,各干各的活。这就是"岗位化"。

① 骑楼绸缎庄|她知道什么(一):资料怎么变成知识。 1921 年陈家从二楼吊货这个故事,来源是陈家后人捐的一批东西:口述录音两小时、一张泛黄的老照片、民国报纸的扫描件、还有一份商户账簿的 Excel。星云的全模态数据解析把这些都能吃进去——PDF、Word、PPT、图片、音频、表格,而且解析时保留层级关系、图文关系、表格关系和上下文,不是简单"转成文字"。所以照片里"二楼铁窗"的位置信息、录音里陈家人说话的语气、账簿里绸缎进货的品类和年份,都还在,讲解时才能讲出"从这扇窗吊货"这种有画面感的细节。

② 老字号茶楼|她知道什么(二):从"找到一段话"到"组织答案"。 有位游客指着铁窗问花纹,途说没有只回一句"卷草纹",而是接上了三条线:岭南建筑的中西混搭风格、绸缎庄当年的审美、1921 年这个时间点。这是因为知识图谱和 RAG 深度融合:文档里的实体、概念、关系被组织成网,检索时向量语义、关键词、图谱三条路一起召回,跨资料的问题也能把多个知识点连接起来——不是命中一个片段就交差。

③ 华侨旧宅|她知道什么(三):知识会老,怎么保证不说过期的话。 前面提过那次"1934 讲成清末民初"的抓包。改一版讲解词很容易,难的是改完之后所有相关问答、所有衍生内容都跟着一致——所以专属智脑在"知道什么"这一层还包含高效知识治理:围绕知识块、标签、实体、关系、向量索引和来源信息持续维护。文史爱好者纠错之后,我们更新的是"华侨旧宅·建造年代"这个知识块,挂在这个实体上的所有问答自动生效,来源一行标着"赤坎区文史馆 2024 年修订版",运营后台能查到谁改的、什么时候改的。资料会不断新增、修改、废止,这套治理机制就是"讲得越久越准"的底账。

④ 码头石阶|第三层:真正进入业务。 走到这里,途说会顺口提一句"前面游客中心的文创店今天有活动,隔壁茶楼凭导览记录能领一份茶点"。这句话背后是智能体真的连进了业务系统——不是她"知道"有活动,而是她"查到了"库存和券的余量。星云的智能体可以连接 CRM、ERP、OA、HIS、BI、商品系统、订单系统、客户系统、门店系统、IoT 以及第三方 Agent;在文旅这个盘子里,业务系统就是票务预约、场馆系统、商户收银和文创电商。对城市运营方来说这才是关键:导览不是一段内容,它是一个入口,能推到流程里的入口。

终点·游客中心|底账:可插拔。 途说上线后,我们换过一次 TTS——方言区老年游客反馈有些本地地名的发音不地道。这类需求在拼接式方案里意味着动核心代码,在这里是配置项。但要强调一句:“可插拔"不等于"把 API 拼起来”。感知、认知、表达、执行之间有紧密的时序依赖与状态关联,星云靠标准化的接口契约和统一的状态管理,保证模块替换后事件流转、会话状态、时间同步、异常处理仍然一致。落到途说就是:把语音识别换成火山引擎或腾讯云、把声音换成微软 Azure / 字节豆包 / MiniMax 的音色、甚至把大脑接到 Dify、Coze 上重新编排工作流,那条底线——“不编年份、走神就压缩、两圈重叠就排队”——一条都不会跟着变。魔珐自研的 Xmov 大/小模型 ASR、自研大脑(RAG + FAQ + 自研大模型 + 可视化编排)、自研 TTS 是默认开箱的那一套;将来途说要是装上机器人的身体,机器人运控也能在魔珐自研运控和本体厂商运控之间选。换个"耳朵"不换"脾气",这是可插拔真正的意思。团队自己有大模型的话,智脑里也能直接配置接入;没有的话,用自研智脑,上面这些能力开箱即用。

一句话收束:大模型解决"能不能回答这个问题",专属智脑解决"我是谁、我代表谁、掌握哪些知识、当前任务是什么,以及下一步该调用哪个系统"。
行程回顾:一条街跑下来的实测
赤坎老街 1.8 公里试点,21 天,导览会话 3,146 次。把几个关键指标和传统扫码导览、人工导游放在一起看,差距比想象中明显:
| 指标项 | 途说实测值 | 对比基线 | 说明 |
|---|---|---|---|
| 平均追问次数 | 1.7 次/点位 | 扫码导览 0 次;人工导游约 0.6 次/点位 | 扫码导览只能单向播放,游客没有提问入口;人工导游受团队规模和节奏限制,游客往往不好意思打断 |
| 平均单点讲解时长 | 约 78 秒 | 扫码导览固定 120 秒录音;人工导游约 150 秒 | 途说按"90 秒内一句话一个信息点"压缩,讲完留钩子,游客愿意听完整段 |
| 讲解完成率 | 91% | 扫码导览约 54%;人工导游约 76% | 扫码录音常被中途关掉,途说能感知走神并主动压缩,弃听率明显更低 |
| 走神压缩触发率 | 12.4% 的讲解段 | 扫码导览 0(无此能力);人工导游靠肉眼判断 | 游客追问变少、步速加快时自动缩短内容,是"不讲"清单真正落地的地方 |
| 弱网可用率 | 96.8% | 云端渲染方案约 71% | 端侧渲染不依赖视频流长距离传输,钻进骑楼、走进地铁口依然能讲 |
| 单次会话平均时长 | 4 分 12 秒 | 扫码导览约 1 分 40 秒;人工导游按团计 | 会话变长主要来自追问,而不是讲解本身变长 |
数据里最值得说的是追问:1.7 次/点位意味着游客平均每走到一个点位就会开口问一次,而扫码导览这个数字是 0——"能问"这件事本身就在拉动"听"的意愿,人只会对自己能插话的东西保持专注。
还有一项没进这张表,但直接决定了试点能不能扩到更多街区:AI 端渲。老街的物理环境对着实时交互相当不友好——骑楼墙面对信号遮挡严重,节假日的游客一多,基站的带宽容不下每个人一路高清画面。如果每一路导览都靠云端 GPU 渲染再推视频流,结果就是人多时集体卡顿、成本随客流线性上涨,而导览的高峰恰恰就是客流高峰。星云的端侧渲染把渲染下沉到终端:不再依赖视频流长距离传输,延迟更短,弱网环境(钻进骑楼、走进地铁口)依然能讲,云 GPU 成本不随并发一起飙,三年前的中端手机也能带得动。表里那个 96.8% 的弱网可用率就是这么来的。做导览内容的人都懂那句老话:最美的那一段往往在最没信号的地方。
想亲眼看看?六个最适合现场演示的片段
如果要在评审会、路演或者文旅局的汇报现场演示途说,挑片段比讲参数有用。这六个是我们自己在内部演示时反复用、每次都能把观众镇住的:

演示时有两个小提醒:一是别配音、别加速,把停顿和排队的过程原样留着,快剪出来的效果反而像假的;二是第 ④ 条一定要用"库里真没有"的问题当场问,现场发挥的说服力比准备好的脚本强十倍。
返程:导览智能体的核心竞争力是"当地感"
做完途说我总结了一条:城市导览智能体的壁垒不在模型,在**“这条街的知识库谁挖得深”**。钩子写得像不像本地人、敢不敢承认不知道、追问库覆盖了多少真实游客的问题——这些是拍照背词的 AI 永远给不了的。大模型负责表达,街坊记忆负责真实,端到端负责把两者在"你正好走到这里"的那一秒接起来。
顺便说说什么叫"一个智能体,可以进入不同的身体"。现在途说住在手机屏幕里,她做的是数字与物理行动里的数字行动那一层:把故事讲出来、把情绪演出来、把票券递到你面前。但她的身份、知识、记忆和任务都长在智脑里,不绑在某块屏幕上——明天让她进景区的 AI 导览大屏,她还是那个知道 1934 年哪栋楼在修、哪家茶楼周三休息的途说;再往前一步,装上机器人的身体,她的行动就延伸到物理世界:转向你、走近你、在人群里导航带路、跟着你走、抬手给你指方向,甚至用上肢动作把一杯凉茶递过来。智能体持续存在,身体不断升级。对文旅场景来说,这意味着一次投入的知识库,能用在小程序、大屏、机器人和以后的每一种终端上。
魔珐星云是一套端到端具身交互智能平台,让 AI 通过屏幕和机器人进入真实世界,成为能够感知、理解、表达并行动的智能体。途说还很小,只是一个街区、一个知识点一个知识点地抠。但它至少证明了一件事:城市导览值得被重新做一遍——不是把讲解词录得更标准,而是让那个走在街上、随时愿意回答你随口一问的角色,真的在场。
你去一个城市旅行,更喜欢自己逛、请导游,还是用导览 App?评论区聊聊你遇到过最难忘的讲解——是真人讲得好,还是扫码听到的?
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)