微信会话语音文件的一句话识别

2020-07-24 19:25:23 浏览数 (1)

1.项目需求

需求一:将微信会话中的小于60秒的语音文件在线识别为文字

需求二:输入小于60秒的语音文件的url地址,然后将对应的语音文件在线识别成文字

2.项目准备

  • 微信小程序开发者账号

前往注册

  • 微信开发者工具

前往下载

  • 腾讯云语音识别-一句话识别API说明文档

参考文档

3.项目演示

  • 开通云开发控制台并创建云端项目环境
  • 新建项目
  • 创建一个名为cloud的云函数根目录

  • 配置cloud目录为云函数根目录
代码语言:javascript复制
"cloudfunctionRoot": "cloud/",

  • 点击编译发现cloud新增了一个云图标
  • 创建用于存放一句话识别API的云函数wordRecognize

  • 在云函数的"package.json"文件中配置云函数的tencentcloud-sdk-nodejs依赖
代码语言:javascript复制
"tencentcloud-sdk-nodejs": "latest",
  • 安装依赖

在wordRecognize云函数目录上右键选择在"在终端中打开",执行"npm install"安装依赖

  • 在一句话识别云函数目录下的入口文件index.js中实现一句话识别的API调用Demo,然后上传Demo至云端
代码语言:javascript复制
// 云函数入口文件
const cloud = require('wx-server-sdk')  // 引入云开发服务的内核SDK

cloud.init(   //初始化一个'wx-server-sdk' SDK 实例
{
  env: 'ai-test-t7t64'   // 开通云开发服务后创建的云环境的环境ID(默认可以创建两个ID)
}
)

// 云函数入口函数
exports.main = async (event, context) => {
   
const tencentcloud = require("tencentcloud-sdk-nodejs");  //引入腾讯云SDK

// 下面的代码可以通过explorer在线生成(https://console.cloud.tencent.com/api/explorer?Product=aai&Version=2018-05-22&Action=SentenceRecognition&SignVersion=)
const AaiClient = tencentcloud.aai.v20180522.Client;
const models = tencentcloud.aai.v20180522.Models;

const Credential = tencentcloud.common.Credential;
const ClientProfile = tencentcloud.common.ClientProfile;
const HttpProfile = tencentcloud.common.HttpProfile;

let cred = new Credential("", "");
let httpProfile = new HttpProfile();
httpProfile.endpoint = "aai.tencentcloudapi.com";
let clientProfile = new ClientProfile();
clientProfile.httpProfile = httpProfile;
let client = new AaiClient(cred, "ap-guangzhou", clientProfile);

let req = new models.SentenceRecognitionRequest();
let url=event.url   //接收客户端post的url参数,值类型为Url
var params =  {"ProjectId":0,"SubServiceType":2,"EngSerViceType":"16k_zh","SourceType":0,"VoiceFormat":"mp3","UsrAudioKey":"www","Url":url}  // 定义SDK的请求参数字典
params = JSON.stringify(params)   // 转换为json字符串
req.from_json_string(params);
return new Promise((resolve, reject) => {   // 通过Promise容器来接收异步API的回调,然后通过当前脚本返回给客户端
  client.SentenceRecognition(req, function(errMsg, response)  {  // 此接口是异步的,那么当前脚本无法对外直接访问接口返回值
    if (errMsg) {
      resolve({ "Result": errMsg })
    }
    // resp = response.to_json_string()
    resolve({ "Result": response})
});
})
}

注:云函数的入口文件index.js中调用的"一句话识别"API方法"SentenceRecognition”是异步的,如果直接拷贝Explorer中生成的Demo,将无法为小程序客户端返回"SentenceRecognition”的回调数据,脚本最终会返回null;所以这里我们需要使用Promise对象来获取"SentenceRecognition"的回调数据,然后返回给小程序客户端

  • 在小程序公共配置文件app.json中,添加页面生成参数
代码语言:javascript复制
"pages/word/word",

  • 点击编译后,可以看到页面的四个文件

完善客户端页面相关文件Demo

word.xml

代码语言:javascript复制
 <button type="primary" bindtap="uploadRecord">上传微信会话文件</button>

 <textarea placeholder="一句话识别结果" auto-focus value="{{ Words }}" />

word.js

代码语言:javascript复制
Page({
  /**定义一些逻辑数据 */
   data:{
     tempVoicePaths:"", //录音文件的本地临时文件
     fileID:"", //录音文件上传至云存储中后生成的文件ID
     tempUrl:"",//云存储提供的录音文件临时url
   },
 
  /**将录音文件的Url上传至服务端进行识别,获取到识别任务的ID */
   uploadRecord:function(e){
     var that=this;
     wx.chooseMessageFile({
       count: 10,
       type: 'all',
       success (res) {
         // tempFilePath可以作为img标签的src属性显示图片
         console.log("会话中选择的音频文件在微信客户端的临时路径" res.tempFiles[0].path)
         that.setData({
           tempVoicePaths: res.tempFiles[0].path
         })
 
       wx.cloud.init()
       var cloudPath = Date.parse(new Date())/1000;
       cloudPath = cloudPath / 1000;
       cloudPath=cloudPath.toString();
       wx.cloud.uploadFile({
       cloudPath: cloudPath, // 上传至云端的路径
       filePath: that.data.tempVoicePaths, // 小程序临时文件路径
       success: res => {
         // 返回文件 ID
         console.log("将音频文件上传到云存储后,返回的文件ID是" res.fileID)
         wx.cloud.init()
         wx.cloud.getTempFileURL({
           fileList: [res.fileID],
           success: res => {
            console.log("通过文件ID从云存储获取到的音频文件的临时url是:")
             console.log(res.fileList[0].tempFileURL)
             that.setData({
              tempUrl: res.fileList[0].tempFileURL
            })
            wx.cloud.callFunction({  // 调用云函数
              // 云函数名称
              name: 'wordRecognize',  // 调用的云函数的名称
              // 传给云函数的参数
              data: {
                url:that.data.tempUrl
              },
              success: function(res) {
                console.log(res)
                that.setData({  // 发送数据到视图层
                  Words: res.result.Result.Result
                })
              },
              fail: console.error
            })
           },
           fail: err => {
             // handle error
           }
         })
       },
       fail: console.error
     })
       }
     })
     
   }
 })

注意:由于一句话识别时,如果语音长度、复杂度等不确定,可能耗时较长,所以请配置云函数的超时时间为最大值,配置方式如下

测试结果

0 人点赞