JavaAPI方式语音识别mp3转换为pcm
lmyanglei 发布于2017-12 浏览:16414 回复:9
3
收藏

做百度语音识别的时候,MP3的音频文件是不支持的,参考了小帅的:

【百度语音识别】JavaAPI方式语音识别示例MP3转PCM

http://ai.baidu.com/forum/topic/show/496730

发现还是不能识别转换

java做音频还是差点。

使用了另外一种方式,把MP3转换为PCM,当然也是比较局限,可能一部分MP3是可以转换的,另外一部分是不可以的。多一种方式吧

需要的jar包:不一点全部需要,试试吧

链接: https://pan.baidu.com/s/1i5rLKzz 密码: 9xhm

代码:

import java.io.File;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.SourceDataLine;

import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;

/**
 * MP3转PCM Java方式实现
 */
public class ConvertMP32PCM {
    /**
     * MP3转换PCM文件方法
     * 
     * @param mp3filepath
     *            原始文件路径
     * @param pcmfilepath
     *            转换文件的保存路径
     * @throws Exception
     */
    public static void convertMP32PCM(String mp3filepath, String pcmfilepath) throws Exception {
        AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
        AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmfilepath));
    }

    /**
     * 播放MP3方法
     * 
     * @param mp3filepath
     * @throws Exception
     */
    public static void playMP3(String mp3filepath) throws Exception {
        File mp3 = new File(mp3filepath);

        // 播放
        int k = 0, length = 8192;
        AudioInputStream audioInputStream = getPcmAudioInputStream(mp3filepath);
        if (audioInputStream == null)
            System.out.println("null audiostream");
        AudioFormat targetFormat;
        targetFormat = audioInputStream.getFormat();
        byte[] data = new byte[length];
        DataLine.Info dinfo = new DataLine.Info(SourceDataLine.class, targetFormat);
        SourceDataLine line = null;
        try {

            line = (SourceDataLine) AudioSystem.getLine(dinfo);
            line.open(targetFormat);
            line.start();

            int bytesRead = 0;
            byte[] buffer = new byte[length];
            while ((bytesRead = audioInputStream.read(buffer, 0, length)) != -1) {
                line.write(buffer, 0, bytesRead);
            }
            audioInputStream.close();

            line.stop();
            line.close();

        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println("audio problem " + ex);

        }
    }

    private static AudioInputStream getPcmAudioInputStream(String mp3filepath) {
        File mp3 = new File(mp3filepath);
        AudioInputStream audioInputStream = null;
        AudioFormat targetFormat = null;
        try {
            AudioInputStream in = null;
            MpegAudioFileReader mp = new MpegAudioFileReader();
            in = mp.getAudioInputStream(mp3);
            AudioFormat baseFormat = in.getFormat();
            targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16,
                    baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false);
            audioInputStream = AudioSystem.getAudioInputStream(targetFormat, in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return audioInputStream;
    }

    public static void main(String[] args) {
        String path = "D:/Download/xfasr/20171018_15011138728_5114368";
        String mp3filepath = path + ".mp3";
        String pcmfilepath = path + ".pcm";

        try {
//            ConvertMP32PCM.convertMP32PCM(mp3filepath, pcmfilepath);
            ConvertMP32PCM.playMP3(mp3filepath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

收藏
点赞
3
个赞
共9条回复 最后由用户已被禁言回复于2022-04
#11谷彦征回复于2019-04

我也遇到ava.lang.IllegalArgumentException: Unsupported conversion这个错误了。谁帮忙指导下。

0
#10梦朢521回复于2018-08

java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED from MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second, 这个错误问题怎么解决?

2
#9小0o0辉辉回复于2018-06

targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16000, 16,1,  2, 16000, false);

百度的语音识别不是需要16000采用率,单声道吗,怎么你那个用MP3的采样率就可以了?

0
#8用户已被禁言回复于2018-03
#6 黑曼巴311回复
我一个一兆多的MP3转成11兆多的pcm,识别不了

这个完全取决于你的MP3文件。如果是歌曲什么的。那肯定不行。人家写的工具类也不是万能的。

你如果是专业做这方面的。就应该更了解关于音频的东西才行。

还有你的MP3文件的码率是什么。音频内容又是什么。是否符合接口的要求呢?这些你都不说。就直接说识别不了。

或者你试试官网提供的一个方法,FFMPEG

使用这些工具的前提是你源文件是否符合接口要求

1
#6黑曼巴311回复于2018-03

我一个一兆多的MP3转成11兆多的pcm,识别不了

0
#5爱学习的龙259回复于2018-03

太好啦!!

0
#4丨Devil丶亡林回复于2018-03

楼主,你好,我转码成pcm格式的音频有个问题,整个音频的播放速度很慢,听不出来说的话是什么

0
#3用户已被禁言回复于2017-12

使用本帖作者代码。jar可以通过pom配置进行下载



    com.googlecode.soundlibs
    mp3spi
    1.9.5.4

2
#2用户已被禁言回复于2017-12

可以考虑代码上GITEE哦。

1
TOP
切换版块