背景
小程序开发,后台python实现调用百度语音识别api。
百度语音识别(普通版)格式支持:pcm(不压缩)、wav(不压缩,pcm编码)、amr(压缩格式)。
推荐pcm 采样率 :16000 固定值。 编码:16bit 位深的单声道。
小程序实现录音
// 小程序官方api Demo
const recorderManager = wx.getRecorderManager()
recorderManager.onStart(() => {
console.log('recorder start')
})
recorderManager.onPause(() => {
console.log('recorder pause')
})
recorderManager.onStop((res) => {
console.log('recorder stop', res)
const { tempFilePath } = res
})
recorderManager.onFrameRecorded((res) => {
const { frameBuffer } = res
console.log('frameBuffer.byteLength', frameBuffer.byteLength)
})
const options = {
duration: 10000,
sampleRate: 44100, // 调用百度api这里改为16000
numberOfChannels: 1,
encodeBitRate: 192000,
format: 'aac', // 支持mp3,aac
frameSize: 50
}
recorderManager.start(options)
坑
录音结束事件的回调函数recorderManager.onStop可以获得一个录音文件的临时路径 tempFilePath
console.log(res.tempFilePath); // 控制台打印临时录音文件路径
如果控制台点开的这个路径,你可以听到录音内容,或者使用
const innerAudio = wx.createInnerAudioContext();
innerAudio.src = tempFilePath;
innerAudio.autoplay = true;
在录音结束后可以听到自己的录音内容。但是如果你把录好的临时文件下载到本地,并使用播放器播放,很有可能会显示无法播放加密的MP3。在此,我们姑且认为开发工具录得MP3是假的MP3。
真正让我发现这个问题是在使用pydub对这个临时文件进行格式转换时。
AudioSegment.from_mp3()
使用这个方法可以将mp3转为wav(百度api可以识别的格式),但是当我将小程序开发工具
录得音频传到后台发现,报出ffmpeg的decode错误。
pydub.exceptions.CouldntDecodeError: Decoding failed. ffmpeg returned error code: 1
很困惑,于是我自己录了几个mp3,完全没问题,所以判断开发工具获得mp3并不是平常所见到的。我对音频格式一无所知,但当我用Sublime Text打开几个自己录的mp3文件后发现,他们的头部,也就是前几行字符都是一样的,而开发工具获得的并不相同,和其他mp3文件相比也不像他们有着相似的特点。至于为什么,如何将其变成“真”MP3,我并没有找到方法,也许要问问老马家的人。
脱坑
既然没有办法将开发工具获得的mp3转为“真”的,让其成功转换格式。可否避开这个坑呢?
开发工具不可以不代表真机不可以,对吧。
但是涉及到这些文件上传后台的api,没有服务器怎么搞?我阿里云服务器买了,域名买了,可是备案还没下来,难道中断开发吗?
内网穿透!
看这篇,内网穿透-本机作服务器
// 小程序官方wx.uploadFile api Demo
wx.chooseImage({
success (res) {
const tempFilePaths = res.tempFilePaths
wx.uploadFile({
url: 'https://example.weixin.qq.com/upload', //仅为示例,非真实的接口地址
filePath: tempFilePaths[0],
name: 'file',
formData: {
'user': 'test'
},
success (res){
const data = res.data
//do something
}
})
}
})
将url改为解析到你内网ip的域名即可