小程序 wx.getRecorderManager 录音 to 语音识别

时间:2025-01-22 10:33:39

微信扫小程序码看调用效果(自然语言理解小助手)

小程序 wx.getRecorderManager 录音 to 语音识别小程序 wx.getRecorderManager 录音 to 语音识别

欢迎转载,请保留原文链接:http://www.happycxz.com/m/?p=125

这次主要是把我的api更新了一下,支持微信小程序新的录音接口,录出来的是mp3格式。顺便更新一下我的微信小程序“遥知之”,用上新录音接口 wx.getRecorderManager 。

这里只贴上关键代码:

//获取应用实例
var app = getApp() var UTIL = require('../../utils/util.js');
var GUID = require('../../utils/GUID.js');
var NLI = require('../../utils/NLI.js'); const appkey = require('../../config').appkey
const appsecret = require('../../config').appsecret //微信小程序新录音接口,录出来的是aac或者mp3,这里要录成mp3
const mp3Recorder = wx.getRecorderManager()
const mp3RecoderOptions = {
duration: 60000,
sampleRate: 16000,
numberOfChannels: 1,
encodeBitRate: 48000,
format: 'mp3',
//frameSize: 50
} //弹幕定时器
var timer; var pageSelf = undefined; var doommList = [];
class Doomm {
constructor() {
this.text = UTIL.getRandomItem(app.globalData.corpus);
this.top = Math.ceil(Math.random() * 40);
this.time = Math.ceil(Math.random() * 8 + 6);
this.color = getRandomColor();
this.display = true;
let that = this;
setTimeout(function () {
doommList.splice(doommList.indexOf(that), 1);
doommList.push(new Doomm()); pageSelf.setData({
doommData: doommList
})
}, this.time * 1000)
}
}
function getRandomColor() {
let rgb = []
for (let i = 0; i < 3; ++i) {
let color = Math.floor(Math.random() * 256).toString(16)
color = color.length == 1 ? '0' + color : color
rgb.push(color)
}
return '#' + rgb.join('')
} Page({
data: {
j: 1,//帧动画初始图片
isSpeaking: false,//是否正在说话
outputTxt : "", //输出识别结果 doommData: []
}, initDoomm: function () {
doommList.push(new Doomm());
doommList.push(new Doomm());
doommList.push(new Doomm());
this.setData({
doommData: doommList
})
}, onLoad: function () {
pageSelf = this;
this.initDoomm(); //onLoad中为录音接口注册两个回调函数,主要是onStop,拿到录音mp3文件的文件名(不用在意文件后辍是.dat还是.mp3,后辍不决定音频格式)
mp3Recorder.onStart(() => {
UTIL.log('mp3Recorder.onStart()...')
})
mp3Recorder.onStop((res) => {
UTIL.log('mp3Recorder.onStop() ' + res)
const { tempFilePath } = res
var urls = "https://api.happycxz.com/wxapp/mp32asr";
UTIL.log('mp3Recorder.onStop() tempFilePath:' + tempFilePath)
processFileUploadForAsr(urls, tempFilePath, this);
})
}, /////////////////////////////////////////////////////////////// 以下是调用新接口实现的录音,录出来的是 mp3
touchdown: function () {
//touchdown_mp3: function () {
UTIL.log("mp3Recorder.start with" + mp3RecoderOptions)
var _this = this;
speaking.call(this);
this.setData({
isSpeaking: true
})
mp3Recorder.start(mp3RecoderOptions);
},
touchup: function () {
//touchup_mp3: function () {
UTIL.log("mp3Recorder.stop")
this.setData({
isSpeaking: false,
})
mp3Recorder.stop();
}, //切换到老版本
turnToOld: function () {
wx.navigateTo({
url: '../index/index',
})
}, /////////////////////////////////////////////////////////////// 以下是调用老接口实现的录音,录出来的是 silk_v3
//手指按下
touchdown_silk: function () {
//touchdown: function () {
UTIL.log("手指按下了... new date : " + new Date)
var _this = this;
speaking.call(this);
this.setData({
isSpeaking: true
})
//开始录音
wx.startRecord({
success: function (res) {
//临时路径,下次进入小程序时无法正常使用
var tempFilePath = res.tempFilePath;
UTIL.log('record SUCCESS file path:' + tempFilePath)
_this.setData({
recordPath: tempFilePath
});
},
fail: function (res) {
//录音失败
wx.showModal({
title: '提示',
content: '录音的姿势不对!',
showCancel: false,
success: function (res) {
if (res.confirm) {
UTIL.log('用户点击确定')
return
}
}
})
}
})
},
//手指抬起
touchup_silk: function () {
//touchup: function () {
UTIL.log("手指抬起了...")
this.setData({
isSpeaking: false,
})
clearInterval(this.timer)
wx.stopRecord() var _this = this
setTimeout(function () {
var urls = "https://api.happycxz.com/wxapp/silk2asr/";
UTIL.log(_this.data.recordPath);
processFileUploadForAsr(urls, _this.data.recordPath, _this);
}, 1000)
}, }) //上传录音文件到 api.happycxz.com 接口,处理语音识别和语义,结果输出到界面
function processFileUploadForAsr(urls, filePath, _this) {
wx.uploadFile({
url: urls,
filePath: filePath,
name: 'file',
formData: { "appKey": appkey, "appSecret": appsecret, "userId": UTIL.getUserUnique() },
header: { 'content-type': 'multipart/form-data' },
success: function (res) {
UTIL.log('res.data:' + res.data); var nliResult = getNliFromResult(res.data);
UTIL.log('nliResult:' + nliResult);
var stt = getSttFromResult(res.data);
UTIL.log('stt:' + stt); var sentenceResult;
try {
sentenceResult = NLI.getSentenceFromNliResult(nliResult);
} catch (e) {
UTIL.log('touchup() 错误' + e.message + '发生在' + e.lineNumber + '行');
sentenceResult = '没明白你说的,换个话题?'
} var lastOutput = "==>语音识别结果:\n" + stt + "\n\n==>语义处理结果:\n" + sentenceResult;
_this.setData({
outputTxt: lastOutput,
});
wx.hideToast();
},
fail: function (res) {
UTIL.log(res);
wx.showModal({
title: '提示',
content: "网络请求失败,请确保网络是否正常",
showCancel: false,
success: function (res) {
}
});
wx.hideToast();
}
});
} function getNliFromResult(res_data) {
var res_data_json = JSON.parse(res_data);
var res_data_result_json = JSON.parse(res_data_json.result);
return res_data_result_json.nli;
} function getSttFromResult(res_data) {
var res_data_json = JSON.parse(res_data);
var res_data_result_json = JSON.parse(res_data_json.result);
return res_data_result_json.asr.result;
} //麦克风帧动画
function speaking() {
var _this = this;
//话筒帧动画
var i = 1;
this.timer = setInterval(function () {
i++;
i = i % 5;
_this.setData({
j: i
})
}, 200);
}

主要调用API的地方是:processFileUploadForAsr()。

代码中保留了 touchdown_silk 和 touchup_silk 是调用小程序提供的老录音接口录silk的,可以参考,换老接口也是可以用的。

与“遥知之”相关的博客文章主要在我的****博客中:

http://blog.****.net/happycxz/article/details/78024986

该API服务搭建全过程解析及源码分享贴:

http://blog.****.net/happycxz/article/details/78016299

这次的代码更新,托管在github上,感兴趣的可以关注:

api服务器端github项目

小程序端github项目