Java實現文字轉語音
導入jar包
下載jacob-1.18.zip
並導入jacob.jar、json-20160810.jar、log4j-1.2.17.jar
將解壓後的文件中jacob-1.18-x64.dll複製到對應的JDK中(個人是C:Program FilesJavajdk1.8.0_152jrebin)代碼實例
[Java] 純文本查看 複製代碼
?java
package baidu.restapi.common;json
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URLEncoder;api
/**瀏覽器
*/
public class ConnUtil {app
/** * UrlEncode, UTF-8 編碼 * * @param str 原始字符串 * @return */ public static String urlEncode(String str) { String result = null; try { result = URLEncoder.encode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; } /** * 從HttpURLConnection 獲取返回的字符串 * * @param conn * @return * @throws IOException * @throws DemoException */ public static String getResponseString(HttpURLConnection conn) throws IOException, DemoException { return new String(getResponseBytes(conn)); } /** * 從HttpURLConnection 獲取返回的bytes * 注意 HttpURLConnection自身問題, 400類錯誤,會直接拋出異常。不能獲取conn.getInputStream(); * * @param conn * @return * @throws IOException http請求錯誤 * @throws DemoException http 的狀態碼不是 200 */ public static byte[] getResponseBytes(HttpURLConnection conn) throws IOException, DemoException { int responseCode = conn.getResponseCode(); if (responseCode != 200) { System.err.println("http 請求返回的狀態碼錯誤,指望200, 當前是 " + responseCode); if (responseCode == 401) { System.err.println("多是appkey appSecret 填錯"); } throw new DemoException("http response code is" + responseCode); } InputStream inputStream = conn.getInputStream(); byte[] result = getInputStreamContent(inputStream); return result; } /** * 將InputStream內的內容所有讀取,做爲bytes返回 * * @param is * @return * @throws IOException @see InputStream.read() */ public static byte[] getInputStreamContent(InputStream is) throws IOException { byte[] b = new byte[1024]; // 定義一個輸出流存儲接收到的數據 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 開始接收數據 int len = 0; while (true) { len = is.read(b); if (len == -1) { // 數據讀完 break; } byteArrayOutputStream.write(b, 0, len); } return byteArrayOutputStream.toByteArray(); }
}post
[Java] 純文本查看 複製代碼
?測試
package baidu.restapi.common;ui
import org.json.JSONObject;this
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;編碼
/**
*/
public class TokenHolder {
public static final String ASR_SCOPE = "audio_voice_assistant_get"; public static final String TTS_SCOPE = "audio_tts_post"; /** * url , Token的url,http能夠改成https */ private static final String url = "http://openapi.baidu.com/oauth/2.0/token"; /** * asr的權限 scope 是 "audio_voice_assistant_get" * tts 的權限 scope 是 "audio_tts_post" */ private String scope; /** * 網頁上申請語音識別應用獲取的apiKey */ private String apiKey; /** * 網頁上申請語音識別應用獲取的secretKey */ private String secretKey; /** * 保存訪問接口獲取的token */ private String token; /** * 當前的時間戳,毫秒 */ private long expiresAt; /** * @param apiKey 網頁上申請語音識別應用獲取的apiKey * @param secretKey 網頁上申請語音識別應用獲取的secretKey */ public TokenHolder(String apiKey, String secretKey, String scope) { this.apiKey = apiKey; this.secretKey = secretKey; this.scope = scope; } /** * 獲取token,refresh 方法後調用有效 * * @return */ public String getToken() { return token; } /** * 獲取過時時間,refresh 方法後調用有效 * * @return */ public long getExpiresAt() { return expiresAt; } /** * 獲取token * * @return * @throws IOException http請求錯誤 * @throws DemoException http接口返回不是 200, access_token未獲取 */ public void resfresh() throws Exception { String getTokenURL = url + "?grant_type=client_credentials" + "&client_id=" + ConnUtil.urlEncode(apiKey) + "&client_secret=" + ConnUtil.urlEncode(secretKey); // 打印的url出來放到瀏覽器內能夠復現 System.out.println("token url:" + getTokenURL); URL url = new URL(getTokenURL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); String result = ConnUtil.getResponseString(conn); System.out.println("Token result json:" + result); parseJson(result); } /** * @param result token接口得到的result * @throws DemoException */ private void parseJson(String result) throws Exception { JSONObject json = new JSONObject(result); if (!json.has("access_token")) { // 返回沒有access_token字段 throw new DemoException("access_token not obtained, " + result); } if (!json.has("scope")) { // 返回沒有scope字段 throw new DemoException("scopenot obtained, " + result); } if (!json.getString("scope").contains(scope)) { throw new DemoException("scope not exist, " + scope + "," + result); } token = json.getString("access_token"); expiresAt = System.currentTimeMillis() + json.getLong("expires_in") * 1000; }
}
[Java] 純文本查看 複製代碼
?
package baidu.restapi.common;
public class DemoException extends Exception {
public DemoException(String message) { super(message); }
}
[Java] 純文本查看 複製代碼
?
package baidu.restapi.ttsdemo;
import baidu.restapi.common.ConnUtil;
import baidu.restapi.common.TokenHolder;
import java.io.File;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class TtsMain {
public static void main(String[] args) throws Exception { (new TtsMain()).run(); } // 填寫網頁上申請的appkey 如 $apiKey="g8eBUMSokVB1BHGmgxxxxxx" private final String appKey = "4E1BG9lTnlSeIf1NQFlrSq6h"; // 填寫網頁上申請的APP SECRET 如 $secretKey="94dc99566550d87f8fa8ece112xxxxx" private final String secretKey = "544ca4657ba8002e3dea3ac2f5fdd241"; // text 的內容爲"歡迎使用百度語音合成"的urlencode,utf-8 編碼 // 能夠百度搜索"urlencode" private final String text = "歡迎使用百度語音"; // 發音人選擇, 0爲普通女聲,1爲普通男生,3爲情感合成-度逍遙,4爲情感合成-度丫丫,默認爲普通女聲 private final int per = 0; // 語速,取值0-9,默認爲5中語速 private final int spd = 5; // 音調,取值0-9,默認爲5中語調 private final int pit = 5; // 音量,取值0-9,默認爲5中音量 private final int vol = 5; public final String url = "http://tsn.baidu.com/text2audio"; // 能夠使用https private String cuid = "1234567JAVA"; private void run() throws Exception { TokenHolder holder = new TokenHolder(appKey, secretKey, TokenHolder.ASR_SCOPE); holder.resfresh(); String token = holder.getToken(); String url2 = url + "?tex=" + ConnUtil.urlEncode(text); url2 += "&per=" + per; url2 += "&spd=" + spd; url2 += "&pit=" + pit; url2 += "&vol=" + vol; url2 += "&cuid=" + cuid; url2 += "&tok=" + token; url2 += "&lan=zh&ctp=1"; // System.out.println(url2); // 反饋請帶上此url,瀏覽器上能夠測試 HttpURLConnection conn = (HttpURLConnection) new URL(url2).openConnection(); conn.setConnectTimeout(5000); String contentType = conn.getContentType(); if (contentType.contains("mp3")) { byte[] bytes = ConnUtil.getResponseBytes(conn); File file = new File("result.mp3"); // 打開mp3文件便可播放 // System.out.println( file.getAbsolutePath()); FileOutputStream os = new FileOutputStream(file); os.write(bytes); os.close(); System.out.println("mp3 file write to " + file.getAbsolutePath()); } else { System.err.println("ERROR: content-type= " + contentType); String res = ConnUtil.getResponseString(conn); System.err.println(res); } }
}
實現效果