java简单实现用语音读txt文档方法总结

最近比较无聊,随便翻着博客,无意中看到了有的人用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的其他功能也不错!

(0)

相关推荐

  • java 实现将一个string保存到txt文档中

    实例如下所示: private static String savefile = "E:\\test.txt"; private static void saveAsFileWriter(String content) { FileWriter fwriter = null; try { fwriter = new FileWriter(savefile); fwriter.write(content); } catch (IOException ex) { ex.printStack

  • 用java实现在txt文本中写数据和读数据的方法

    向文本中写数据,一般这些数据我们用来做自动化测试.通过我们制定的一些生成数据的规则,能够快速写数据到文本中. 下面是写数据到txt文本(当然我们可以根据自己的需要写到doc.docx.xlx.xlsx等格式的文件中)的代码: import java.io.File; import java.io.FileWriter; import java.io.IOException; public class Test { public static void main(String[] args) {

  • Java实现将txt文件转成xls文件的方法

    最近项目用到txt文件和xls文件的转换,这里记录一下具体的思路. 下面利用java代码实现txt转xls,这里要使用到jxl.jar包,这个包是通过java来操作Excel表格的工具类库. 该jar包支持字体.数字.日期操作,能够修饰单元格属性,还能够支持图像和图表,基本上已经满足我们的日常操作,最主要的是这套API是纯Java实现的,在Windows和Linux操作系统下,它都可以正确的处理Excel文件. 具体实现代码如下: package test; import java.io.Buf

  • Java实现批量修改txt文件名称的方法示例

    本文实例讲述了Java实现批量修改txt文件名称的方法.分享给大家供大家参考,具体如下: 最近在做特征选择的实验时,需要批量修改一下文件名称,在这里做一下记录. package com.cqu.experiment; import java.io.File; /** * @author 作者: E-mail:@126.com * @version 创建时间:2016年12月26日 下午3:02:01 类说明 */ public class RenameTxt { public static vo

  • java创建txt文件并存入内容

    本文实例为大家分享了java创建txt文件并存入内容的具体代码,供大家参考,具体内容如下 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter

  • 将Java程序的输出结果写到txt文件中的方法

    1.将输出结果输出到txt文件 步骤一: 头文件 import java.io.FileOutputStream;   import java.io.PrintStream; 可能还会提醒抛出错误,于是import java.io.FileNotFoundException; 步骤二: PrintStream ps = new PrintStream("e:/log.txt"); // 创建一个打印输出流,输出的目标是:E盘的log.txt文件 步骤三: System.setOut(p

  • java简单实现用语音读txt文档方法总结

    最近比较无聊,随便翻着博客,无意中看到了有的人用VBS读文本内容,也就是读几句中文,emmm,挺有趣的,实现也很简单,都不需要安装什么环境,直接新建txt文件,输入一些简单的vbs读文本的代码,然后将新建的文件后缀改为.vbs,然后双击一下就可以有效果了.... 于是我就想啊,java行不行呢?查了一些资料,还真的行,我就将我试验的过程说一下,就当作娱乐娱乐! 1.依赖 随便新建一个maven项目,导入依赖 <dependency> <groupId>com.hynnet</

  • python jieba分词并统计词频后输出结果到Excel和txt文档方法

    前两天,班上同学写论文,需要将很多篇论文题目按照中文的习惯分词并统计每个词出现的频率. 让我帮她实现这个功能,我在网上查了之后发现jieba这个库还挺不错的. 运行环境: 安装python2.7.13:https://www.python.org/downloads/release/python-2713/ 安装jieba:pip install jieba 安装xlwt:pip install xlwt 具体代码如下: #!/usr/bin/python # -*- coding:utf-8

  • 最简单的java生成word文档方法

    1.首先新建一个word文档,然后设计好格式,比如说我的标题是黑体二号,居中对其,正文是宋体四号,如下 2.另存为xml格式(文件->另存为)的文件,如下图 3.使用txt打开保存的xml文件,复制完,贴到你的代码里,如图 4.替换内容,Ctrl+F搜索标题(第一步我输入的),把标题换成你要显示的动态标题,把 正文替换成你想要的动态内容,如下 5.设置相应头生成doc文件 6.测试:在浏览器输入http:127.0.0.1:8080/createDoc,结果如下: 7.分享代码 (1)以下是生成

  • Java基于状态模式实现的文档编辑模式切换功能实例

    本文实例讲述了Java基于状态模式实现的文档编辑模式切换功能.分享给大家供大家参考,具体如下: 一 模式定义 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类. 二 模式举例 1 模式分析 我们借用文档编辑模式切换这一案例来说明这一模式. 2 状态模式静态类图 3 代码示例 3.1 创建状态接口一IState package com.demo.state; import com.demo.context.Context; /** * * 状态接口 * * @au

  • 详解Java生成PDF文档方法

    最近项目需要实现PDF下载的功能,由于没有这方面的经验,从网上花了很长时间才找到相关的资料.整理之后,发现有如下几个框架可以实现这个功能. 1. 开源框架支持 iText,生成PDF文档,还支持将XML.Html文件转化为PDF文件: Apache PDFBox,生成.合并PDF文档: docx4j,生成docx.pptx.xlsx文档,支持转换为PDF格式. 比较: iText开源协议为AGPL,而其他两个框架协议均为Apache License v2.0. 使用PDFBox生成PDF就像画图

  • java集成开发SpringBoot生成接口文档示例实现

    目录 为什么要用Swagger ? Swagger集成 第一步: 引入依赖包 第二步:修改配置文件 第三步,配置API接口 Unable to infer base url For input string: "" Swagger美化 第一步: 引入依赖包 第二步:启用knife4j增强 Swagger参数分组 分组使用说明 1.在bean对象的属性里配置如下注释 2.在接口参数的时候加入组规则校验 小结 大家好,我是飘渺. SpringBoot老鸟系列的文章已经写了两篇,每篇的阅读反

  • C#实现EXCEL数据到TXT文档的转换

    C#数据转换前excel中的数据格式如下:设备名称 规格型号 设备编号  使用部门 固定资产编号电脑1 IBM5660 10001 管理部 100010001电脑2 IBM5661 10002 研发部 100010002电脑3 IBM5662 10003 管理部 100010003C#数据转换到TXT文档的格式:"检测设备资产标签","设备名称","电脑1","规格型号","IBM5660","设

  • 将内容写到txt文档里面并读取及删除的方法

    1.将内容写到txt文档里面 复制代码 代码如下: public static void writeFile() { String txtFileName = "emailRecord.txt"; String directoryPath = ""; try { directoryPath = WebplusContext.getRealPath("/apps/schoolfellow/upload/smsRecord"); File direc

  • php删除txt文件指定行及按行读取txt文档数据的方法

    本文实例讲述了php删除txt文件指定行及按行读取txt文档数据的方法.分享给大家供大家参考,具体如下: 向txt文件循环写入值: $keys = range(1,999); $file = fopen('key_11010000.txt',"w"); foreach($keys as $key){ fwrite($file,"$key\r\n"); } fclose($file); $f1 = fopen('key_11010000.txt','r'); whil

随机推荐