java语音_java简单实现用语音读txt文档

本文介绍了如何使用Java结合Jacob库实现电脑语音读取txt文本内容,并通过代码展示了读取和输出音频文件的过程。此外,还讲解了如何利用百度AI的语音服务,将txt文档转换成MP3音频。
摘要由CSDN通过智能技术生成

最近比较无聊,随便翻着博客,无意中看到了有的人用VBS读文本内容,也就是读几句中文,emmm,挺有趣的,实现也很简单,都不需要安装什么环境,直接新建txt文件,输入一些简单的vbs读文本的代码,然后将新建的文件后缀改为.vbs,然后双击一下就可以有效果了。。。。

于是我就想啊,java行不行呢?查了一些资料,还真的行,我就将我试验的过程说一下,就当作娱乐娱乐!

1.依赖

随便新建一个maven项目,导入依赖

com.hynnet

jacob

1.18

只导入依赖还不行,还要导入一个.dll文件,百度云链接:链接:https://pan.baidu.com/s/1YYYPIoPxrtuyKebJzabhlw    提取码:s62o ,可以看到有两个dll文件,由于我的电脑是64位的,于是我将上面那个dll文件复制一份到当前使用jdk的bin目录下

8278625f5e91a85d7983d85e88687fab.png

dfddc9db525e2a0b989900df633fc9cc.png

2.java代码实现

一个很简单的java代码实现,运行之后就会读出来了;

packagecom.wyq.day66;importcom.jacob.activeX.ActiveXComponent;importcom.jacob.com.Dispatch;importcom.jacob.com.Variant;public classSpeak02 {//用电脑自带的语音读字符串str

public static voidmain(String[] args) {

String str= "你好,我是java小新人!请叫我最帅的帅锅";

ActiveXComponent sap= new ActiveXComponent("Sapi.SpVoice");

Dispatch sapo=sap.getObject();try{//音量 0-100

sap.setProperty("Volume", new Variant(100));//语音朗读速度 -10 到 +10

sap.setProperty("Rate", new Variant(0));//执行朗读

Dispatch.call(sapo, "Speak", newVariant(str));

}catch(Exception e) {

e.printStackTrace();

}finally{

sapo.safeRelease();

sap.safeRelease();

}

}

}

3.输出音频文件

按理说到上面已经实现了功能,但是我还想着能不能把读的音频文件该输出一下呢?查了查资料,居然还真行,代码如下:

packagecom.wyq.day66;importcom.jacob.activeX.ActiveXComponent;importcom.jacob.com.Dispatch;importcom.jacob.com.Variant;public classJavaSpeak {public static voidmain(String[] args) {//指定文件音频输出文件位置

String output = "E:\\test.wav";

ActiveXComponent ax= null;

String str="我是java小新人,我要将这段话的音频输出一下";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", newVariant(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到100

Dispatch.put(spVoice, "Volume", new Variant(100));//设置朗读速度

Dispatch.put(spVoice, "Rate", new Variant(-2));//开始朗读

Dispatch.call(spVoice, "Speak", newVariant(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进行语音识别,那么我们要先去申请一下权限,不然会一直报错(这个地方卡了好久,最后终于被我查出来为什么报错了。。。),链接:http://ai.baidu.com/

cb213959884f70c0b5bb70cb287df47b.png

然后会让你登录一下,直接用qq登录就行;

0a071c1e61a71c116bfc522cfdb7441a.png

3b1d539086e219345535e97bae0b970c.png

6496f79d6ac60dbb6a30ec06de99c5bd.png

创建完毕之后查看一下应用详情:

dc437ba9c8ad2088a78f25d3fab7e6c1.png

4.2.代码实现

做了这么多是操作就是为了得到这三个字符串,现在我们还要导入百度语音的依赖:

com.baidu.aip

java-sdk

4.4.1

org.json

json

20160810

桌面上记事本中的内容:

8d7a8f2913e81c19e4d6180c9a3aa902.png

java代码实现如下,其实就是利用百度AI读取我们计算机中的一个txt文档,输出MP3文件保存并到指定位置

packagecom.wyq.day66;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.HashMap;importorg.json.JSONObject;importcom.baidu.aip.speech.AipSpeech;importcom.baidu.aip.speech.TtsResponse;importcom.baidu.aip.util.Util;public classSpeak03 {//设置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\\says.txt";public static String writeFile = "E:\\output.mp3";public static voidmain(String[] args) {//可以直接输入字符串也行,内容比较多的话还是用txt文档比较好一点//convertMP3("你好!我是百度AI智能,java小新人,很高兴和你见面,我们一定能成为很好的朋友的");//调用readToString方法将一个txt文档中的数据读取出来变成一个字符串

String string =readToString(readFile);//将这个字符串用百度AI读一下输出MP3格式

convertMP3(string);

}public static voidconvertMP3(String str) {

AipSpeech client= newAipSpeech(APP_ID, API_KEY, SECRET_KEY);//可选:设置网络连接参数,就是超时时间

client.setConnectionTimeoutInMillis(2000);

client.setSocketTimeoutInMillis(60000);//设置一些可选参数

HashMap options = new HashMap();

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 =res.getResult();if (result != null) {

System.out.printf("error:" + result.toString()+"----------");return;

}//生成的音频数据

byte[] data =res.getData();

JSONObject res1=res.getResult();if (data != null) {try{//将生成的音频输出到指定位置

Util.writeBytesToFileSystem(data, writeFile);

}catch(IOException e) {

e.printStackTrace();

}

}if (res1 != null) {

System.out.println(res1.toString());

}

}//这个方法就是根据输入的文件路径,读取该文件内容返回一个很长的字符串,由于txt是gbk编码,所以我们变成字符串的时候也要用gbk//其实就是最基本的流操作

public staticString readToString(String fileName) {

String encoding= "gbk";

File file= newFile(fileName);

Long filelength=file.length();byte[] filecontent = new byte[filelength.intValue()];try{

FileInputStream in= newFileInputStream(file);

in.read(filecontent);

in.close();

}catch(FileNotFoundException e) {

e.printStackTrace();

}catch(IOException e) {

e.printStackTrace();

}try{return newString(filecontent, encoding);

}catch(UnsupportedEncodingException e) {

System.err.println("The OS does not support " +encoding);

e.printStackTrace();return null;

}

}

}

输出的音频文件:

819263096db8f4bfd3fc90f7be1e5567.png

5.总结

感觉还是有点儿意思的,没事的时候用java玩一玩这些东西就当是打发时间!总是看一些框架原理啊什么的,时间长了也是比较无聊的,可以挖掘一下java的其他功能也不错!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值