超级超级大坑,用时两天,最近老板跟我提了一个需求,希望实现语音转文字,我寻思这有啥难的,结果写了三天
大坑是安卓手机百度语音识别文字毫无问题,但是ios同样的写法确实怎么识别都不对,转换的什么牛马话。
获取设备信息
const systemInfo = uni.getSystemInfoSync();
语音开始的时候,ios得用wav格式的后缀,百度语音识别才可以识别正确。 但是uniapp没有wav的内置选项,只能设置pcm,但是实际输出是wav格式,这是uniapp的bug
// 准备开始录音
const startVoice = (e) => {
recording.value = true;
isStopVoice.value = false;
canSend.value = true;
voiceIconText.value = '正在录音...';
pointY.value = e.touches[0].clientY;
// ios端设置pcm获取的文件是wav,大恶心bug
Recorder.start({
format: systemInfo.platform === 'ios' ? 'pcm' : 'mp3',
});
};
因为百度语音识别需要base64字符串,所以我就封装了一个适用于app的方法
/**
* 录音语音文件转base64字符串
* @param {Object} path
* @param callback
*/
export function audio2dataURL(path, callback) {
plus.io.resolveLocalFileSystemURL(path, function (entry) {
entry.file(
function (file) {
const reader = new plus.io.FileReader();
reader.onloadend = function (e) {
callback({
code: 0,
message: '读取成功!',
data: e.target.result,
size: file.size,
});
};
reader.readAsDataURL(file);
},
function (e) {}
);
});
}
调用方法转化为base64,还要获取size,接口需要
audio2dataURL(tempFilePath, ({ code, data, size }) => {
if (code === 0) {
const base64 = data.split(',')[1];
uploadFile(base64, size);
}
});
语音转文字,这里需要尤其注意format和rate两个选项,他需要判断平台差异,他们需要的参数都不一样,这样调用百试百灵
const uploadFile = (speech, len) => {
serverApi({
format: systemInfo.platform === 'ios' ? 'wav' : 'm4a',
rate: systemInfo.platform === 'ios' ? 8000 : 16000,
dev_pid: 1537,
channel: 1,
token: accessToken.value,
cuid: 'AL2TpZPxiNp5sDHqv7Q3GaoShIMSBhYF',
len,
speech, // xxx为 base64(FILE_CONTENT)
}).then((data) => {
console.log(data);
if (data.err_no === 0) {
// 用户语音输入文字
text.value = data.result[0];
getTextToWorkTask(); // 调用方法依次执行任务
}
});
};
如果这样还不行你找我,我来跟你研究,如果觉得对你有帮助请点赞收藏,之后你肯定会用到,我的口号是:你的大坑我来踩