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

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

1.依赖

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

<dependency>
<groupId>com.hynnet</groupId>
<artifactId>jacob</artifactId>
<version>1.18</version>
</dependency>

  

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

2.java代码实现

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

package com.wyq.day66;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant; public class Speak02 { //用电脑自带的语音读字符串str
public static void main(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", 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.com.Dispatch;
import com.jacob.com.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-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(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", 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进行语音识别,那么我们要先去申请一下权限,不然会一直报错(这个地方卡了好久,最后终于被我查出来为什么报错了。。。),链接:http://ai.baidu.com/

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

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

  4.2.代码实现

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

<!--百度语音播报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>

  桌面上记事本中的内容:

  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\\says.txt";
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 = 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 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) {
System.err.println("The OS does not support " + encoding);
e.printStackTrace();
return null;
}
} }

  输出的音频文件:

5.总结

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

java简单实现用语音读txt文档的更多相关文章

  1. Java 产生随机数并写入txt文档中

    源代码: import java.io.*; import java.util.Random; public class AlgorithmTest { public static void main ...

  2. java把集合数据写入txt文档

    List<String> list= bs.findJson(); try { BufferedWriter bw = new BufferedWriter(new FileWriter( ...

  3. Java 将 List 里面的内容写入桌面的 txt 文档

    文件内容: /** * 将 list 写入文件中 */ import java.io.BufferedWriter; import java.io.File; import java.io.FileW ...

  4. java通过url在线预览Word、excel、ppt、pdf、txt文档

    java通过url在线预览Word.excel.ppt.pdf.txt文档中的内容[只获得其中的文字] 在页面上显示各种文档中的内容.在servlet中的逻辑 word: BufferedInputS ...

  5. 使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76273859 本文出自[我是干勾鱼的博客] 这里讲一下使用Lucene对doc. ...

  6. PDF文件可以转换成txt文档吗

    PDF是一种便携式的文件格式,传送和阅读都非常方便,是Adobe公司开发的跨平台文件格式,它无论在哪种打印机上都可以保证精确的颜色和准确的打印效果.可是有点遗憾的是PDF格式一般不能在手机上打开,或者 ...

  7. 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中

    下面是自己编写的 网络抓取功能实现 将获取的结果进行过滤并写入到TXT文档中 (以防忘记) 原创哟 import java.io.BufferedReader;import java.io.Buffe ...

  8. 20130317 如何批量把文件名称写入txt文档

    1.如何批量把文件名称写入txt文档 COMMAND 窗口例:存放图片的文件夹是 D:\123\就用下面一名命令就OKdir d:\123\*.jpg /b > A.TXT 那么你所以JPG格式 ...

  9. 输出5个大写英文字母的组合,并写入到txt文档中,随机数法。

    1.问题起源:最近想申请几个英文商标,研究了一下,英文字母在4到7个之间最好,5个字母尤佳,所以先来输出5个字母的组合,可是想像力有限,于是想用排列组合把所有5个可能的字母组合都输出,再从中挑选几个感 ...

随机推荐

  1. c++-面向对象类的示例-求周长面积,判断体积相等-文件操作和一般操作

    面向对象编程示例:求周长和面积 #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //圆的周 ...

  2. iOS开发-APP图标、启动页、名字的设置

    APP图标.启动页.名字的设置:(较全面,但是APP启动页讲述的有漏洞) 参考链接:https://www.jianshu.com/p/2c7e181276ff APP启动页:(弥补上一文的漏洞) 参 ...

  3. PKUWC 2020 游记

    由于 CSP 的暴力分太高,我来了这里. 我将告诉大家,我在暴力分不高时是个怎样的 sb 选手. Day -17 又停课啦. 旁边坐着 pb,每天刷题特别猛,然后就凸显了我有多颓. 怎么想打开个猫国都 ...

  4. 信通院发布《云计算发展白皮书 (2019年) 》 (附PPT解读)

    来源: 中国信息通信研究院CAICT 为了进一步促进云计算创新发展,建立云计算信任体系,规范云计算行业,促进市场发展,提升产业技术和服务水平.由中国信息通信研究院(以下简称“中国信通院”)主办,中国通 ...

  5. [小技巧]你真的了解C#中的Math.Round么?

    今天在某.NET Core 群中看到有人在问Math.Round的问题.其实这个问题之前有很多人遇到了,在此总结一下. 开发者为了实现小数点后 2 位的四舍五入,编写了如下代码, var num = ...

  6. 带你揭秘Shiro(一)

    提到Shiro,不得不先介绍RBAC介绍 RBAC介绍: RBAC是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的 ...

  7. Consul-template+nginx实现自动负载均衡

    前言 consul-template 是 Consul 的一个守护程序,使用 consul-template 可以方便快速的实现对 Consul Key/Value 存储系统的访问,可以从 KV 系统 ...

  8. ASP.NET MVC5基础 - Global.asax详解

    简介 作用 Global.asax的处理事件 实例说明 总结 简介 Global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件 ...

  9. swoole简介

    swoole是PHP的扩展,又不是一个普通的扩展.普通的扩展只是提供一个库函数.而swoole扩展在运行后会接管PHP的控制权,进入事件循环.当IO事件发生后,swoole会自动回调指定的PHP函数. ...

  10. Linux汇总

    Linux介绍以及VMware和Centos的安装 linux-VMtools安装 linux-创建/使用快照/克隆(类似windows中备份还原) linux目录结构 linux指令大全(归类整理) ...