java簡(jiǎn)單實(shí)現(xiàn)用語(yǔ)音讀txt文檔方法總結(jié)
最近比較無(wú)聊,隨便翻著博客,無(wú)意中看到了有的人用VBS讀文本內(nèi)容,也就是讀幾句中文,emmm,挺有趣的,實(shí)現(xiàn)也很簡(jiǎn)單,都不需要安裝什么環(huán)境,直接新建txt文件,輸入一些簡(jiǎn)單的vbs讀文本的代碼,然后將新建的文件后綴改為.vbs,然后雙擊一下就可以有效果了。。。。
于是我就想啊,java行不行呢?查了一些資料,還真的行,我就將我試驗(yàn)的過(guò)程說(shuō)一下,就當(dāng)作娛樂(lè)娛樂(lè)!
1.依賴
隨便新建一個(gè)maven項(xiàng)目,導(dǎo)入依賴
<dependency> <groupId>com.hynnet</groupId> <artifactId>jacob</artifactId> <version>1.18</version> </dependency>
只導(dǎo)入依賴還不行,還要導(dǎo)入一個(gè).dll文件,百度云鏈接:鏈接:https://pan.baidu.com/s/1YYYPIoPxrtuyKebJzabhlw 提取碼:s62o ,可以看到有兩個(gè)dll文件,由于我的電腦是64位的,于是我將上面那個(gè)dll文件復(fù)制一份到當(dāng)前使用jdk的bin目錄下
2.java代碼實(shí)現(xiàn)
一個(gè)很簡(jiǎn)單的java代碼實(shí)現(xiàn),運(yùn)行之后就會(huì)讀出來(lái)了;
package com.wyq.day66; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class Speak02 { //用電腦自帶的語(yǔ)音讀字符串str public static void main(String[] args) { String str = "你好,我是java小新人!請(qǐng)叫我最帥的帥鍋"; ActiveXComponent sap = new ActiveXComponent("Sapi.SpVoice"); Dispatch sapo = sap.getObject(); try { // 音量 0-100 sap.setProperty("Volume", new Variant(100)); // 語(yǔ)音朗讀速度 -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.輸出音頻文件
按理說(shuō)到上面已經(jīng)實(shí)現(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"); //運(yùn)行時(shí)輸出語(yǔ)音內(nèi)容 Dispatch spVoice = ax.getObject(); // 音量 0-100 ax.setProperty("Volume", new Variant(100)); // 語(yǔ)音朗讀速度 -10 到 +10 ax.setProperty("Rate", new Variant(-3)); // 進(jìn)行朗讀 Dispatch.call(spVoice, "Speak", new Variant(str)); //下面是構(gòu)建文件流把生成語(yǔ)音文件 ax = new ActiveXComponent("Sapi.SpFileStream"); Dispatch spFileStream = ax.getObject(); ax = new ActiveXComponent("Sapi.SpAudioFormat"); Dispatch spAudioFormat = ax.getObject(); //設(shè)置音頻流格式 Dispatch.put(spAudioFormat, "Type", new Variant(22)); //設(shè)置文件輸出流格式 Dispatch.putRef(spFileStream, "Format", spAudioFormat); //調(diào)用輸出 文件流打開方法,在指定位置輸出一個(gè).wav文件 Dispatch.call(spFileStream, "Open", new Variant(output), new Variant(3), new Variant(true)); //設(shè)置聲音對(duì)象的音頻輸出流為輸出文件對(duì)象 Dispatch.putRef(spVoice, "AudioOutputStream", spFileStream); //設(shè)置音量 0到100 Dispatch.put(spVoice, "Volume", new Variant(100)); //設(shè)置朗讀速度 Dispatch.put(spVoice, "Rate", new Variant(-2)); //開始朗讀 Dispatch.call(spVoice, "Speak", new Variant(str)); //關(guān)閉輸出文件 Dispatch.call(spFileStream, "Close"); Dispatch.putRef(spVoice, "AudioOutputStream", null); spAudioFormat.safeRelease(); spFileStream.safeRelease(); spVoice.safeRelease(); ax.safeRelease(); } catch (Exception e) { e.printStackTrace(); } } }
直接運(yùn)行我們就可以聽到朗讀的聲音,而且在指定目錄還可以找到音頻文件;
4.調(diào)用百度AI來(lái)讀文本
又按理說(shuō)到上面應(yīng)該就差不多了,但是我總是感覺電腦自帶的語(yǔ)音庫(kù)聲音不好聽,我要用百度AI的那個(gè)比較可愛的聲音,我還是去查了查資料,居然可以,而且很容易!
4.1.申請(qǐng)一下百度語(yǔ)音api權(quán)限
由于我們是要去調(diào)用百度的api進(jìn)行語(yǔ)音識(shí)別,那么我們要先去申請(qǐng)一下權(quán)限,不然會(huì)一直報(bào)錯(cuò)(這個(gè)地方卡了好久,最后終于被我查出來(lái)為什么報(bào)錯(cuò)了。。。),鏈接:http://ai.baidu.com/
然后會(huì)讓你登錄一下,直接用qq登錄就行;
創(chuàng)建完畢之后查看一下應(yīng)用詳情:
4.2.代碼實(shí)現(xiàn)
做了這么多是操作就是為了得到這三個(gè)字符串,現(xiàn)在我們還要導(dǎo)入百度語(yǔ)音的依賴:
<!--百度語(yǔ)音播報(bào)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代碼實(shí)現(xiàn)如下,其實(shí)就是利用百度AI讀取我們計(jì)算機(jī)中的一個(gè)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 { //設(shè)置APPID/AK/SK,這三個(gè)參數(shù)是需要我們?nèi)グ俣華I平臺(tái)申請(qǐng)的(也就是上面說(shuō)的那三個(gè)字符串) 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文檔比較好一點(diǎn) //convertMP3("你好!我是百度AI智能,java小新人,很高興和你見面,我們一定能成為很好的朋友的"); //調(diào)用readToString方法將一個(gè)txt文檔中的數(shù)據(jù)讀取出來(lái)變成一個(gè)字符串 String string = readToString(readFile); //將這個(gè)字符串用百度AI讀一下輸出MP3格式 convertMP3(string); } public static void convertMP3(String str) { AipSpeech client = new AipSpeech(APP_ID, API_KEY, SECRET_KEY); // 可選:設(shè)置網(wǎng)絡(luò)連接參數(shù),就是超時(shí)時(shí)間 client.setConnectionTimeoutInMillis(2000); client.setSocketTimeoutInMillis(60000); // 設(shè)置一些可選參數(shù) HashMap<String, Object> options = new HashMap<String, Object>(); options.put("spd", "5");//語(yǔ)速,取值0-9,默認(rèn)為5中語(yǔ)速 非必選 options.put("pit", "5");//音調(diào),取值0-9,默認(rèn)為5中語(yǔ)調(diào) 非必選 options.put("per", "4");//發(fā)音人選擇, 0為女聲,1為男聲,3為情感合成-度逍遙,4為情感合成-度丫丫,默認(rèn)為普通女 非必選 //百度AI開始讀取傳入的str字符串 TtsResponse res = client.synthesis(str, "zh", 1, options); //服務(wù)器返回的內(nèi)容,合成成功時(shí)為null,失敗時(shí)包含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()); } } //這個(gè)方法就是根據(jù)輸入的文件路徑,讀取該文件內(nèi)容返回一個(gè)很長(zhǎng)的字符串,由于txt是gbk編碼,所以我們變成字符串的時(shí)候也要用gbk //其實(shí)就是最基本的流操作 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é)
感覺還是有點(diǎn)兒意思的,沒(méi)事的時(shí)候用java玩一玩這些東西就當(dāng)是打發(fā)時(shí)間!總是看一些框架原理啊什么的,時(shí)間長(zhǎng)了也是比較無(wú)聊的,可以挖掘一下java的其他功能也不錯(cuò)!
相關(guān)文章
基于SpringBoot和Leaflet的行政區(qū)劃地圖掩膜效果實(shí)戰(zhàn)教程
本文講解的是一種圖層級(jí)的掩膜,即使用行政區(qū)劃圖層來(lái)進(jìn)行掩膜,使用場(chǎng)景為,用戶只需要在地圖頁(yè)面中展示目標(biāo)行政區(qū)劃內(nèi)的影像信息,對(duì)于行政邊界外的影像,這篇文章主要介紹了基于SpringBoot和Leaflet的行政區(qū)劃地圖掩膜效果實(shí)戰(zhàn),需要的朋友可以參考下2024-05-05使用Java代碼實(shí)現(xiàn)RocketMQ的生產(chǎn)與消費(fèi)消息
這篇文章介紹一下其他的小組件以及使用Java代碼實(shí)現(xiàn)生產(chǎn)者對(duì)消息的生成,消費(fèi)者消費(fèi)消息等知識(shí)點(diǎn),并通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-07-07Nacos?動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置和服務(wù)管理平臺(tái)初體驗(yàn)
這篇文章主要介紹了Nacos?動(dòng)態(tài)服務(wù)發(fā)現(xiàn)、配置和服務(wù)管理平臺(tái)初體驗(yàn)的相關(guān)資料,需要的朋友可以參考下2022-09-09Spring依賴注入的兩種方式(根據(jù)實(shí)例詳解)
這篇文章主要介紹了Spring依賴注入的兩種方式(根據(jù)實(shí)例詳解),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05Windows下后端如何啟動(dòng)SpringBoot的Jar項(xiàng)目
這篇文章主要介紹了Windows下后端如何啟動(dòng)SpringBoot的Jar項(xiàng)目問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07springboot2.2 集成 activity6實(shí)現(xiàn)請(qǐng)假流程(示例詳解)
這篇文章主要介紹了springboot2.2 集成 activity6實(shí)現(xiàn)請(qǐng)假完整流程示例詳解,本文通過(guò)示例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07