如何开发基于邮编/城市查询并播放电台的Alexa技能?
开发Alexa NPR技能的分步指导
一、完善邮编/城市输入的意图处理
- 给
ZiporCityIntent补充足够的样本 utterances,比如"我的邮编是{zip}"、"我在{city}"、"{zip}"、"{city}",覆盖用户直接报信息、带前缀说明的各种输入场景,提升槽位识别准确率。 - 增加槽位合法性校验:对{zip}做5位数字格式验证,对{city}做非空、非特殊字符校验,遇到无效输入直接返回提示:"麻烦输入有效的5位邮编或城市名称哦"。
- 处理槽位缺失:如果Alexa没捕获到有效槽位(比如用户说"我在附近"),触发追问逻辑,引导用户明确输入。
二、对接电台数据查询逻辑
- 搭建电台数据源:可以调用NPR公开的电台查询接口(如果有),或者自己维护一份邮编/城市与对应电台的映射表(适合初期测试),数据要包含电台名称和音频流URL两个核心字段。
- 编写查询函数:在技能后端(Node.js/Python等)实现查询逻辑,示例代码(Python):
def fetch_stations(location): # 模拟数据源查询 station_map = { "44691": [{"name": "radio1", "stream_url": "http://example.com/radio1"}, {"name": "radio2", "stream_url": "http://example.com/radio2"}], "纽约": [{"name": "NYC NPR", "stream_url": "http://example.com/nyc-npr"}] } return station_map.get(location, [])
- 无结果处理:如果查询返回空列表,返回提示:"抱歉,暂时找不到该地区的NPR电台,请换个邮编或城市试试"。
三、实现电台选择交互
- 存储会话数据:查询到电台列表后,将其存入Alexa的会话属性(session attributes)中,避免用户选择时重复查询。
- 创建电台选择意图:新增
SelectRadioIntent,添加{radio_name}槽位,并把当前会话中的电台名称设为槽位的自定义同义词,确保Alexa能精准识别用户说出的电台名。 - 播报选项逻辑:查询到结果后,按格式播报:"该地区有{count}个电台:{names},您想播放哪一个?",其中{count}是电台数量,{names}是用"和"连接的电台名称列表。
四、音频播放功能实现
- 使用Alexa AudioPlayer接口:用户选择电台后,从会话属性中取出对应音频流URL,构造播放指令。示例代码(Node.js):
const playDirective = { type: 'AudioPlayer.Play', playBehavior: 'REPLACE_ALL', audioItem: { stream: { url: selectedStation.stream_url, token: selectedStation.name, offsetInMilliseconds: 0 } } }; return handlerInput.responseBuilder .addDirective(playDirective) .speak(`正在为您播放${selectedStation.name}`) .getResponse();
- 补充播放控制意图:添加
AMAZON.PauseIntent、AMAZON.ResumeIntent、AMAZON.StopIntent的处理逻辑,支持用户暂停、继续、停止播放。
五、会话状态管理
- 标记会话阶段:通过会话属性记录当前流程节点,比如
stage: "waiting_for_location"或stage: "waiting_for_radio_selection",避免流程混乱。 - 支持断点续连:用户中途退出再进入技能时,读取会话属性中的历史数据,询问用户:"是否继续播放上次的电台,还是更换地区?"
内容的提问来源于stack exchange,提问作者Fopoki
相关产品推荐
相关产品推荐

