因为工作需要,所以找了一下文本转语音这方面的资料,jacob和百度AI都有优缺点,jacob不需要联网,但是转换后的语音样式没有,百度AI的语音的样式多,但是需要联网。
如果是条件可以的话,用百度AI的语音合成比较好,毕竟百度的AI智能确实强大,但是需要注册账号才能使用
1 jacob的离线文本转化语音输出
以下是jacob的jar包和dll文件下载地址
链接: https://pan.baidu.com/s/13TR-z5Op8WOJlDGyk7S4ng 密码: 2j42
jdk64位: jacob-1.17-M2-x64.dll
jdk32位: jacob-1.17-M2-x86.dll
1.1 首先先把jar包放在项目的lib目录下,然后把dll文件放到你的jdk目录下的bin目录下
1.2 以下代码就能把文本转换成语音播放出来,并生成语音文件在指定位置
package com.sinosoft.jacob.jacob; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * @author lijunming * @date 2018/7/11 下午3:16 */ public class JacobStreamTask { public static void main(String[] args) { ActiveXComponent ax = null; String str="我是人工智能AI"; try { ax = new ActiveXComponent("Sapi.SpVoice"); //运行时输出语音内容 Dispatch spVoice = ax.getObject(); // 音量 0-100 ax.setProperty("Volume", new Variant(100)); // 语音朗读速度 -10 到 +10 ax.setProperty("Rate", new Variant(-3)); // 执行朗读 Dispatch.call(spVoice, "Speak", new Variant(str)); //下面是构建文件流把生成语音文件 ax = new ActiveXComponent("Sapi.SpFileStream"); Dispatch spFileStream = ax.getObject(); ax = new ActiveXComponent("Sapi.SpAudioFormat"); Dispatch spAudioFormat = ax.getObject(); //设置音频流格式 Dispatch.put(spAudioFormat, "Type", new Variant(22)); //设置文件输出流格式 Dispatch.putRef(spFileStream, "Format", spAudioFormat); //调用输出 文件流打开方法,创建一个.wav文件 Dispatch.call(spFileStream, "Open", new Variant("E:\\test.wav"), new Variant(3), new Variant(true)); //设置声音对象的音频输出流为输出文件对象 Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream); //设置音量 0到100 Dispatch.put(spVoice, "Volume", new Variant(100)); //设置朗读速度 Dispatch.put(spVoice, "Rate", new Variant(-2)); //开始朗读 Dispatch.call(spVoice, "Speak", new Variant(str)); //关闭输出文件 Dispatch.call(spFileStream, "Close"); Dispatch.putRef(spVoice, "AudioOutputStream", null); spAudioFormat.safeRelease(); spFileStream.safeRelease(); spVoice.safeRelease(); ax.safeRelease(); } catch (Exception e) { e.printStackTrace(); } } }
如果需要更改默认的语音库,请看我的这篇文章
https://mp.csdn.net/postedit/81046488
2.百度AI在线的文本转换音频文件
2.1 首先用maven引入百度ai文本转语音的依赖包
<!--百度语音播报sdk--> <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.4.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.json/json --> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160810</version> </dependency>
2.2 配置以下代码就能够把文本转换成mp3.文件
package com.sinosoft.speech.baidu; import com.baidu.aip.speech.AipSpeech; import com.baidu.aip.speech.TtsResponse; import com.baidu.aip.util.Util; import org.json.JSONObject; import org.springframework.util.StringUtils; import java.io.IOException; import java.util.HashMap; /** * @author lijunming * @date 2018/7/11 上午9:10 */ public class Sample { //设置APPID/AK/SK public static final String APP_ID = "; public static final String API_KEY = ""; public static final String SECRET_KEY = ""; public static void main(String[] args) { synthesis("你好!,我是百度AI智能"); } public static void synthesis(String str) { 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代理 // 可选:设置log4j日志输出格式,若不设置,则使用默认配置 // 也可以直接通过jvm启动参数设置此环境变量 System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties"); // 设置可选参数 HashMap<String, Object> options = new HashMap<String, Object>(); options.put("spd", "5");//语速,取值0-9,默认为5中语速 非必选 options.put("pit", "5");//音调,取值0-9,默认为5中语调 非必选 options.put("per", "4");//发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女 非必选 TtsResponse res = client.synthesis(str, "zh", 1, options); JSONObject result = res.getResult(); //服务器返回的内容,合成成功时为null,失败时包含error_no等信息 if (!StringUtils.isEmpty(result)) { System.out.printf("error:" + result.toString()); return; } byte[] data = res.getData(); //生成的音频数据 JSONObject res1 = res.getResult(); if (data != null) { try { Util.writeBytesToFileSystem(data, "output.mp3"); } catch (IOException e) { e.printStackTrace(); } } if (res1 != null) { System.out.println(res1.toString(2)); } } }
这个就是文本转成语音的mp3文件,打开就能播放了。
v