做百度语音识别的时候,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(); } } }
请登录后评论
TOP
切换版块
我也遇到ava.lang.IllegalArgumentException: Unsupported conversion这个错误了。谁帮忙指导下。
java.lang.IllegalArgumentException: Unsupported conversion: PCM_SIGNED from MPEG1L3 44100.0 Hz, unknown bits per sample, stereo, unknown frame size, 38.28125 frames/second, 这个错误问题怎么解决?
targetFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 16000, 16,1, 2, 16000, false);
百度的语音识别不是需要16000采用率,单声道吗,怎么你那个用MP3的采样率就可以了?
这个完全取决于你的MP3文件。如果是歌曲什么的。那肯定不行。人家写的工具类也不是万能的。
你如果是专业做这方面的。就应该更了解关于音频的东西才行。
还有你的MP3文件的码率是什么。音频内容又是什么。是否符合接口的要求呢?这些你都不说。就直接说识别不了。
或者你试试官网提供的一个方法,FFMPEG
使用这些工具的前提是你源文件是否符合接口要求
我一个一兆多的MP3转成11兆多的pcm,识别不了
太好啦!!
楼主,你好,我转码成pcm格式的音频有个问题,整个音频的播放速度很慢,听不出来说的话是什么
使用本帖作者代码。jar可以通过pom配置进行下载
可以考虑代码上GITEE哦。