下载APP
登录
关闭
讲堂
算法训练营
Python 进阶训练营
企业服务
极客商城
客户端下载
兑换中心
渠道合作
推荐作者

如何基于Microsoft Cortana创建一个语音对话技能?

2018-05-21 阿里巴巴智能语音交互团队

平台概述

相信很多人对“微软小冰”都不陌生,它是微软亚洲互联网工程院在 2014 年 5 月 29 日发布的一款人工智能伴侣虚拟机器人,也是最早的接近人的对话机器人。它集合了中国近 7 亿网民多年来积累的全部公开的文献记录,并凭借微软在大数据、自然语义分析、机器学习和深度神经网络方面的技术积累,精炼为几千万条真实而有趣的语料库,通过理解对话的语境和语义,实现了超越简单人机问答的自然交互。
然而,“微软小冰”只是微软人工智能技术在人机交互方面的一次试水,它的应用场景十分有限,只能提供闲聊功能,并不能实际帮助我们解决生活中的实际问题。如使用者要订票、播放音乐、控制智能家居等。要实现以上的需求需要更高级的对话功能,识别出使用者所说的每一句话的意图,理解使用者想要做什么和通过什么途径完成。这需要根据服务特点,在对话过程中收集若干前提条件信息,当所有前提信息被提供,即可达到使用者想要的结果。
目前已经有很多对话机器人可以提供这类服务,其中比较著名的除了前面两篇讲到的亚马逊 Alexa 和谷歌的 Google Assistant,还包括苹果的 Siri,三星的 Bixby 等。它们主要是进行手机的语音操作控制,即个人数字助理。微软也推出了个人语音助理机器人,叫“小娜”(英文名 Cortana)。本篇将讲述如何在 Azure 上实现基于 Cortana 的对话技能。为了方便和前面介绍过的亚马逊和谷歌的平台进行对照学习,我们的示例依然是建设查询天气这个对话服务。

微软平台技能建设

微软的对话平台主要包括三个部分,Cortana 对话机器人、LUIS 对话理解和内容服务三部分。完整的 Cortana 处理流程,如下图所示:
用户对 Cortana 发出语音请求,Cortana 将请求转换为文本后,交给基于 Microsoft Bot Framework 创建的对话服务(Cortana Skill)处理。其中,对话函数会调用语义理解服务(LUIS)获得用户意图和实体,然后根据当前对话状态,判断实体是否符合调用内容服务的条件,如果不符合提示用户补充实体;如果符合则调用内容服务,并将结果返回给用户。
下面,我们根据上图中的步骤,先学习语义理解服务的配置,然后使用内容服务,最后搭建自己的机器人服务。

1. 语义理解服务配置

语义理解服务 LUIS (Language Understanding Integence Service) 是 Azure CognitiveServices 的一部分。LUIS 对外提供了一系列 API,用于解决对人们日常表达的理解和解释。LUIS 可以和 Azure 上的对话机器人无缝集成。LUIS 服务提供的访问接口非常简单,支持多种编程语言。本节主要介绍如何设置和使用 LUIS 服务,实现查询天气的语义理解。
1.1 新建应用
首先注册并登录 LUIS(https://www.luis.ai) ,在如下图所示的页面中,点击菜单上的“My apps”标签,并点击“Create new app”来新建应用。
新建应用的配置如下图所示,字段分别是服务的名字(Name)、对话使用的语言(Culture),及描述(Description)。
注意:这里我们选择的语言为英文(English),因为目前 LUIS 无法支持中文分词。填写完毕后点击”Done”。完成新建后,会在 app 列表下出现我们新建的应用,如下图所示。
点击左上方的设置 (Setting) 按钮,会显示此应用的 Application ID,我们在后面会用到。
应用创建完成后,我们需要设置应用。
1.2 进入应用
在上图应用列表中,点击行左侧的蓝色字”weather“,会进入 app 设置界面,如下图所示。
图的上方黑色菜单中,右侧为训练和发布测试相关的按钮,用于在线生成和测试。左侧菜单有意图 (Intents) 和实体 (Entitys) 两个菜单,用于配置语义理解。下面我们来添加查询天气的实体和意图。
1.3 新建实体
点击上图的左侧菜单的”Entities”-”Create new entity”,会弹出以下菜单。我们新建两个实体weather.cityweather.date,实体类型都选择 Simple。实体名会在 LUIS 的返回报文中用到。
1.4 新建意图
新建完实体后,我们回到 Intents 菜单中,在界面上点击”Create new intent”菜单,新建一个意图。在意图名中填写 queryweather,然后点击 Done 保存之后,在 Intents 列表中就会出现一条 queryweather 的意图。
点击意图名称,进入设置意图界面,意图添加完后,需要添加语料,也就是对话中可能出现的问句。如下图所示:
**1.5 添加语料上图中第一行输入框用于语料输入,我们输入 "What's the weather like in Beijing today"。在下面的语料列表中会出现这个句子,然后把鼠标移到 "beijing" 单词上(beijing 两侧会显示中括号),点击并标记为weather.city。标注后会变成蓝色。如下图所示。同样地,我们标注出weather.date
重复步骤 1 至 3,多增加一些关于天气的语料并做好标记。标记问句的句式越多,未来其识别准确率也越高。标记词组:在第一个词单击右键弹出菜单后,再去单击最后一个词,就可以标记词组了。
当我们添加很多不同的天气问法并做好标记,就可以开始训练看看效果了。
1.6 训练和测试
点击菜单左上角的“Training”按钮,会即时提交意图及语料的配置并开始训练。这个过程会需要一段时间,训练完成后界面会有提示。然后我们就可以开始测试了。点击 "Test" 按钮,会从右侧划入一个测试对话区。我们输入 "What's the weather in Beijing today",然后点击 Inspect 按钮,可以查看匹配的意图和匹配上的实体。如下图所示。
在右侧的 Inspect 中,Top scoring intent中展示了匹配的意图名和匹配分数(分值在 0-1 之间,越大代表匹配度越高)。Entities中展示了匹配的实体名和对应的值。
1.7 发布 LUIS
获得理想的测试效果后,点击上方的发布 Publishing 按钮,然后点击 "Publish to production slot",会正式发布,正式发布后,才可以以 API 方式调用。如下图所示:
1.8 访问 LUIS
点击上图 Resource and Keys 区域中的 Endpoint 链接,会在浏览器中打开一个页面。我们在这个 URL 的最后q=后面增加问句,LUIS 的响应报文如下:
{
"query": "What the weather in Beijing today",
"topScoringIntent": {
"intent": "queryweather",
"score": 0.9978801
},
"intents": [
{
"intent": "queryweather",
"score": 0.9978801
}, {
"intent": "None",
"score": 0.00554297026
} ],
"entities": [ {
"entity": "Beijing",
"type": "weather.city",
"startIndex": 20,
"endIndex": 26,
"score": 0.9913792
}, {
"entity": "today",
"type": "weather.date",
"startIndex": 28,
"endIndex": 32,
"score": 0.9752979
}
]
}
上述以 get 请求 LUIS 服务的方法,可以用于各种编程语言的客户端实现中。

2. 基于 Azure 的对话服务

有了 LUIS 提供的理解服务,接下来我们就可以基于 Azure(https://Azure.microsoft.com) 建设查询天气的对话服务了。这个服务最终可以发布成一个 Cortana 技能。
2.1 新建对话服务
首先我们需要创建 Azure 上的资源。如下图所示,点击左侧菜单中的Create a resource按钮,然后在搜索框输入Web App Bot,这是 AI 和认知服务
点击进入 Web App Bot 配置界面,填写机器人名称(bot name)、位置(Location)等信息。其中,Bot template 选项点击后会弹出模板配置,我们选择 C# 语言理解(Language understanding)模板。如下图所示。
填写完成后,点击蓝色的Create按钮,等待完成 WebAppBot 的创建。然后在控制台仪表板的 Dashboard 中,可以看到刚刚新建的服务。如下图所示。
2.2 配置对话服务
因为我们在新建服务时选择的语言理解的 C# 项目模板,因此会自动新建一个 LUIS 应用 "botwoXXXX"。我们需要把对话服务使用的 LUIS 应用改成在 2.1 节中我们自建的。点击我们新建的对话服务 botwo,会进入如下设置界面。
点击左侧菜单的倒数第二项 Application Settings(应用设置),然后在右侧的 AppSettings 中找到如下的 LUIS 应用配置,修改其中的 LuisAppId 的值为 LUIS 的 Application Id。如下图所示。
2.3 开发
点击左侧菜单中的构建(Build)菜单,进入的页面包含三种开发对话函数代码的方式:
在线编码:直接在 WEB 上编写代码并发布。
离线编码:下载示例代码到本地,开发完毕后再发布到 Azure 云端。
持续部署:通过源代码版本控制平台实现持续部署。
我们以第一种方式为例,以 WEB 页面开发的方式实现 Cortana 对话函数。点击Open online code editor链接,进入在线函数编辑界面。如下图所示。
BasicLuisDialog.cs是请求 LUIS 的源代码,LuisIntent定义了函数要处理的意图名称。本例的查询天气的意图名称为queryweather,入参分别是对话上下文和 LUIS 的理解结果。对应的函数处理逻辑示意如下。
[LuisIntent("queryweather")]
public async Task QueryWeatherIntent(IDialogContext context, LuisResult result)
{
// 遍历获取 LUIS 结果中的实体
for (int i = 0; i < result.Entities.Count; i++)
{
EntityRecommendation ent = result.Entities[i];
...
}
// 判断实体是否都存在,如果不存在则提问用户,如果都存在则查询天气
if (city == null || city.Length == 0)
{
await context.PostAsync("please tell me city name!");
...
else
{
String fmtDate = date.ToString("yyyy-MM-dd");
try
{
String weatherResult = WeatherClient.getWeather(city, fmtDate);
...
if (result.data.weather != null && result.data.weather.Length > 0)
{
buf.Append(result.data.weather[0].mintempC).Append("°C");
buf.Append(result.data.weather[0].maxtempC).Append("°C");
}
// 返回给请求端的文本
await context.PostAsync(buf.ToString());
...
2.4 代码发布
对话函数代码编写完毕后,点击OpenConsole按钮会弹出 Console 界面,我们输入 build.cmd 并回车触发编译,如下图所示。到此,对话服务配置完毕,构建成功后我们就可以测试了。
2.5 对话测试
返回主界面并点击左侧菜单中的Test In Web Chat,进入测试界面。如下图所示。
我们输入 "what's the weather in beijing",对话函数会返回缺槽确认;输入 "tomorrow" 补全词槽后,对话服务会请求天气服务,并返回明天北京的天气信息。接着输入 "in shanghai",对话服务会更新词槽值,返回明天上海天气信息。测试符合我们预期。测试过程如下图所示。

3. 配置 Cortana 技能

对话服务测试通过后,我们将其发布为 Cortana 技能,这样可以在 Cortana 中直接使用这个查询天气的技能。点击左侧菜单中的Channel,进入通道配置。我们选择 Add a featured channel 中 Configure Cortana。
配置 Cortana 技能信息,然后点击 Register。
连接的通道会增加 Cortana,通道连接成功后 "Health" 值会变成 "Running"。
这时点击 Cortana 一行的 Edit 按钮,进入 Cortana 配置页面,点击管理(Manage)按钮进入 Cortana 技能管理工作区(Workspace)。
这里可以看到我们发布的 Cortana 的 botwo 已经存在。点击 Store 菜单进入 Cortana 技能列表,可以看到查询天气的技能,到此 Cortana 技能已经配置成功。

4. 技能测试

微软在 Win10+ 的操作系统上内置了 Cortana,也可以在手机上安装 Cortana 应用。由于 Win10 中的 Cortana 在国内网络环境下无法进行实测。所以,以下测试是通过微软官方提供的模拟器来完成的。
下载 ngrok(地址:https://ngrok.com/,注册后免费下载)和 Bot FrameworkEmulator(下载地址:https://github.com/Microsoft/BotFramework-Emulator/releases) ,运行 Bot Framework Emulator 客户端。
点击蓝条上的白色竖点按钮,打开 settings。
路径配置为 ngrok.exe 文件的安装路径,然后保存。点击Enter your Endpoint URL,输入以下网址,https://botwo.Azurewebsites.net/api/messages,并在下方输入 App ID 和 App 的值。
App ID 和 App Pasword 的配置对应的是对话服务的 Application Settings 中的参数值。
点击连接(CONNECT),客户端连到 Cortana 云端,我们开始测试 Cortana 的查询天气技能。测试过程同对话服务,不再冗述。
至此,微软平台技能建设全部介绍完成。

3. 结语

本文介绍了基于微软 Azure 平台,建设 Cortana 查询天气技能的完整过程。到此,我们讲完了 Amazon Alexa、Google Assitant 和 Microsoft Cortana 三个平台的对话技能建设。通过这三篇的实践分享,希望你在理解和实现对话式交互服务上能有所收获。从下一篇开始,我们将基于对话式交互的知识,共同走进智能家居的世界。

参考

 写留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。