# 百度开放平台API

# 配置文件

打开 uniCloud/cloudfunctions/common/uni-config-center/vk-unicloud/index.js 文件,配置里面的

"openapi.baidu" 百度开放平台

// 开放平台api
"openapi":{
  // 百度开放平台 (主要用于身份证识别,营业执照识别等API)
  "baidu":{
    "appid" : "",     // 对应的API Key
    "appsecret" : ""  // 对应的Secret Key
  }
}
1
2
3
4
5
6
7
8

配置完需要上传 uni-config-center 这个公共模块才会生效

API Key申请地址:传送门 (opens new window)

目前百度云是有免费版本的,基本也够用了。

# 【云函数】调用百度开放平台API

# 百度API通用接口(简易版)

优势:代码极简

缺点:部分接口不支持

/**
 * 百度开放平台API通用接口
 * 身份证识别为例 https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
 * @param {String} action 接口名 如: ocr/v1/idcard的部分
 * @param {String} actionVersion 接口版本 默认2.0
 * @param {object} header 请求头 默认 { "content-type": "application/x-www-form-urlencoded" }
 * @param {object} data 请求数据
 * 示例
 */
let requestRes = await vk.openapi.baidu.open.request({
  action:"ocr/v1/idcard",
  actionVersion: "2.0",
  data:{
    image:base64
  }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 百度API通用接口(通用版)

优势:支持所有接口

# 文本合成语音示例代码

// 获取tokne
let access_token = await vk.openapi.baidu.open.auth.getAccessToken();
// 发起请求
let buffer = await vk.request({
  method: "POST",
  url: "https://tsn.baidu.com/text2audio", // 请求地址
  // 请求头
  headers: {
    "content-type": "application/x-www-form-urlencoded",
  },
  dataType: "default", // 如果对方返回的是二进制数据,则需要传设置为default
  // 请求参数
  data: {
    tok: access_token,
    tex: "你好,我是AI小助手",
    cuid: "1",
    ctp: 1,
    lan: "zh",
    spd: 5,
    pit: 5,
    vol: 5,
    per: 0,
    aue: 3
  }
});
try {
  // 如果buffer的长度小于500,基本上就是报错了,转json看下错误信息
  if (buffer.length < 500) {
    let err = JSON.parse(buffer.toString("utf-8"));
    return {
      code: err.err_no,
      msg: err.err_msg,
      err: err
    }
  }
} catch (err) {}

// 上传到云存储
let uploadFileRes = await uniCloud.uploadFile({
  cloudPath: `${Date.now()}.mp3`,
  fileContent: buffer
});
// 获得url地址
let url = uploadFileRes.fileID;
console.log('url: ', url);
return {
  code: 0,
  url
};
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

# 语音解析文本示例代码

格式支持:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)、m4a(压缩格式,仅支持极速版模型,m4a格式输入适用于微信小程序的录音文件,详见格式说明)。推荐pcm 采样率 :16000 固定值。 编码:16bit 位深的单声道。

百度服务端会将非pcm格式,转为pcm格式,因此使用wav、amr、m4a会有额外的转换耗时。

16k 采样率pcm文件样例下载 (opens new window) 16k 采样率wav文件样例下载 (opens new window) 16k 采样率amr文件样例下载 (opens new window) 16k 采样率m4a文件样例下载 (opens new window)

注意:微信小程序的录音文件格式是 m4a

// 解析语音
let mediaUrl = "https://mp-70255e58-5282-4b64-941f-006c17c560c8.cdn.bspapp.com/cloudstorage/95ee5952-7aef-4bf9-8b2c-15bd43eb5b7b.pcm";

// 获取文件的后缀名
let suffixName = mediaUrl.substring(mediaUrl.lastIndexOf(".") + 1);

// 文件转buffer
let buffer = await vk.request({
  url: mediaUrl,
  method: "GET",
  dataType: "default",
});

// buffer转base64
let base64 = buffer.toString('base64');

// 获取token
let access_token = await vk.openapi.baidu.open.auth.getAccessToken();

// 请求接口
let requestRes = await vk.request({
  method: "POST",
  url: "https://vop.baidu.com/pro_api",
  headers: {
    "content-type": "application/json",
  },
  dataType: "json",
  data: {
    token: access_token,
    format: suffixName,
    rate: 16000,
    channel: 1,
    cuid: "001",
    dev_pid: 80001,
    speech: base64,
    len: buffer.length,
  }
});
if (requestRes.err_no !== 0) {
  // 失败直接返回
  return {
    code: requestRes.err_no,
    msg: requestRes.err_msg,
    err: requestRes
  }
}
// 得到文件内容,注意,这是一个数组
let result = requestRes.result;
console.log('result: ', result);

return {
  code: 0,
  msg: requestRes.err_msg,
  result: requestRes.result
};
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

# 【前端】直接调用百度开放平台API

前端直接调用只有小程序和APP可以调用,H5有跨域限制

API通用接口

/**
 * 百度开放平台通用请求接口
 * @param {String} action        接口名称
 * @param {String} actionVersion 接口版本名称 默认2.0
 * @param {String} title         loading文字
 * @param {object} data          请求参数
 * @param {String} success       成功回调
 * @param {String} fail          失败回调
 * @param {String} complete      完成回调
 */
vk.openapi.baidu.request({
  action: 'ocr/v1/business_license',
  actionVersion:"2.0",
  title:"识别中...",
  data: {
    image:base64
  },
  success: (data) => {
    this.data = data;
  },
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

**更多接口(action名称)请查看: ** 点击前往百度开放平台API (opens new window)

注意:前端直接调用的

优势

  • 1、请求速度更快
  • 2、使用方便
  • 3、无需再写云函数
  • 4、省流量(省钱)云函数是按量扣费的

劣势

  • 1、有token泄露风险,但此token并不会造成多大的危害。

如果是小程序,需要将以下域名加入到小程序的request域名白名单(去小程序后台加)

https://aip.baidubce.com
1

以下是前端使用的更快捷的API形式

/**
 * 营业执照识别
 * 以下data参数三选一即可
 * @param {File} file     文件对象
 * @param {String} image  图像base64编码后进行urlencode
 * @param {String} url    图片完整URL
 *
 */
vk.openapi.baidu.open.ocr.business_license({
  title: "识别中...",
  data: {
    file: res.tempFiles[0]
  },
  success: (res) => {
    this.data = res.data;
  },
});

/**
 * 身份证识别
 * 以下data参数三选一即可
 * @param {File} file     文件对象
 * @param {String} image  图像base64编码后进行urlencode
 * @param {String} url    图片完整URL
 */
vk.openapi.baidu.open.ocr.idcard({
  title: "识别中...",
  data: {
    image: base64
  },
  success: (res) => {
    this.data = res.data;
  },
});
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