Alexa技能开发:如何通过语音选择List Template中的项目?
解决Echo Spot技能返回列表后Alexa停止监听的问题
我之前在开发带屏幕的Alexa技能时也踩过类似的坑,结合你的描述,咱们来拆解问题并一步步解决:
核心逻辑误区:会话状态设置搞反了
你提到“技能返回列表后,即使将shouldEndSession设置为true,Alexa也不再监听”——这里其实是理解偏差:当shouldEndSession=true时,Alexa会直接结束会话,自然不会再监听任何语音或屏幕输入。如果你希望用户能点击屏幕选择项目(触发ElementSelected意图),必须把shouldEndSession设为false,同时搭配reprompt提示语,让Alexa保持会话打开状态,等待用户操作。
举个正确的响应示例(JSON结构):
{ "version": "1.0", "response": { "outputSpeech": { "type": "PlainText", "text": "请从屏幕上选择一个项目,或者告诉我你的选择" }, "reprompt": { "outputSpeech": { "type": "PlainText", "text": "你可以点击屏幕上的选项,或者说出项目名称" } }, "shouldEndSession": false, "directives": [ { "type": "Display.RenderTemplate", "template": { "type": "ListTemplate1", "title": "可选项目列表", "listItems": [ { "token": "item1", "textContent": { "primaryText": { "type": "PlainText", "text": "项目一" } } }, { "token": "item2", "textContent": { "primaryText": { "type": "PlainText", "text": "项目二" } } } ] } } ] } }
额外需要排查的细节
- ElementSelected意图的参数匹配:确保你列表项的
token值和{choice}槽位的候选值对应,这样Alexa才能把屏幕点击的操作正确映射到意图参数上。比如列表项token是item1,那{choice}槽位要包含item1或者对应的项目名称作为可选值。 - 意图处理程序的逻辑:检查你的ElementSelected意图处理代码,确保处理完成后返回的响应符合需求——如果用户选择后还需要继续交互,就保持
shouldEndSession=false;如果流程结束,再设为true。 - 屏幕模板的正确性:Echo Spot对Display Directive的模板有特定要求,比如ListTemplate1的结构是否完整,每个列表项是否设置了可点击的
token,避免因为模板错误导致点击事件无法触发。
测试小技巧
可以在Alexa开发者控制台的「测试」页面查看交互日志,检查每次技能返回的响应结构是否正确,有没有报错信息——很多时候问题都能在日志里找到直接线索。
内容的提问来源于stack exchange,提问作者bgsuello
相关产品推荐
相关产品推荐

