微信小程序调用讯飞语音听写(流式版)API接口
目录
首先,讯飞的该api接口要调用较为麻烦,由于本人的粗心以及对网络连接和各个数据的处理不熟练,在连接的过程中踩了很多坑,这里先展示使用微信开发者工具最终成功连接的过程,中途碰到的问题在后续会一一列出。使用的语言为javascript。
-
获取产品
要使用讯飞接口需要先购买讯飞产品,讯飞产品可以免费试用,按照步骤开通免费服务即可投入测试。在后续代码调试完成后可以再购买使用量和其他高级服务。
图1-1
图1-2
开通完成后界面(图1-3):
图1-3
右边上角红色方框处的“APPID”、“APISecret”、“APIKey”为应用信息,在使用接口时会用到,右下角为高级功能,开通需要额外付费,下拉可以查看其他各种信息。图中的曲线为我调用接口服务的次数。
下拉后可以看到右下角有白名单(图1-4),它可以限制访问你开通应用的ip。当你关闭白名单或者开启白名单却不设置ip地址时所有的ip都可以访问你的应用,设置以后只有你设置的ip可以访问。这里的ip不能填内网地址,要填你公网ip的地址。
图1-4
Ip的填写如图1-5所示,每行一个ip,用换行隔开。
图1-5
获取自己公网ip可以百度搜索ip,有专门的网站可以查询(图1-6、图1-7),将查到的ip填入白名单即可。网址:IP地址查询_本机IP_我的IP (900cha.com)
图1-6
图1-7
至此准备工作已经完毕,可以开始api连接的代码了。点击查看api连接文档可以学习连接使用的流程(图1-8),一定要详细阅读,不然会漏掉很多东西导致连接api失败。
图1-8
-
代码实现
-
准备工作
对于讯飞接口鉴权需要用到utf-8编码、base64编码和hmac-sha256算法加密,为此我们需要安装一些npm包便于编写。在前面已经介绍过微信开发者程序安装npm包的过程,链接:微信开发者工具使用npm-优快云博客,这里不在赘述。
需要的npm包:base-64(用于base64编码);utf8(用于utf-8编码);crypto-js(用于hmac-sha256加密)。
声明变量用于使用:
const CryptoJS = require('crypto-js');
const base64 = require('base-64');
const utf8 = require('utf8');
需要用到的其他变量(其中的秘钥等信息在上面已经提到,要在开启的网站中查询):
const xunfei_APISecret = '你的讯飞APIsecret'
const xunfei_APIKey = '你的讯飞APIKey'
const xunfei_APPID = '你的讯飞APPID'
var socket_task = null//用于存储socket数据
-
接口鉴权
这是连接过程中最繁琐的一步,要用到大量的变量和算法,目的是将你的秘钥以及apikey等信息通过加密用于访问接口地址时的身份认证,在通过认证后才可以开始使用接口。
查阅官方文档可知我们需要的请求地址为‘wss://iat-api.xfyun.cn/v2/iat’,请求时需要三个参数分别为host、date、authorization。接下来我们来获取这三个参数。
·host
在官方文档中已经给出,这是固定参数,值为‘iat-api.xfyun.cn’。
·date
当前的时间戳,要RFC1123格式(示例:Wed, 10 Jul 2019 07:35:43 GMT)。在微信开发者程序中可以直接调用微信api接口获取当前时间:
var date = new Date().toString()
是toString()作用是将获取的时间转化为字符串,由于版本问题,我在这里获取到的时间为Thu Jun 06 2024 15:04:26 GMT+0800 (中国标准时间),需要将其转换为讯飞要求的格式。
代码实现:
xunfei_getdate(date_origin){
var len = date_origin.length * -1
date_origin = date_origin.substr(len,3) + ',' + date_origin.slice(len + 3,-9)
len = date_origin.length * -1
date_origin = date_origin.substr(len,5) + date_origin.slice(len + 9,len + 11) + date_origin.slice(len + 4,len + 8) + date_origin.slice(len + 11)
return date_origin
},//日期的转换,讯飞日期格式较为严格,这里后续可能要改写,以便于适应多种日期格式
这样处理完后返回的日期为Thu Jun 06 2024 15:04:26 GMT+0800。由于url特殊的格式,在将date填入url时还需要将其中特殊字符转化为对应URI格式:encodeURIComponent(date)。
如果后续微信开发者工具更新使这里获取的date格式改变则需要再对函数进行更改。
·authorization
这个参数需要用到前面已经获取的秘钥等信息,中间需要的参数较为繁琐,这里先给出代码:
var date = new Date().toString()
date = this.xunfei_getdate(date)//前面已经写好的日期转化函数
var host = 'iat-api.xfyun.cn'//固定参数,可以从官方的api文档查看
//----------------------------------------------
var request_line = 'GET /v2/iat HTTP/1.1'
var signature_origin = `host: ${host}\ndate: ${date}\n${request_line}`//这里为signature原始字段,其中反引号``可以带入表达式,${}中的内容相当于`+host+`,方便带入变量,其他部分与字符串一致
var signature_sha = CryptoJS.HmacSHA256(signature_origin,xunfei_APISecret)//hmac-sha256加密,使用讯飞提供的秘钥加密
var signature = CryptoJS.enc.Base64.stringify(signature_sha)//进行base64编码
//-----------------------------------------------
var authorization_origin = `api_key="${xunfei_APIKey}",algorithm="hmac-sha256",headers="host date request-line",signature="${signature}"`
var authorization = base64.encode(utf8.encode(authorization_origin))//这里base64编码需要与utf8编码一起使用,即要先进行utf8编码在进行base64编码
需要的参数分别为‘api_key’、‘algorithm’、‘headers’、‘signature’,其中‘headers’和‘algorithm’为固定参数,文档中已经给出(algorithm为加密算法,目前仅支持hmac-sha256,所以也为固定参数),分别为algorithm="hmac-sha256"、headers="host date request-line",CryptoJS、base64、utf8是是从前面npm包下载后声明的变量。
至此所有参数获取完毕,可以编写url:
var url = `wss://iat-api.xfyun.cn/v2/iat?authorization=${authorization}&date=${encodeURIComponent(date)}&host=${host}`//函数encodeURIComponent()用与将字符串转化为URI编码,用于访问Web上的特定资源文件
-
连接接口
编写连接代码测试连通性:
get_xunfeireply(xunfei_url){
socket_task = wx.connectSocket({
url: xunfei_url,
success:res=>{
console.log('讯飞连接成功,返回消息:',res)
},
fail:res=>{
console.log('讯飞连接失败:',res)
}
})
socket_task.onOpen(res=>{
console.log('讯飞socket接口打开:',res)
})
socket_task.onMessage(res=>{
console.log('讯飞传回消息:',res)
socket_task.close()//暂时关闭,用于测试
})
socket_task.onError(res=>{
console.log('连接错误:',res)
})
socket_task.onClose(res=>{
console.log('连接关闭:',res)
})
},
编写其余部分,运行代码,如图2.3-1:
图2.3-1
可见连接成功了,前面没有问题,再编写一段函数用于试着上传数据:
send_xunfei(){
var first_data = {
common:{
'app_id':xunfei_APPID
},
business:{
'language':'zh_cn',
'domain':'iat',
'accent':'mandarin'
},
data:{
'status':0,
'format':'audio/L16;rate=16000',
'encoding':'raw',
'audio':''//上传的音频需要进行base64编码,我使用的为pcm格式,编码前每一段音频格式为数组,需要将数据进行base64编码后再上传,这里可以使用微信开发者程序自带的数组转base64功能api:wx.arrayBufferToBase64()
}
}
socket_task.send({
data:JSON.stringify(first_data)
})//发送第一帧,JSON.stringify()为转换函数,可以把对象转换为字符串,用于使传输数据格式合法
socket_task.send({
data:JSON.stringify({
data:{
'status':2
}
})
})//发送最后一帧
},//测试函数,后续会被取代,用于测试讯飞接口使用情况
将函数嵌入上面的接口打开代码中:
socket_task.onOpen(res=>{
console.log('讯飞socket接口打开:',res)
this.send_xunfei()
})
运行试试(图2.3-2):
图2.3-2
查阅官方文档可知code为0时数据传输成功,到官方网站看也发现服务量增加(图2.3-3),说明服务调用成功,可以正常使用接口。
图2.3-3
至此微信小程序调用讯飞接口大功告成,后续可以自己优化代码进行使用。
文章性质为本人学习后做的笔记,如有侵权请联系本人删除。