天猫精灵语音开发-第二天

简介: 图文详解如何开发天猫精灵语音应用,以及阿里云云开发平台的基本使用,最后将介绍如何把使用阿里云云开发平台做后台开发天猫精灵应用

前言

  • 在第一天的教程《天猫精灵语音开发-第一天》 里我们已经尝试开发出了一个hello world
  • 今天这一节课中,我们要创建一个查询天气的意图,实现“小莫同学”->“主人我在,我可以帮你查询天气”。

流程

  • 前台配置流程

    • 创建天气意图和实体
    • 配置单轮对话和追问
    • 配置多轮对话
  • 后台开发流程

    • 解析请求意图并返回预期值
    • 提交代码并部署上线
  • 语音测试
  • 项目下线

前台配置流程

创建天气意图和实体

image.png

image.png

image.png

image.png

配置单轮对话和进行语料标记

image.png

注意事项:

  • 针对所有城市的天气状况可以使用模板进行创建:@{city}@{sys.date(公共实体)}天气怎么样
  • 当用户直接询问“天气怎么样”时,即不知道城市名也不知道所问天气的日期是多少时,我们可以做以下操作:

    • 不知道查询哪个城市的天气时,可以在参数中,添加追问语句,如“请问是哪个城市的天气呢?”;
    • 不知道所问天气的日期是哪天时,可以关闭“精灵追问”,设置“系统默认实体值”为“今天”。

配置多轮对话

image.png

后台开发

登录阿里云云开发平台(网址:workbench.aliyun.com)开发后台代码,进入详情请看第一天教程

解析请求意图并返回预期值

image.png

全部代码如下:

package com.alibaba.ailabs;

import com.alibaba.ailabs.common.AbstractEntry;
import com.alibaba.da.coin.ide.spi.meta.AskedInfoMsg;
import com.alibaba.da.coin.ide.spi.meta.ExecuteCode;
import com.alibaba.da.coin.ide.spi.meta.ResultType;
import com.alibaba.da.coin.ide.spi.standard.ResultModel;
import com.alibaba.da.coin.ide.spi.standard.TaskQuery;
import com.alibaba.da.coin.ide.spi.standard.TaskResult;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.fc.runtime.Context;

import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @Description 天猫精灵技能函数入口,FC
 * handler:com.alibaba.ailabs.GenieEntry::handleRequest
 * @Version 1.0
 **/
public class GenieEntry extends AbstractEntry {
    @Override
    public ResultModel<TaskResult> execute(TaskQuery taskQuery, Context context) {
        context.getLogger().info("taskQuery: " + JSON.toJSONString(taskQuery));
        ResultModel<TaskResult> res = new ResultModel<>();
        TaskResult taskResult = new TaskResult();
        // 从请求中获取意图参数以及参数值
        Map<String, String> paramMap = taskQuery.getSlotEntities().stream().collect(Collectors.toMap(slotItem -> slotItem.getIntentParameterName(), slotItem -> slotItem.getStandardValue()));
        
        String intentName = taskQuery.getIntentName();

        if("gclm-hi".equals(intentName)){
            taskResult.setReply("主人我在,我可以帮你查询天气");
        } else if("wether".equals(intentName)){
             String city = paramMap.get("city");
             //意图中 date 参数勾选了必选,请求数据中一定会携带 date 参数,因此只需要判断 city 参数有没有
             if(StringUtils.isBlank(city)) {
                   taskResult.setReply("主人,你要查询那个城市的天气啊!!!");
             }
            // 这是使用假数据
            taskResult.setReply("主人,"+city + paramMap.get("sys.date(公共实体)") + "天气 晴");
        } else {
            taskResult.setReply("主人,我无法识别你的意图,等我重新学习后再来更好的服务主人");
        }

        
       return reply(taskResult);
    }

    /**
     * 结束对话的回复,回复后音箱闭麦
     */
    private ResultModel<TaskResult> reply(TaskResult taskResult) {
        ResultModel<TaskResult> res = new ResultModel<>();
        taskResult.setExecuteCode(ExecuteCode.SUCCESS);
        taskResult.setResultType(ResultType.RESULT);
        res.setReturnCode("0");
        res.setReturnValue(taskResult);
        return res;
    }

    /**
     * 指定追问参数,音箱自动开麦,用户的回答优先匹配追问的参数
     */
    private ResultModel<TaskResult> askReply(TaskResult taskResult, String parameterName, Long intentId) {
        ResultModel<TaskResult> res = new ResultModel<>();
        taskResult.setExecuteCode(ExecuteCode.SUCCESS);
        taskResult.setResultType(ResultType.ASK_INF);
        AskedInfoMsg askedInfoMsg = new AskedInfoMsg();
        askedInfoMsg.setIntentId(intentId);
        askedInfoMsg.setParameterName(parameterName);
        List<AskedInfoMsg> askedInfos = new ArrayList<>();
        askedInfos.add(askedInfoMsg);
        taskResult.setAskedInfos(askedInfos);
        res.setReturnValue(taskResult);
        return res;
    }
}

提交代码并部署上线

  • 使用Git提交代码
  • 选择预发环境部署上线,详情请看第一天教程

语音测试

进入在线测试进行测试

image.png

项目下线

在线测试完成后,要在云开发平台中我的应用及时将部署的应用下线,因为免费额度有限,不及时下线将会产生不必要的费用

昨天就忘记下线了。多跑了一定的流量

image.png

image.png

相关文章
|
关系型数据库 MySQL 网络安全
Mysql8.0 开启 SSL加密 mysql_ssl_rsa_setup
Mysql8.0 开启 SSL加密 mysql_ssl_rsa_setup
2149 0
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
1622 0
【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )
|
人工智能 机器人 5G
顺为资本冯铮:我们距离《头号玩家》中的「Metaverse」还有多远?
顺为资本冯铮:我们距离《头号玩家》中的「Metaverse」还有多远?
441 0
顺为资本冯铮:我们距离《头号玩家》中的「Metaverse」还有多远?
|
Linux 数据安全/隐私保护 Docker
Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像
我们先去官网注册dockerhub的账号和密码,官网在下方↓
1011 0
Docker发布/上传镜像到dockerhub&&下载/拉取镜像&&删除dockerhub镜像
|
前端开发 JavaScript 机器人
面向中后台复杂场景的低代码实践思路
现实中,业务场景多,迭代频繁,变化快到跟不上,规则可能由多人掌握,无法通过一个人了解全貌; 还有业务所在行业固有的复杂度和历史包袱,这些问题都会让我们感到痛苦。 除了逻辑问题,我们还关注易用性交互开发的问题。
面向中后台复杂场景的低代码实践思路
|
Android开发
【Android 逆向】selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )
【Android 逆向】selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )
673 0
【Android 逆向】selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )
|
Shell API 开发工具
一篇教你代码同步 Github 和 Gitee
在上篇《一篇带你用 VuePress + Github Pages 搭建博客》,我们成功的用 VuePress 搭建了博客并部署到 Github Pages,但由于 Github 的访问问题,我们可以选择把仓库部署到 Gitee 一份,利用 Gitee 的 Pages 服务再生成一份静态网站用于备用。
791 0
一篇教你代码同步 Github 和 Gitee
|
运维 中间件 Devops
PaaS市场分析
本文数据来自阿里研究院相关研究报告
833 0
PaaS市场分析
|
运维 算法
分布式选举算法-霸道算法/欺负算法(bully algorithm)
分布式 选举 算法 霸道算法 欺负算法bully algorithm
687 0
分布式选举算法-霸道算法/欺负算法(bully algorithm)
|
JavaScript 安全 Java
hyengine - 面向移动端的高性能通用编译/解释引擎
手机淘宝客户端在历史上接过多种多样的脚本引擎,用于支持的语言包括:js/python/wasm/lua,其中js引擎接过的就有:javascriptcore/duktape/v8/quickjs 等多个。众多的引擎会面临共同面临包大小及性能相关的问题,我们是否可以提供一套方案,在能支持业务需求的前提下,用一个引擎来支持尽可能多的语言,能较好的兼顾包大小较小和性能优异。为了解决这个问题,我们开始了 hyengine 的探索。
hyengine - 面向移动端的高性能通用编译/解释引擎