微信小程序调用讯飞语音听写(流式版)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-优快云博客,这里不在赘述。

需要的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

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

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

微信小程序接入语音识别服务,能够实现在用户说话的同时实时转录文本的功能,极大地提升了交互体验和效率。下面简要介绍如何接入语音听写的步骤及注意事项: ### 步骤一:注册并获取应用ID 访问科大开放平台官网(https://www.xfyun.cn/),注册账号并完成认证流程。获取对应语音识别应用的AppID和应用密钥。 ### 步骤二:安装SDK依赖库 为了在小程序调用语音识别服务,需要使用提供的小程序插件。在小程序项目目录下的“package.json”中增加对插件的引用,并通过npm或其他包管理工具安装。安装命令如下: ```bash npm install @xfyun/xiaoying-sdk-weapp@latest ``` ### 步骤三:引入并初始化SDK 在小程序页面的JS文件中引入SDK并进行初始化操作,通常需要设置API Key、Secret Key等信息。 ```javascript const XFYunSDK = require("@xfyun/xiaoying-sdk-weapp"); // 初始化参数 const apiKey = "你的apiKey"; const secretKey = "你的secretKey"; // 初始化SDK实例 let xiaoYinSDK = new XFYunSDK.XiaoYinSDK(apiKey, secretKey); // 设置本地缓存路径(非必填) xiaoYinSDK.setLocalCacheDir("/path/to/cache"); xiaoYinSDK.init().then(() => { console.log("SDK 初始化成功"); }).catch((error) => { console.error("SDK 初始化失败", error); }); ``` ### 步骤四:调用语音识别API 当用户点击开始录音按钮时,触发语音识别过程。在录音结束后或录音中断时,回调API接口获取识别结果。 ```javascript const recorderManager = getCurrentPages()[getCurrentPages().length - 1].recorderManager; // 获取当前页的录音管理器 const transcriber = xiaoYinSDK.createTranscriber(); // 创建语音识别实例 recorderManager.onStart(() => { console.log("开始录音..."); }); recorderManager.onPause(() => { console.log("暂停录音..."); }); recorderManager.onStop(() => { let blob = recorderManager.getBlob(); let audioDataURL = wx.createInnerAudioContext().createRawData(blob).url; // 发起语音识别请求,使用rawData接口传入音频数据 transcriber.recognizeRawData(audioDataURL).then(transcribeResult => { console.log("语音识别结果:", transcribeResult.text); // 在这里展示识别出的文字内容 }).catch(error => { console.error("语音识别错误:", error); }); }); ``` ### 注意事项 1. **权限申请**:确保小程序已经获得录音权限。在小程序的config.js文件中加入: ```javascript app.config = { ..., pages: { ..., "pages/index/index": { ..., authSetting: { ..., openLocation: false, record: true, camera: false, ..., ... }, }, }, }; ``` 2. **资源管理**:合理规划存储空间,避免音频文件占用过多内存导致性能下降或加载失败。 3. **错误处理**:在实际应用中加入详细的错误捕获机制,以确保用户体验流畅且反馈清晰。 通过以上步骤,你可以在微信小程序中成功接入语音听写功能,为用户提供高效准确的语音输入体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值