1.依赖
新建一个maven项目,导入依赖
<dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18</version>
</dependency>
只导入依赖还不行,还要导入一个.dll文件,百度云链接:链接: 提取码:s62o ,可以看到有两个dll文件,由于我的电脑是64位的,于是我将上面那个dll文件复制一份到当前使用jdk的bin目录下
2.java代码实现
一个很简单的java代码实现,运行之后就会读出来了;
package com.wyq.day66;import com.jacob.activeX.ActiveXComponent;
import com.jacob.Dispatch;
import com.jacob.Variant;public class Speak02 {//用电脑自带的语音读字符串strpublic static void main(String[] args) {String str = "你好,我是java小新人!请叫我最帅的帅锅";ActiveXComponent sap = new ActiveXComponent("Sapi.SpVoice");Dispatch sapo = Object();try {// 音量 0-100sap.setProperty("Volume", new Variant(100));// 语音朗读速度 -10 到 +10sap.setProperty("Rate", new Variant(0));// 执行朗读 Dispatch.call(sapo, "Speak", new Variant(str));} catch (Exception e) {e.printStackTrace();} finally {sapo.safeRelease();sap.safeRelease();}}}
3.输出音频文件
按理说到上面已经实现了功能,但是我还想着能不能把读的音频文件该输出一下呢?查了查资料,居然还真行,代码如下:
package com.wyq.day66;import com.jacob.activeX.ActiveXComponent;
import com.jacob.Dispatch;
import com.jacob.Variant;public class JavaSpeak {public static void main(String[] args) {//指定文件音频输出文件位置String output = "E:\test.wav";ActiveXComponent ax = null;String str="我是java小新人,我要将这段话的音频输出一下";try {ax = new ActiveXComponent("Sapi.SpVoice");//运行时输出语音内容Dispatch spVoice = ax.getObject();// 音量 0-100ax.setProperty("Volume", new Variant(100));// 语音朗读速度 -10 到 +10ax.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(output), new Variant(3), new Variant(true));//设置声音对象的音频输出流为输出文件对象Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream);//设置音量 0到100Dispatch.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();}}}
直接运行我们就可以听到朗读的声音,而且在指定目录还可以找到音频文件;
4.调用百度AI来读文本
又按理说到上面应该就差不多了,但是我总是感觉电脑自带的语音库声音不好听,我要用百度AI的那个比较可爱的声音,我还是去查了查资料,居然可以,而且很容易!
4.1.申请一下百度语音api权限
由于我们是要去调用百度的api进行语音识别,那么我们要先去申请一下权限,不然会一直报错(这个地方卡了好久,最后终于被我查出来为什么报错了。。。),链接:/
然后会让你登录一下,直接用qq登录就行;
创建完毕之后查看一下应用详情:
4.2.代码实现
做了这么多是操作就是为了得到这三个字符串,现在我们还要导入百度语音的依赖:
<!--百度语音播报sdk--><dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.4.1</version></dependency><!-- .json/json --><dependency><groupId>org.json</groupId><artifactId>json</artifactId><version>20160810</version></dependency>
桌面上记事本中的内容:
java代码实现如下,其实就是利用百度AI读取我们计算机中的一个txt文档,输出MP3文件保存并到指定位置
package com.wyq.day66;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;import org.json.JSONObject;import com.baidu.aip.speech.AipSpeech;
import com.baidu.aip.speech.TtsResponse;
import com.baidu.aip.util.Util;public class Speak03 {//设置APPID/AK/SK,这三个参数是需要我们去百度AI平台申请的(也就是上面说的那三个字符串)public static final String APP_ID = "16447127";public static final String API_KEY = "8GO31sOIffR1oll5mPFKgtR9";public static final String SECRET_KEY = "jWsoNGlfzfRGSQ30****NOxz9ZpjMbc";//readFile是我们的txt文档,writeFile是输出的MP3格式public static String readFile = "C:\Users\asus\Desktop\";public static String writeFile = "E:\output.mp3";public static void main(String[] args) {//可以直接输入字符串也行,内容比较多的话还是用txt文档比较好一点//convertMP3("你好!我是百度AI智能,java小新人,很高兴和你见面,我们一定能成为很好的朋友的");//调用readToString方法将一个txt文档中的数据读取出来变成一个字符串String string = readToString(readFile);//将这个字符串用百度AI读一下输出MP3格式convertMP3(string);}public static void convertMP3(String str) {AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);// 可选:设置网络连接参数,就是超时时间client.setConnectionTimeoutInMillis(2000);client.setSocketTimeoutInMillis(60000);// 设置一些可选参数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为情感合成-度丫丫,默认为普通女 非必选//百度AI开始读取传入的str字符串TtsResponse res = client.synthesis(str, "zh", 1, options);//服务器返回的内容,合成成功时为null,失败时包含error_no等信息JSONObject result = Result(); if (result != null) {System.out.printf("error:" + String()+"----------");return;}//生成的音频数据byte[] data = Data(); JSONObject res1 = Result();if (data != null) {try {//将生成的音频输出到指定位置Util.writeBytesToFileSystem(data, writeFile);} catch (IOException e) {e.printStackTrace();}}if (res1 != null) {System.out.String());}}//这个方法就是根据输入的文件路径,读取该文件内容返回一个很长的字符串,由于txt是gbk编码,所以我们变成字符串的时候也要用gbk//其实就是最基本的流操作public static String readToString(String fileName) { String encoding = "gbk"; File file = new File(fileName); Long filelength = file.length(); byte[] filecontent = new byte[filelength.intValue()]; try { FileInputStream in = new FileInputStream(file); in.read(filecontent); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { return new String(filecontent, encoding); } catch (UnsupportedEncodingException e) { println("The OS does not support " + encoding); e.printStackTrace(); return null; } }}
输出的音频文件:
本文发布于:2024-01-29 07:42:27,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648534913755.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |