java簡單實現(xiàn)用語音讀txt文檔方法總結(jié)
最近比較無聊,隨便翻著博客,無意中看到了有的人用VBS讀文本內(nèi)容,也就是讀幾句中文,emmm,挺有趣的,實現(xiàn)也很簡單,都不需要安裝什么環(huán)境,直接新建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代碼實現(xiàn)
一個很簡單的java代碼實現(xiàn),運行之后就會讀出來了;
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));
// 執(zhí)行朗讀
Dispatch.call(sapo, "Speak", new Variant(str));
} catch (Exception e) {
e.printStackTrace();
} finally {
sapo.safeRelease();
sap.safeRelease();
}
}
}
3.輸出音頻文件
按理說到上面已經(jīng)實現(xiàn)了功能,但是我還想著能不能把讀的音頻文件該輸出一下呢?查了查資料,居然還真行,代碼如下:
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");
//運行時輸出語音內(nèi)容
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));
//下面是構(gòu)建文件流把生成語音文件
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);
//調(diào)用輸出 文件流打開方法,在指定位置輸出一個.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.調(diào)用百度AI來讀文本
又按理說到上面應該就差不多了,但是我總是感覺電腦自帶的語音庫聲音不好聽,我要用百度AI的那個比較可愛的聲音,我還是去查了查資料,居然可以,而且很容易!
4.1.申請一下百度語音api權(quán)限
由于我們是要去調(diào)用百度的api進行語音識別,那么我們要先去申請一下權(quán)限,不然會一直報錯(這個地方卡了好久,最后終于被我查出來為什么報錯了。。。),鏈接:http://ai.baidu.com/

然后會讓你登錄一下,直接用qq登錄就行;



創(chuàng)建完畢之后查看一下應用詳情:

4.2.代碼實現(xiàn)
做了這么多是操作就是為了得到這三個字符串,現(xiàn)在我們還要導入百度語音的依賴:
<!--百度語音播報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>
桌面上記事本中的內(nèi)容:

java代碼實現(xiàn)如下,其實就是利用百度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,這三個參數(shù)是需要我們?nèi)グ俣華I平臺申請的(也就是上面說的那三個字符串)
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) {
//可以直接輸入字符串也行,內(nèi)容比較多的話還是用txt文檔比較好一點
//convertMP3("你好!我是百度AI智能,java小新人,很高興和你見面,我們一定能成為很好的朋友的");
//調(diào)用readToString方法將一個txt文檔中的數(shù)據(jù)讀取出來變成一個字符串
String string = readToString(readFile);
//將這個字符串用百度AI讀一下輸出MP3格式
convertMP3(string);
}
public static void convertMP3(String str) {
AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY);
// 可選:設置網(wǎng)絡連接參數(shù),就是超時時間
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
// 設置一些可選參數(shù)
HashMap<String, Object> options = new HashMap<String, Object>();
options.put("spd", "5");//語速,取值0-9,默認為5中語速 非必選
options.put("pit", "5");//音調(diào),取值0-9,默認為5中語調(diào) 非必選
options.put("per", "4");//發(fā)音人選擇, 0為女聲,1為男聲,3為情感合成-度逍遙,4為情感合成-度丫丫,默認為普通女 非必選
//百度AI開始讀取傳入的str字符串
TtsResponse res = client.synthesis(str, "zh", 1, options);
//服務器返回的內(nèi)容,合成成功時為null,失敗時包含error_no等信息
JSONObject result = res.getResult();
if (result != null) {
System.out.printf("error:" + result.toString()+"----------");
return;
}
//生成的音頻數(shù)據(jù)
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());
}
}
//這個方法就是根據(jù)輸入的文件路徑,讀取該文件內(nèi)容返回一個很長的字符串,由于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.總結(jié)
感覺還是有點兒意思的,沒事的時候用java玩一玩這些東西就當是打發(fā)時間!總是看一些框架原理啊什么的,時間長了也是比較無聊的,可以挖掘一下java的其他功能也不錯!
相關文章
基于SpringBoot和Leaflet的行政區(qū)劃地圖掩膜效果實戰(zhàn)教程
本文講解的是一種圖層級的掩膜,即使用行政區(qū)劃圖層來進行掩膜,使用場景為,用戶只需要在地圖頁面中展示目標行政區(qū)劃內(nèi)的影像信息,對于行政邊界外的影像,這篇文章主要介紹了基于SpringBoot和Leaflet的行政區(qū)劃地圖掩膜效果實戰(zhàn),需要的朋友可以參考下2024-05-05
使用Java代碼實現(xiàn)RocketMQ的生產(chǎn)與消費消息
這篇文章介紹一下其他的小組件以及使用Java代碼實現(xiàn)生產(chǎn)者對消息的生成,消費者消費消息等知識點,并通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-07-07
Nacos?動態(tài)服務發(fā)現(xiàn)、配置和服務管理平臺初體驗
這篇文章主要介紹了Nacos?動態(tài)服務發(fā)現(xiàn)、配置和服務管理平臺初體驗的相關資料,需要的朋友可以參考下2022-09-09
Windows下后端如何啟動SpringBoot的Jar項目
這篇文章主要介紹了Windows下后端如何啟動SpringBoot的Jar項目問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
springboot2.2 集成 activity6實現(xiàn)請假流程(示例詳解)
這篇文章主要介紹了springboot2.2 集成 activity6實現(xiàn)請假完整流程示例詳解,本文通過示例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07

