在智能音箱越来越普及的现在,围绕音箱而生的生态服务也愈加蓬勃,开发者如何才能拥抱音箱生态,制作自己的语音应用服务?我们调研了以京东小京鱼为主的平台,梳理了语音应用的实现方式。

语音应用也被称作技能,是指以语音为核心交互方式的服务,它包含:

  1. “意图”代表使用技能过程中用户可以进行的操作
  2. “话术”指定用户可以说的话来调用这些意图

意图集合与话术集合的映射关系形成了交互模型。

意图

定义:代表使用技能过程中用户可以进行的操作。

一般平台会提供预置的意图(操作)供开发者选择,这是为了将一些常用的功能统一,提高系统的一致性。例如退出功能,就是必选的意图,因为每个服务都需要能够结束。当然,用户也可以创建自定义的意图。

话术

定义:指定用户可以说的话来命中对应的意图。

比如我们定义了一个查询天气的功能(意图),可以通过定义话术,来定义用户用什么样的话来查询天气,如下图,不同的话术都可以命中到同一个查询天气的功能。

槽位

定义:意图在执行操作前需要获取的关键参数。

当用户使用某个技能时,系统需要获取用户指令中的某些参数,来返回特定值。比如当用户问“北京天气怎么样?”这个指令中,“北京”就是一个关键参数,系统需要获取查询的地点返回不同信息,这些关键参数我们用“槽位”来表示。

槽位是一组具有相同特征的短语组成的集合。如时间、城市、数字等。平台一般会提供一些常见的槽位类型,开发者也可以自定义槽位类型。

槽位实际是一些特定槽值的集合,开发者自定义槽位后,还需要定义这个槽位的所有槽值。

语音交互模型

一个完整语音交互模型包含多个意图,每个意图可由多个话术触发,每个话术中可能包含多个槽位,每个槽位背后对应着一个槽值的集合。

+++

如何设计一个语音服务

用户对着智能设备说话,如果能匹配到某一话术,系统将命中其后的意图,并从用户说的话中解析出槽位信息。比如用户说“打开‘航旅’,我要预订明天从北京到上海的机票”,其中“打开航旅”就是航旅这个技能的触发话术,系统识别到这个话术后将用此技能来解析指令。

当某一个槽位是必填项,但是无法从用户说的话中解析出槽位,开发者可以配置槽位的会话来询问用户。

语音服务通过对话来实现用户的需求,它有以下几个设计原则

  1. 设计合理的多轮对话关系
  2. 对话需要考虑上下文关系
  3. 表达简洁与句式完整
  4. 覆盖可能的对话场景
  5. 提供稳定的对话模式

+++

一个技能是如何运行的

创建好技能后,用户在使用技能时,开放平台解析出用户的请求,然后通过POST方式发送 JSON 格式的请求数据到开发者的技能云端。开发者需要按照数据协议开发此技能的服务程序进行逻辑处理,然后返回 JSON 格式的响应数据给开放平台。

开发者需要准备以下内容:

  • 服务端点,平台向这个端点发送POST请求,来调用技能的云端程序。
  • 关联账号,如果技能需要用户登录后才能使用,需要配置基于OAuth2标准的服务端和业务数据接口。

服务端点

平台一般支持两种端点类型,它们是“HTTPS”与“函数计算”。

HTTPS

如果开发者把技能的服务程序部署在自己服务器或者云主机上,可以选择HTTPS端点类型,并配置以下信息:

  1. HTTPS端点,平台向这个服务端点发送POST请求,来调用技能的服务程序。
  2. SSL证书,平台验证技能的服务端点是安全可信的。需要开发者提供SSL 证书验证方案,用于验证服务端点是安全可信的。如果服务端点没有受信任证书颁发机构的证书,则需要开发者手动上传x509 public.pem格式的自签名证书。
  3. 请求签名,服务端点验证请求来源于小京鱼-Skill开放平台。这是可选配置项。 如果开发者选择需要对请求进行签名,在平台请求Skill的Request Header(请求消息头)中会额外加入两个字段 Request-Date (请求时间)与 Skill-Token(Skill开放平台加密后的Token)。 技能服务端通过加密公式:———–Token = MD5(RequestBody的JSON内容 + “#” + 密钥 + “@” + Request-Date)———–计算自己的Token。然后对比Token与Skill-Token是否一致来验证当前请求是否来源于小京鱼-Skill开放平台。

函数计算

开发者无需管理服务器配置,无需配置网络环境,无需申请https域名。支持访问第三方接口、数据库.

关联账号

当一个服务需要用户登录时,平台和技能开发者的第三方云之间就需要进行账号绑定。账号关联过程中,技能开发者的服务需要给平台服务器一个访问令牌作为身份的唯一标识。 账号关联成功后,在平台访问开发者的服务时,会在请求数据中带上此访问令牌 (session.user.accessToken)。开发者可以通过此访问令牌来判定用户是否是自己账号系统中的合法身份,完成身份验证。

服务系统需要提供基于OAuth 2.0的标准接口。用户在APP上启用此技能时,需要登录第三方账号进行关联

服务测试

设置好交互模型和服务端后,开发者可以在平台上进行调试,模拟用户输入来测试各个话术和功能。

+++

智能家居控制服务

服务的内容可以是一个智能家具设备,用户使用语音控制家居设备的相关操作,这时候开发者一般不需要创建语音交互模型,因为平台针对家居控制的话术已经有一套语音交互模型。

智能设备的控制需要进行账号关联,以获取此用户账号下的智能设备列表,授权方式与普通技能一致。

平台一般会定义一套智能家居协议,开发者只需要根据协议完成设备操作,并按要求返回结果即可,以京东IoT平台为例,智能家居协议由header和payload组成,示例如下。

{  
    "header": {  
        "namespace": "Alpha.Iot.Device.Control",  
        "name": "AdjustUpTemperatureRequest",  
        "messageId": "xxxxxxxxxxxxxxxxxxxx",  
        "payLoadVersion": "1",  
        "userId": "xxxxxxxxxxxxxxxxxxxx"  
    },  
    "payload": {  
        "accessToken": "access_token",  
        "deviceId": "device_id",
        "extensions": {  
  
        }    // 发现设备时候,返回的extensions数据  
    }  
}  

Header

其中需要关注Alpha.Iot.Device.Control(设备控制)部分,平台定义了设备控制相关的参数,开发者只可以在这个范围内实现设备的相关操作。


发表评论

电子邮件地址不会被公开。 必填项已用*标注