需求一:将微信会话中的小于60秒的语音文件在线识别为文字
需求二:输入小于60秒的语音文件的url地址,然后将对应的语音文件在线识别成文字
"cloudfunctionRoot": "cloud/",
"tencentcloud-sdk-nodejs": "latest",
在wordRecognize云函数目录上右键选择在"在终端中打开",执行"npm install"安装依赖
// 云函数入口文件
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"的回调数据,然后返回给小程序客户端
"pages/word/word",
完善客户端页面相关文件Demo
word.xml
<button type="primary" bindtap="uploadRecord">上传微信会话文件</button>
<textarea placeholder="一句话识别结果" auto-focus value="{{ Words }}" />
word.js
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
})
}
})
}
})
注意:由于一句话识别时,如果语音长度、复杂度等不确定,可能耗时较长,所以请配置云函数的超时时间为最大值,配置方式如下
测试结果
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。