Dialogflow中Google Assistant轮播卡片语音选择打开URL方案咨询
关于Dialogflow中Google Assistant Carousel卡片语音选择并打开URL的解决方案
嗨,我来帮你解决这个问题!其实Google Assistant的Carousel卡片是支持语音选择跳转的,只是需要一些特定的配置,我给你详细说下步骤,还有如果遇到问题的替代方案:
一、可行的实现方案
要让用户能通过语音选择Carousel卡片并打开对应URL,关键是做好卡片语义配置和Dialogflow意图匹配:
完善Carousel卡片的基础信息
给每张卡片设置独特且易发音的标题(比如“智能手表详情页”“运动耳机官网”),同时确保每个条目都关联了对应的URL。如果你用Actions Builder(或Dialogflow的Actions on Google集成),可以给每个卡片添加semanticLabel,帮助Assistant更好地识别用户的语音指令。创建专门的卡片选择意图
在Dialogflow里新建一个意图(比如命名为「选择Carousel卡片」),添加用户可能的语音表达式,比如:- 打开{卡片标题}
- 选择{卡片标题}
- 选第{数字}个卡片
- 查看第二个选项
然后给这个意图添加对应的实体:
- 自定义实体「卡片标题」:把你Carousel里所有卡片的标题都加进去作为实体值;
- 系统实体
@sys.number:用来匹配用户说的“第1个”“第二个”这类位置指令。
通过Webhook处理跳转逻辑
当这个意图被触发时,用Webhook来处理:- 如果用户说的是卡片标题,就从预先存储的标题-URL映射里找到对应链接;
- 如果用户说的是位置数字,就根据Carousel的顺序取出对应URL;
- 最后返回
actions.intent.OPEN_URI类型的响应,把URL传进去,Google Assistant就会自动打开对应的网页了。
举个简单的Webhook返回示例(Node.js):
function handleCardSelection(agent) { const cardTitle = agent.parameters.cardTitle; const cardIndex = agent.parameters.number; // 预先定义的卡片数据列表 const cards = [ {title: "智能手表详情页", url: "https://example.com/watch"}, {title: "运动耳机官网", url: "https://example.com/earphone"} ]; let targetUrl; if (cardTitle) { targetUrl = cards.find(c => c.title === cardTitle).url; } else if (cardIndex) { targetUrl = cards[cardIndex - 1].url; // 注意数组索引从0开始 } // 返回提示并触发URL跳转 agent.add(new Suggestion(`正在打开${cardTitle || `第${cardIndex}个卡片`}`)); agent.setFollowupEvent({ name: 'actions_intent_OPEN_URI', parameters: { uri: targetUrl } }); }
二、等效替代方案
如果上面的配置遇到障碍(比如某些地区的Assistant功能限制,或Dialogflow版本兼容问题),可以试试这些替代方式:
- 改用List卡片:List卡片和Carousel展示逻辑类似,但结构更线性,用户更容易用“第一个”“第三个”这类语音指令选择,配置方法和Carousel完全一致,同样支持Webhook处理跳转。
- 语音引导+实体匹配:在展示Carousel卡片的同时,主动给用户语音提示:“你可以说‘打开智能手表’或者‘选第二个’来查看详情”,这样用户更清楚操作方式,同时通过实体匹配用户输入触发URL跳转。
- 会话上下文存储卡片信息:在展示Carousel的意图里,把所有卡片的标题和URL存入Dialogflow的会话上下文(比如
carousel_cards),当用户说出选择指令时,Webhook从上下文里取出对应数据,再返回打开URL的响应。
注意事项
- 要打开的URL必须是HTTPS协议,如果用Actions on Google集成,需要在Actions Console的「部署」-「域名白名单」里添加对应的域名,否则Assistant会拒绝打开。
- 如果是Dialogflow ES版本,必须用Fulfillment(Webhook)处理跳转,原生响应无法直接触发URL打开,需通过Webhook返回特定指令。
内容的提问来源于stack exchange,提问作者Yuki_S
相关产品推荐
相关产品推荐

