1.项目需求
需求一:将微信会话中的小于60秒的语音文件在线识别为文字
需求二:输入小于60秒的语音文件的url地址,然后将对应的语音文件在线识别成文字
2.项目准备
- 微信小程序开发者账号
前往注册
- 微信开发者工具
前往下载
- 腾讯云语音识别-一句话识别API说明文档
参考文档
3.项目演示
- 开通云开发控制台并创建云端项目环境
- 新建项目
- 创建一个名为cloud的云函数根目录
- 配置cloud目录为云函数根目录
"cloudfunctionRoot": "cloud/",
- 点击编译发现cloud新增了一个云图标
- 创建用于存放一句话识别API的云函数wordRecognize
- 在云函数的"package.json"文件中配置云函数的tencentcloud-sdk-nodejs依赖
"tencentcloud-sdk-nodejs": "latest",
- 安装依赖
在wordRecognize云函数目录上右键选择在"在终端中打开",执行"npm install"安装依赖
- 在一句话识别云函数目录下的入口文件index.js中实现一句话识别的API调用Demo,然后上传Demo至云端
// 云函数入口文件
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中,添加页面生成参数
"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
})
}
})
}
})
注意:由于一句话识别时,如果语音长度、复杂度等不确定,可能耗时较长,所以请配置云函数的超时时间为最大值,配置方式如下
测试结果