小程序进行语音识别 音频MP3转PCM

初步技术方案是:小程序录音-上传录音文件到后端服务器,后端服务器调用阿里云一句话语音识别接口获取识别结果并返回给小程序。

小程序的录音文件格式只能是MP3或者AAC,而阿里云语音接口所能接受的音频文件格式为PCM,WAV,最后决定在后端将接收的MP3文件转换成PCM文件。

错误1   could not get audio input stream from input stream

出现这个错误的原因是没有引入MP3解析库

<dependency>
    <groupId>com.googlecode.soundlibs</groupId>
    <artifactId>mp3spi</artifactId>
    <version>1.9.5-1</version>
</dependency>

引入过后,发现错误1解决了,出现了下面的错误2

错误2   java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED from MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second

网上找到有说是进行格式转换的源码有问题,有很多参数都没有设置,所有才会报这个错误

更改前的源码(错误源码)

  public byte[] mp3Convertpcm(InputStream mp3Stream) throws Exception {
        // 原MP3文件转AudioInputStream
        AudioInputStream mp3audioStream = AudioSystem.getAudioInputStream(mp3Stream);
        // 将AudioInputStream MP3文件 转换为PCM AudioInputStream
        AudioInputStream pcmaudioStream = AudioSystem.getAudioInputStream(AudioFormat.Encoding.PCM_SIGNED,
                mp3audioStream);
        byte[] pcmBytes = IOUtils.toByteArray(pcmaudioStream);
        pcmaudioStream.close();
        mp3audioStream.close();
        return pcmBytes;
    }

更改后的源码(正确源码)

  public byte[] mp3Convertpcm(InputStream mp3Stream) throws Exception {
        // MP3转AudioInputStream 
        InputStream bufferedIn = new BufferedInputStream(mp3Stream);
    	AudioInputStream mp3audioStream = AudioSystem.getAudioInputStream(bufferedIn);
        //将AudioInputStream MP3文件 转换为PCM
    	AudioFormat baseFormat = mp3audioStream.getFormat();
    	AudioFormat targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
    	
    	AudioInputStream pcmaudioStream = AudioSystem.getAudioInputStream(targetFormat,mp3audioStream);
    	byte[] pcmBytes = IOUtils.toByteArray(pcmaudioStream);
    	pcmaudioStream.close();
    	mp3audioStream.close();
    	return pcmBytes;
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kung900519

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值