java文本转音频

收到一个需求就是将文本转语音,然后保存到本地,找了很多还是找到2种办法,一个是使用 jacob-project 插件。一个是调用百度API,当然也有其他开源的api,需要自行下载jar包导入。

第一种就是用jacob,需要下载jacob-1.18-x64.dll,因为自己是64位的操作系统,就下这个,32位是另一个,需要将jacob-1.18-x64.dll放入你安装jdk的bin目录下面。有个坑就是liunx上不支持jacob,Jacob是一个针对Windows平台的Java-COM桥梁,不支持Linux和其他操作系统。它依赖于Windows操作系统的注册表和COM接口系统来实现Java与Microsoft Office的交互。

链接: https://pan.baidu.com/s/1xQaniDVQO2qtvFRrw8gw4g

提取码: qrw1 

public static void test(String text, String path){
        ActiveXComponent component = new ActiveXComponent("Sapi.SpVoice");
        Dispatch dispatch = component.getObject();
        Long millis = System.currentTimeMillis();
        String name = String.valueOf(millis);
        Dispatch fileStreamDispatch=null;
        Dispatch audioDispatch=null;
        try {
            // 生成空的语音文件
            component = new ActiveXComponent("Sapi.SpFileStream");
            fileStreamDispatch = component.getObject();
            // 音频
            component = new ActiveXComponent("Sapi.SpAudioFormat");
            audioDispatch = component.getObject();
            // 设置文件流格式
            Dispatch.putRef(fileStreamDispatch, "Format", audioDispatch);
            // 设置视频输出流的格式
            Dispatch.put(audioDispatch, "Type", new Variant(22));
            // 调用输出流打开方法,创建一个.wav .mp3 .mp4 .wma文件
            Dispatch.call(fileStreamDispatch,"Open",new Variant(path+name+".mp3"),new Variant(3),new Variant(true));
            // 设置声音对象的音频流输出流为输出文件对象
            Dispatch.putRef(dispatch,"AudioOutputStream",fileStreamDispatch);
            // 设置音量大小
            Dispatch.put(dispatch,"Volume",new Variant(100));
            // 将文本读取进去
            Dispatch.call(dispatch, "Speak",new Variant(text));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 关闭输出文件流
            Dispatch.call(fileStreamDispatch,"Close");
            Dispatch.putRef(dispatch,"AudioOutputStream",null);
            audioDispatch.safeRelease();
            fileStreamDispatch.safeRelease();
            dispatch.safeRelease();
            component.safeRelease();
        }
    }

第二种就是调用百度api,百度是收费的,有免费的10w送,然后就是收费的。

调用百度api,需要自己配置。上图

 然后调用百度的api,然后是用的单例去实现的。

public class AipSpeechl extends BaseClient {

    public static final String APP_ID = "你的appid";
    public static final String API_KEY = "你的appkey";
    public static final String SECRET_KEY = "你的secrctkey";

    // 声明一个 volatile关键字,确保 instance内存可见性
    private static volatile AipSpeechl instance;

    // 提供一个静态方法,用于获取唯一的实例对象
    public static AipSpeechl getInstance() {
        // 第一次校验,如果对象已经被创建,则直接返回它,避免不必要的同步操作
        if (instance == null) {
            // 同步代码块,确保在多线程环境下只有一个线程能够执行对象创建和赋值操作
            synchronized (AipSpeechl.class) {
                // 第二次校验,防止在同步代码块外等待锁的线程执行对象创建和赋值操作,避免并发冲突
                if (instance == null) {
                    instance = new AipSpeechl(APP_ID,API_KEY,SECRET_KEY);
                }
            }
        }
        // 返回唯一的实例对象
        return instance;
    }

    protected AipSpeechl(String appId, String apiKey, String secretKey) {
        super(appId, apiKey, secretKey);
    }

    public TtsResponse synthesis(String text, String lang, int ctp, HashMap<String, Object> options) {
        AipRequest request = new AipRequest();
        this.preOperation(request);
        if (this.isBceKey.get()) {
            TtsResponse response = new TtsResponse();
            JSONObject msg = Util.getGeneralError(AipClientConst.OPENAPI_NO_ACCESS_ERROR_CODE, "No permission to access data");
            response.setResult(msg);
            return response;
        } else {
            request.addBody("tex", text);
            request.addBody("lan", lang);
            request.addBody("tok", this.accessToken);
            request.addBody("ctp", ctp);
            String cuid = SignUtil.md5(this.accessToken, "UTF-8");
            request.addBody("cuid", cuid);
            if (options != null) {
                request.addBody(options);
            }

            request.setUri("http://tsn.baidu.com/text2audio");
            TtsResponse response = new TtsResponse();
            AipResponse res = AipHttpClient.post(request);
            if (res == null) {
                response.setResult(Util.getGeneralError(-1, "null response from server"));
                return response;
            } else {
                Map<String, List<String>> header = res.getHeader();
                if (header.containsKey("content-type")) {
                    String contentType = (String)((List)res.getHeader().get("content-type")).get(0);
                    if (contentType.contains("json")) {
                        String data = res.getBodyStr();
                        JSONObject json = new JSONObject(data);
                        response.setResult(json);
                    } else {
                        byte[] binData = res.getBody();
                        response.setData(binData);
                    }
                } else {
                    LOGGER.error("synthesis get no content-type in header: " + header);
                    LOGGER.info("synthesis response status: " + res.getStatus());

                    try {
                        JSONObject json = new JSONObject(res.getBodyStr());
                        response.setResult(json);
                    } catch (JSONException var13) {
                        response.setData(res.getBody());
                    }
                }

                return response;
            }
        }
    }

}
    public static void testBaiDu(String text,String path){
        // 获取AipSpeech
        AipSpeechl client = AipSpeechl.getInstance();
        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);
        // 调用接口
        TtsResponse res = client.synthesis(text, "zh", 1, null);
        byte[] data = res.getData();
        JSONObject result = res.getResult();
        if (data != null) {
            try {
                Util.writeBytesToFileSystem(data, path);
                System.out.println("转换成功");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (result != null) {
            System.out.println(result.toString(2));
        }
    }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Java开源语音文本是一种利用Java语言编写的开源软件,用于将语音内容换为可读的文本格式。在这种软件中,采用了一系列的语音信号处理和机器学习算法,能够实现高效准确地将语音音频换为文本Java开源语音文本的工作流程一般包括以下几个步骤:首先,将语音输入以音频流的形式传递给程序;接着,采用声音分析技术将音频流分割为语音片段;然后,将这些语音片段一段段地送到语音识别引擎中进行分析和识别;最后,将得到的识别结果输出为文本格式。 Java开源语音文本的优点在于它是开源的,意味着可以自由地获取和修改源代码,以满足个人或企业的需求。此外,由于Java语言具有跨平台特性,因此该软件可以在不同操作系统上运行,如Windows、Linux和Mac。同时,Java还具备良好的可扩展性和稳定性,能够处理大规模的语音数据,提供高质量的文本写服务。 Java开源语音文本在很多场景中都有广泛的应用。比如,在语音识别领域,它可以用于将语音录音换为文字,方便听障人士的阅读和理解。在智能助理和语音助手中,它可以用于将用户的语音指令化为文本命令,实现人机交互。此外,在语音翻译和语音搜索等领域,Java开源语音文本也能提供有价值的支持。 总之,Java开源语音文本是一种可靠高效的工具,可以将语音内容换为文本格式,为多个领域的应用提供便捷和灵活的解决方案。 ### 回答2: Java开源语音文本,首先要使用到Java的语音识别库。有一些开源库可以实现这一功能,如CMU Sphinx、Deepspeech等。 CMU Sphinx是一个流行的开源语音识别库,它支持多种语言和平台。它提供了一组Java API,可以用于开发语音识别应用程序。使用CMU Sphinx,可以通过录制音频文件或实时音频输入来进行语音文本。它使用训练好的模型来识别音频中的语音,并将其换为对应的文本。 Deepspeech是Mozilla开发的一个开源语音识别引擎。它基于深度学习技术,能够实现更高的准确率和更好的性能。Deepspeech提供了Java的API,可以在Java应用程序中集成语音文本功能。使用Deepspeech,可以将音频输入换为对应的文本。 要使用这些开源库进行语音文本,首先需要在Java项目中引入相应的库文件。然后,可以使用库提供的API来进行语音识别操作。首先,需要将音频输入换为库可接受的格式,如PCM格式。然后,调用库的识别函数,传入音频数据,等待返回识别结果。最后,将识别结果换为文本形式,并进行后续处理或展示。 总之,Java开源语音文本可以通过使用CMU Sphinx、Deepspeech等开源库来实现。这些库提供了丰富的API和功能,能够将音频输入换为对应的文本。使用这些库,可以在Java应用程序中集成语音文本功能,实现各种语音识别应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值