天天看點

百度語音合成與語音識别api使用(Java版本)

先到百度AI開發平台建立一個語音應用

百度語音合成與語音識别api使用(Java版本)

建立成功如下:

百度語音合成與語音識别api使用(Java版本)

pom.xml需要導入百度aip的JavaSDK,以及mp3轉pcm的mp3spi

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.accp</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    
<dependencies>
    <!--百度語音識别-->
    <dependency>
        <groupId>com.baidu.aip</groupId>
        <artifactId>java-sdk</artifactId>
        <version>4.8.0</version>
    </dependency>
    
    <!--mp3轉pcm-->
    <dependency>
        <groupId>com.googlecode.soundlibs</groupId>
        <artifactId>mp3spi</artifactId>
        <version>1.9.5.4</version>
    </dependency>
</dependencies>

</project>
           

百度語音工具類内容如下:

package com.accp;

import com.baidu.aip.speech.AipSpeech;
import com.baidu.aip.speech.TtsResponse;
import com.baidu.aip.util.Util;
import javazoom.spi.mpeg.sampled.file.MpegAudioFileReader;
import org.json.JSONObject;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
import java.io.IOException;

/**
 * 百度語音工具類
 */
public class SpeechUtils {

    public static final String APP_ID = "15948020";
     //你建立的App應用的API Key
    public static final String API_KEY = "sPbOLUBOGq5U3WR9fpHOvtcP";
    //你建立的App應用的Secret Key
    public static final String SECRET_KEY = "ZcyHqnuXHS41vC3SytBwwAPiSAkGW3qa";

     public static String pcmPath="D:\\temp\\output.pcm";//pcm檔案儲存路徑

     public static String  mp3Path="D:\\rap\\output.mp3";//MP3檔案存放路徑

    /**
     * 語音合成
     * @param text 文字内容
     * @param Path 合成語音生成路徑
     * @return
     */
    public static void aSpeechSynthesis(String text, String Path) {
        /*
        最長的長度
         */
        int maxLength = 1024;
        if (text.getBytes().length >= maxLength) {
            return ;
        }
        // 初始化一個AipSpeech
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);

        // 可選:設定網絡連接配接參數
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可選:設定代理伺服器位址, http和socket二選一,或者均不設定
//        client.setHttpProxy("proxy_host", proxy_port);  // 設定http代理
//        client.setSocketProxy("proxy_host", proxy_port);  // 設定socket代理

        // 調用接口
        TtsResponse res = client.synthesis(text, "zh", 1, null);
        byte[] data = res.getData();
        //定義變量調用轉換格式
        boolean a = true;
        if (data != null) {
            try {
                createFile(Path,"output.mp3");
                Util.writeBytesToFileSystem(data, Path);
                a=false;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (!a) {

            convertMP3ToPcm(Path,pcmPath);
        }

    }

    /**
     * 語音識别
     * @param Path 路徑
     * @param Path 語音類型
     * @return
     */
    public static String aSpeechRecognition(String Path) throws IOException {
        // 初始化一個AipSpeech
        AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);

        // 可選:設定網絡連接配接參數
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 調用接口
        byte[] data = Util.readFileByBytes(Path);     //readFileByBytes僅為擷取二進制資料示例
        JSONObject asrRes2 = client.asr(data, "pcm", 16000, null);
        return asrRes2.toString(2);
    }


    /**
     *  mp3轉pcm
     * @param mp3path MP3檔案存放路徑
     * @param pcmpath pcm檔案儲存路徑
     * @return
     */
    public static boolean convertMP3ToPcm(String mp3path, String pcmpath){
        try {
            createFile(pcmpath,"output.pcm");
            //擷取檔案的音頻流,pcm的格式
            AudioInputStream audioInputStream = getPcmAudioInputStream(mp3path);
            //将音頻轉化為  pcm的格式儲存下來
            AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, new File(pcmpath));
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 獲得pcm檔案的音頻流
     * @param mp3filepath
     * @return
     */
    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 createFile(String path,String suffix){
        String separator=File.separator+File.separator;
        String[] spilt=path.split(separator+suffix);
        File file=new File(spilt[0]);
          if(!file.exists()){
             System.out.println(spilt[0]+"檔案夾不存在,正在建立中....");
             // mkdir()隻會建立一級的檔案夾
             // mkdirs()可以建立多級檔案夾
             file.mkdir();
          }else{
             System.out.println(spilt[0]+"檔案夾已存在");
          }

    }

    public static void main(String[] args) throws IOException {

        //第一個參數是你輸入的文字,第二個參數是你儲存到本地的路徑
        aSpeechSynthesis("靚仔,看什麼還看說的就是你", mp3Path);
        //這個參數是剛合成的本地路徑
        String s = aSpeechRecognition(pcmPath);
        System.out.println(s);
    }
}