微信小程序调用讯飞语音听写(流式版)API接口-js

微信小程序调用讯飞语音听写(流式版)API接口

目录

微信小程序调用讯飞语音听写(流式版)API接口

获取产品

代码实现

准备工作

接口鉴权

连接接口


首先,讯飞的该api接口要调用较为麻烦,由于本人的粗心以及对网络连接和各个数据的处理不熟练,在连接的过程中踩了很多坑,这里先展示使用微信开发者工具最终成功连接的过程,中途碰到的问题在后续会一一列出。使用的语言为javascript。

  1. 获取产品

要使用讯飞接口需要先购买讯飞产品,讯飞产品可以免费试用,按照步骤开通免费服务即可投入测试。在后续代码调试完成后可以再购买使用量和其他高级服务。

图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

  1. 代码实现

  1. 准备工作

对于讯飞接口鉴权需要用到utf-8编码、base64编码和hmac-sha256算法加密,为此我们需要安装一些npm包便于编写。在前面已经介绍过微信开发者程序安装npm包的过程,链接:微信开发者工具使用npm-CSDN博客,这里不在赘述。

需要的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数据
  1. 接口鉴权

这是连接过程中最繁琐的一步,要用到大量的变量和算法,目的是将你的秘钥以及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",CryptoJSbase64utf8是是从前面npm包下载后声明的变量。

至此所有参数获取完毕,可以编写url:

var url = `wss://iat-api.xfyun.cn/v2/iat?authorization=${authorization}&date=${encodeURIComponent(date)}&host=${host}`//函数encodeURIComponent()用与将字符串转化为URI编码,用于访问Web上的特定资源文件
  1. 连接接口

编写连接代码测试连通性:

  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

至此微信小程序调用讯飞接口大功告成,后续可以自己优化代码进行使用。

文章性质为本人学习后做的笔记,如有侵权请联系本人删除。

提供了一系列的语音识别API,其中包括实时语音识别。你可以使用Python来调用提供的API,实现实时语音识别的功能。下面是一个简单的示例代码: ```python import websocket import datetime import hashlib import base64 import json # 设置API的相关参数 APPID = 'your_appid' API_KEY = 'your_api_key' API_SECRET = 'your_api_secret' # 获取当前时间戳 now = datetime.datetime.now() timestamp = str(int(now.timestamp())) # 构造签名信息 signature_origin = f"{API_KEY}POSThttps://iat-api.xfyun.cn/v2/iatrealtime{timestamp}content-type:application/json" signature_sha = hashlib.sha256(signature_origin.encode('utf-8')).digest() signature = base64.b64encode(signature_sha).decode('utf-8') # 构造websocket连接地址 url = f'wss://iat-api.xfyun.cn/v2/iatrealtime?authorization={API_KEY}:{signature}&date={timestamp}&host=iat-api.xfyun.cn' # 发送websocket请求 def on_message(ws, message): result = json.loads(message) if result['code'] == 0: print(result['data']['result']) def on_error(ws, error): print(error) def on_close(ws): print("### closed ###") def on_open(ws): def run(*args): # 发送开始识别命令 data = { "common": { "app_id": APPID }, "business": { "language": "zh_cn", "domain": "iat", "accent": "mandarin", "vad_eos": 5000 } } ws.send(json.dumps(data)) thread.start_new_thread(run, ()) websocket.enableTrace(True) ws = websocket.WebSocketApp(url, on_message=on_message, on_error=on_error, on_close=on_close) ws.on_open = on_open ws.run_forever() ``` 上面的代码中,我们使用了Python中的websocket库来建立websocket连接,然后将API所需的参数进行编码,并构造出websocket连接地址。在连接成功后,我们发送开始识别命令,接着可以收到实时的语音识别结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值