小程序進行語音識別(JAVA MP3 轉 PCM)

    公司最近有一個小程序項目需要使用語音識別功能,初步技術方案是:小程序錄音-上傳錄音文件到後端服務器,後端服務器調用百度AI語音接口獲取識別結果並返回給小程序。

   中間遇到一個小問題:小程序的錄音文件格式只能是MP3或者AAC,而百度語音接口所能接受的音頻文件格式爲PCM,WAV,AMR 這樣就十分尷尬了,最後確定方案,在後端將接收的MP3文件轉換成PCM文件

   在網上看了不少文章,實際運行時會出現以下錯誤:

錯誤1   could not get audio input stream from input stream

出現這個錯誤的原因是沒有引入MP3解析庫,我們引入之,GRADLE 的引入配置

// https://mvnrepository.com/artifact/com.googlecode.soundlibs/mp3spi
compile group: 'com.googlecode.soundlibs', name: 'mp3spi', version: '1.9.5.4'

MAVEN 的引入配置

<!-- https://mvnrepository.com/artifact/com.googlecode.soundlibs/mp3spi -->
<dependency>
    <groupId>com.googlecode.soundlibs</groupId>
    <artifactId>mp3spi</artifactId>
    <version>1.9.5.4</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
        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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章