小程序-Recorder Manager API(开发工具调用得到假的MP3)

背景

小程序开发,后台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的域名即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值