百度語音合成技術
阿新 • • 發佈:2018-11-19
-
登入百度AI開發平臺
-
申請自己的ak
-
開放平臺上有各種語言支援的開發文件,自學能力差得人,不用擔心,我為你們封裝了語音合成與識別的utils,複製貼上即可使用
package com.czxy.TestSample; 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 = "14456779"; public static final String API_KEY = "swit9DZ57kxo4rFjz8sauyuR"; public static final String SECRET_KEY = "CDlpqaGRLoXGHGsedE21ufI3EBU8DCct"; /** * 語音合成 * @param text 文字內容 * @param Path 合成語音生成路徑 * @return */ public static void SpeechSynthesis(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 { Util.writeBytesToFileSystem(data, "D:\\rap\\output.mp3"); a=false; } catch (IOException e) { e.printStackTrace(); } } if (!a) { convertMP3ToPcm(Path,"D:\\temp\\output.pcm"); } } /** * 語音識別 * @param Path 路徑 * @param Path 語音型別 * @return */ public static String SpeechRecognition(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 { //獲取檔案的音訊流,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; } }
4 簡單使用
public static void main(String[] args) throws IOException {
//第一個引數是你輸入的文字,第二個引數是你儲存到本地的路徑
SpeechSynthesis("你好,我是dog", "D:\\rap\\output.mp3");
//這個引數是剛合成的本地路徑
String s = SpeechRecognition("D:\\temp\\output.pcm");
System.out.println(s);
}