jacob离线语音合成和百度AI在线语音合成

           

   因为工作需要,所以找了一下文本转语音这方面的资料,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

猜你喜欢

转载自blog.csdn.net/ming19951224/article/details/80999044