天猫精灵技能平台
家里面一直有一个天猫精灵,也有过一些开发想法。所以趁着本次机会研究了一下。
天猫精灵技能平台是一个技能应用的管理平台。
在这里平台下,可以创建专属的技能。
我今天特殊要说的是语音技能的开发。
新增技能环节
下面我们来新增一个技能,点击新增技能按钮,进入下图界面:
这些操作没什么难度,所以不着重说明了。
基本信息填写
技能名称:应用名称(随便写都行)
技能属性:
公有应用:将发布到公开市场,审核通过后在所有天猫精灵设备都可使用。
私有应用:不发布到公开市场,只在定制合作设备上使用。
我们平时的开发不会使用到私有应用,除非你是第三方企业等,可以选择私有应用。
技能调用词:进入应用的指令词,这个要注意填写。
收费情况:是否收费
选择后端服务资源的部署方式
我本次开发使用的是阿里云云开发(FAAS),在线开发与阿里云云开发没什么差别;第三种自建状态是使用自己的服务器。
创建成功
创建成功后,进入到详情页面:
技能配置环节
技能创建完成后,开始进行技能应用的配置处理。
整个配置环节,共有六个步骤。
基础信息
在创建技能的时候,我们会填写基础信息。
在这里也可以进行一些修改。
定义语音交互模型
语音交互模型的配置,是用户进入后端程序的入口。
在这里可以配置一些语音交互逻辑。
介绍一下其中的几个关键词信息:意图、实体、问答。
意图:如果前端要访问后端,需要知道接口是什么?如果天猫精灵访问后端,就需要知道要访问哪个意图。以此来说,意图在概念上相当于接口,也可以说是入口。
实体:就是参数,而且在其中还提供了一系列的内部参数(实体);其中包括时间,位置等等的信息。
问答:一问一答,没什么特别,但是很重要且很好用。
构建后端服务逻辑
进行到了后端服务逻辑步骤,从名称来看就是关于后端服务的配置。
在开发后端代码时,需要先编辑部署,绑定阿里云账号。
在关联阿里云账号,需要先开通云开发功能,我就在这卡了半天。
编辑部署,绑定阿里云账号后,就可以进入到在线开发页面了。
添加屏显页面(可选)
屏显页面是为智能天猫精灵(触屏版)准备的,主要是维护一些资源。本次开发暂不考虑,我也没过多研究。
测试
提供了两种方式:在线测试、真机测试。没什么好详细说的,操作很简单。
发布
发布信息可编辑,自行编辑就可以了。
开发一个诗词问答小游戏
代码实现
publicclassGenieEntryextendsAbstractEntry { privatestaticfinalMap<String, Integer>USER_SORT=newConcurrentHashMap<>(); privatestaticList<String>KNOWLEDGE=newArrayList<>(); privatestaticList<String>ANSWER=newArrayList<>(); privatestaticRandomrandom=newRandom(); static { KNOWLEDGE.add("但愿人长久,千里共婵娟。其中婵娟指的是什么? A、月亮 B、姻缘"); ANSWER.add("A"); KNOWLEDGE.add("以下提到菊花的诗词中,哪个肯定是在重阳节写的?A、待到重阳日,还来就菊花 B、莫道不消魂,帘卷西风,人比黄花瘦 C、丛菊两开他日泪,孤舟一系故园心"); ANSWER.add("A"); KNOWLEDGE.add("成语“出水芙蓉”最早用来形容什么?A、美女 B、诗歌 C、绘画"); ANSWER.add("A"); KNOWLEDGE.add("“君看一叶舟,出没风波里”请问这“一叶舟”在干什么?A、比赛 B、摆渡 C、捕鱼"); ANSWER.add("B"); KNOWLEDGE.add("名句“七月流火,九月授衣”中“流火”的含义是?A、天气炎热 B、天气转凉 C、天气寒冷"); ANSWER.add("A"); KNOWLEDGE.add("9、重阳节亲友开心相聚,一起登高赏景时,最适合引用以下哪项诗句?A、夕阳无限好,只是近黄昏 B、万里悲秋常作客,百年多病独登台 C、尘世难逢开口笑,菊花须插满头归"); ANSWER.add("C"); KNOWLEDGE.add("苏轼“老夫聊发少年狂,左牵黄,右擎苍”中的“黄”和“苍”分别指?A、黄马、苍鹰 B、黄犬、苍鹰 C、黄犬、黑犬"); ANSWER.add("B"); KNOWLEDGE.add("“只恐双溪舴艋舟,载不动,许多愁”中“舴艋舟”是什么舟?A、蚱蜢纹饰的小舟 B、形似蚱蜢的小舟 C、雄伟坚固的战船"); ANSWER.add("B"); } publicResultModel<TaskResult>execute(TaskQuerytaskQuery, Contextcontext) { context.getLogger().info("taskQuery: "+JSON.toJSONString(taskQuery)); // 从请求中获取意图参数以及参数值Map<String, String>paramMap=taskQuery.getSlotEntities().stream().collect(Collectors.toMap(slotItem->slotItem.getIntentParameterName(), slotItem->slotItem.getStandardValue())); StringuserId=taskQuery.getRequestData().get("userOpenId"); Stringanswer=paramMap.get("answer"); userId=userId==null?"testUser" : userId; if ("exit".equals(taskQuery.getIntentName())) { returnreply("已为您退出,再见。"); } if ("start".equals(taskQuery.getIntentName()) &&answer==null) { intrandomIndex=random.nextInt(KNOWLEDGE.size()); USER_SORT.put(userId, randomIndex); returnintentChangeReply(KNOWLEDGE.get(randomIndex)); } if(answer!=null){ if(answer.equals(ANSWER.get(USER_SORT.get(userId)))){ returnintentChangeReply("恭喜你!答对了。"); }else{ returnintentChangeReply("很遗憾!答错了。"); } } returnreply("请检查意图名称是否正确,或者新增的意图没有在代码里添加对应的处理分支。"); } /*** 结束对话的回复,回复后音箱闭麦*/privateResultModel<TaskResult>reply(Stringreply) { returngetResult(reply, ResultType.RESULT); } /*** 未指定追问参数,音箱自动开麦,用户的回答可跳转到其它意图*/privateResultModel<TaskResult>intentChangeReply(Stringreply) { returngetResult(reply, ResultType.ASK_INF); } privateResultModel<TaskResult>getResult(Stringreply, ResultTypeaskInf) { ResultModel<TaskResult>res=newResultModel<>(); TaskResulttaskResult=newTaskResult(); taskResult.setReply(reply); taskResult.setExecuteCode(ExecuteCode.SUCCESS); taskResult.setResultType(askInf); res.setReturnCode("0"); res.setReturnValue(taskResult); returnres; } }
待完善
- 数据库如何连接没有研究明白,只能使用JDBC连接,没有找到相关的配置。
- 循环问答还没有实现完成。
- 逻辑还不太完善(有bug)。
成果演示
拍视频太费劲,大家就这样看吧,嘿嘿嘿。
提供一个想法
天猫精灵技能平台中提供了一个问答的语音交互方式。
我们完全可以使用这个问答功能,构建一个问答百科全书。
在家里可以随意问答,录入一些小知识。
看哪位有兴趣可以试着构建一下。