百度语音AI实践

在这篇博客中,您将会看到如何使用百度AI开放平台的语音识别技术和UNIT理解与交互技术,实现一个语音控制智能家居的范例。

准备工作

注册百度账号

申请应用

欲使用百度开放平台的API,要先申请应用,获得API KEY才能通过百度API的鉴权。

在控制台的应用列表中点击创建应用,选择所需接口。

本例中需要的接口为百度语音的语音识别以及UNIT两类。

获取Token

在使用百度API前,必须持有百度鉴权发放的Token。获取Token的API如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
### OAuth [GET https://openapi.baidu.com/oauth/2.0/token]

+ Parameters

- grant_type : `client_credentials` (string, required) - 固定值
- client_id : `Va5yQRHl********LT0vuXV4` (string, required) - API Key
- client_secret : `0rDSjzQ20XUj5i********PQSzr5pVw2` (string, required) - API Secret Key

+ Response (application/json)

{
"access_token":"1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328",
"expires_in":86400,
"refresh_token":"2.385d55f8615fdfd9edb7c4b********.604800.1293440400-2346678-124328",
"scope":"public",
"session_key":"ANXxSNjwQDugf8615Onqeik********CdlLxn",
"session_secret":"248APxvxjCZ0VEC********aK4oZExMB",
}

使用百度语音识别

百度语音识别就是将声音文件转化成一段文本,通过调用百度语音提供的REST API完成。如下是一段百度语音识别的API Blueprint(上传文件方式):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### Baidu ASR [POST http://vop.baidu.com/server_api]

+ Parameters

- cuid : `d0:a6:37:ed:3d:eb` (string, required) - 用户唯一标识符
- token : `1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328` (string, required) - 用户认证Token
- dev_pid : `1537` (int) - 识别码
- lan : `zh` (string, deprecated) - 历史兼容参数

+ Request (audio/pcm;rate=16000)

+ Response (application/json)

{
"err_no":0,
"err_msg":"success.",
"corpus_no":"15984125203285346378",
"sn":"481D633F-73BA-726F-49EF-8659ACCC2F3D",
"result":["北京天气"]
}

关于识别码,指定了识别的语言和方式。

dev_pid 语言 模型 是否有标点 备注
1536 普通话(支持简单的英文识别) 搜索模型 无标点 支持自定义词库
1537 普通话(纯中文识别) 输入法模型 有标点 不支持自定义词库
1737 英语 有标点 不支持自定义词库
1637 粤语 有标点 不支持自定义词库
1837 四川话 有标点 不支持自定义词库
1936 普通话远场 远场模型 有标点 不支持自定义词库

关于请求内容类型,百度语音仅支持3种音频格式:pcm, wavamr,推荐采样率为16000,推荐编码为16位单声道。

使用百度理解与交互技术UNIT——快速上手

UNIT(Understanding and Interaction Technology),是百度推出的一套完整的人机智能交互解决方案,理解用户语义并执行相应的操作只是其简单的一个小功能。

您可以将UNIT理解成一个机器人,通过对“任务”的定义和数据的训练,使其具备理解和交互的能力。登陆百度账号后,访问UNIT主页进行配置。

场景

一个场景对应一个独立完整的对话系统,通常按垂类划分(例如,天气场景、电视遥控器场景等)。
场景中包含了一系列对话单元用于完成该场景下的所有对话任务(例如,查温度、换台等)。

场景可以理解为一个智能的可交互对象,新建场景是配置UNIT的第一步,本例中,我们新建一个场景叫做“智能家居控制台”

技能

场景中的某个方向的能力。 技能中包含了一系列对话单元或问答单元用于完成该场景下的所有对话任务(例如,智能电视产品包含了换台、调音量、找部电影等一系列对话单元)。

技能相当于场景所具备的能力,目前UNIT仅允许用户自定义一个技能,并添加其预置技能。预制技能也暂时仅有两种:“问候”和“电视指令”。

对话单元

对话单元代表着产品能够执行的某个特定任务(例如,换到中央台)。

对话单元是UNIT执行任务不可再分的要素了,一个对话单元对应一个具体的任务或操作,对话单元是我们工作面对的主要对象。

一个对话单元包含意图、词槽、和答复三个部分,意图实际上就是一个标识符,标识这个任务,解析意图实际上就是正确识别出一个标识符;词槽可以理解为执行这个意图必须的信息,例如“打开灯”这个意图中,打开灯的位置就是一个词槽,用户必须提供能够表示位置的词(例如“客厅”)插入词槽中,这个意图才可以被成功执行;答复就是意图执行的结果,答复可以是“直接回复”,也可以是“引导”,直接回复或回复一段文本,或执行一条函数,而引导则是开启另一个对话单元。

点击自定义技能中的新建单元,即可配置一条新单元。

训练

所有自定义的对话单元都必须经过训练才能保证可用性和准确性,用于训练的最主要手段是样本集,即包含提问和回答的有监督数据。在数据中心中,配置默认集,

然后在训练与验证中就能训练并生效模型,一个模型是当前对话单元、训练集的一个快照,模型必须经过训练并生效到沙盒中才能供测试和API调用。

通用流程

综上所述,场景是训练的基本单位,得到一个智能交互机器人的通用流程如下:

  1. 新建一个场景。
  2. 定义场景技能。
  3. 编制样本集,录入数据中心。
  4. 训练。
  5. 生效,测试,整合进产品,上线…。

REST API

将模型应用到沙盒中去后,就可以通过REST API访问我们训练好的机器人了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
### Unit Utterance [POST https://aip.baidubce.com/rpc/2.0/solution/v1/unit_utterance]

+ Parameters

- access_token : `1.a6b7dbd428f731035f771b8d********.86400.1292922000-2346678-124328` (string, required) - Token

+ Request (application/json)

{
"scene_id":123,
"query":"今天北京天气怎么样?",
"session_id":""
}

+ Response (application/json)

{
"log_id": 1234,
"result": {
"session_id": "xxx",
"action_list": [
{
"confidence": 205,
"action_id": "aaa",
"main_exe": "xxx",
"arg_list": [
"string",
"string"
],
"exe_status": [],
"say": "xxx",
"hint_list": [
{
"hint_query": "11111"
},
{
"hint_query": "2222222"
}
],
"action_type": {
"act_type": "clarify",
"act_target": "slot",
"act_target_detail": "loc",
"act_type_detail": ""
},
"code_actions": {}
}
],
"schema": {
"current_qu_intent": "xxx",
"intent_confidence": 3,
"bot_merged_slots": [
{
"begin": 10,
"length": 15,
"original_word": "word",
"normalized_word": "word",
"word_type": "string",
"type": "XXX",
"confidence": 2,
"session_offset": 0,
"merge_method": "add"
}
]
},
"qu_res": {
"intent_candidates": [
{
"extra_info": null,
"func_slot": "",
"intent": "SYS_WEATHER",
"intent_confidence": 99.999938964844,
"intent_need_clarify": false,
"from_who": "",
"match_info": "",
"slots": [
{
"confidence": 99.99959564209,
"length": 4,
"normalized_word": "2017-05-25",
"offset": 0,
"original_word": "今天",
"type": "sys_time",
"word_type": "",
"need_clarify ": true
}
]
}
],
"lexical_analysis": [
{
"basic_word": [
"中国"
],
"type": "21",
"term": "中国",
"weight": 0.1911181211471558
},
{
"basic_word": [
"北京"
],
"type": "6",
"term": "北京",
"weight": 0.3822362422943115
},
{
"basic_word": [
"人民",
"大学"
],
"type": "7",
"term": "人民大学",
"weight": 0.4266456961631775
}
],
"sentiment_analysis": {
"label": 2,
"pval": 0.196025
}
}
}
}

返回的数据量非常大,关于这部分您可以查看百度官方技术文档,在这里不做赘述。

实践

UNIT测试

本例定义了一个简单的“开灯”对话单元,有一个“位置”词槽,使用3个样本数据训练了一个迷你机器人。

在百度UNIT页面可与训练好的BOT进行交互:

当然,实战需要更加海量的数据。

语言实践

本例使用Go语言编写了一个百度AI客户端包,目前可以做到:

  • 获取并管理Token;
  • 语音识别;
  • 访问UNIT机器人。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package main

import (
"fmt"

"github.com/hinanawitenshi/baiduai"
)

func main() {
c := baiduai.NewClient(
"myapikey",
"mysecretkey",
)
c.NewSession()
fmt.Println(c.Voice2Text("audio.wav", "wav", "16000", 1536))
fmt.Println(c.Unit(20079, "打开客厅灯", 1))
}

返回结果:

1
2
&{0 success. 842193954671523782416 6544595644287405787 [明天天气怎么样]}
&{152378241880814 0 {1 [{turn_light_on_satisfy { } [] {} 1 [] OK []}] {TURN_LIGHT_ON 99.99630737304688 [{0 0 0 客厅 user_location 0 update}]} {[] [] {0 0}}}}