當前位置:首頁 » 編程語言 » java語音合成

java語音合成

發布時間: 2022-06-10 04:49:28

① 有誰會用java speech

JSML也代表JScript標識語言。

JSML(Java Speech API Markup Language,Java語音API合成標識語言)是用於有聲Web瀏覽器和有聲email中語音合成——text-to-speech(TTS)——的一套標識代碼和記號。JSML包括了描述文檔結構的文本描述標記和控制文本重音,音調,速率和發音的揚聲器指示標記。JSML和另一種叫做口語文本標識語言(STML)的標識語言已經結合在一起形成了Sable,一種指導文本到語音合成的標識語言。

Java Speech API
Java Speech API 允許開發人員將語音技術整合到 Java applet 和應用程序的用戶界面中。這種 API 規定一個跨平台的介面來支持命令―控制識別器、聽寫系統和語音合成器。

這個綜合 API 被分成幾個規范:

Java Speech API 規范(Java Speech API Specification,JSAPI)
Java Speech API 程序員指南
Java Speech API 語法格式規范(Java Speech API Grammar Format Specification,JSGF)
Java Speech API 標記語言規范(Java Speech API Markup Language Specification,JSML)
這個 API 沒有 Sun 公司的參考實現,但是有許多第三方實現,包括 Speech for Java(可以從 IBM alphaWorks 獲得http://www.alphaworks.ibm.com/tech/speech),它使用 ViaVoice 來支持語音命令識別、聽寫和文本到語音的合成。

② 在java程序中加入語音功能,例如給段字元串「A101」,就能發出聲音,請大家幫幫忙,謝謝

為應用程序加上語音能力有什麼好處呢?粗略地講,是為了趣味,它適合所有注重趣味的應用,比如游戲。當然,從更嚴肅的角度來講,它還涉及到應用的可用性問題。注意,這里我考慮的不僅是可視化界面固有的不足,而且還有這樣一些情形:一些時候,讓雙眼離開當前的工作很不方便,甚至是不合法的。比如,假設有一個帶語音功能的瀏覽器,你就可以在外出散步或開車上班的同時,用聽的方式瀏覽自己喜愛的網站。從目前來看,郵件閱讀器或許是語音技術更實際的應用,在JavaMail API的幫助下,這一切已經可能。郵件閱讀器可以定期地檢查收件箱,然後用語音「You have new mail, would you like me to read it to you?」引起你的注意。按照類似的思路,我們還可以考慮一個帶語音功能的提醒器,把它連接到一個日歷應用:它會及時地提醒你「Don't forget your meeting with the boss in 10 minutes!」。 也許你已經被這些主意吸引,或者有了自己更好的主意,現在讓我們繼續。首先我將介紹如何啟用本文提供的語音引擎,這樣,如果你認為語音引擎的實現細節過於復雜,就可以直接使用它而忽略其實現細節。
一、試用語音引擎 要使用這個語音引擎,你必須在CLASSPATH中加入本文提供的javatalk.jar文件,然後從命令行運行(或者從Java程序調用)com.lotontech.speech.Talker類。如果從命令行運行,則命令為: java com.lotontech.speech.Talker "h|e|l|oo" 如果從Java程序調用,則代碼為: com.lotontech.speech.Talker talker=new com.lotontech.speech.Talker(); talker.sayPhoneWord("h|e|l|oo"); 現在,對於在命令行上(或者調用sayPhoneWord()方法時)提供的「h|e|l|oo」字元串,你或許有所不解。下面我就來解釋一下。 語音引擎的工作原理是把細小的聲音樣本連接起來,每一個樣本都是人的語言發音(英語)的一個最小單位。這些聲音樣本稱為音素(allophone)。每一個因素對應一個、二個或者三個字母。從前面「hello」的語音表示可以看出,一些字母組合的發音顯而易見,還有一些卻不是很明顯: h -- 讀音顯而易見 e -- 讀音顯而易見 l -- 讀音顯而易見,但注意兩個「l」被簡縮成了一個「l」。 OO -- 應該讀作「hello」中的讀音,不應讀作「bot」、「too」中的讀音。 下面是一個有效音素的清單: a : 如cat b : 如cab c : 如cat d : 如dot e : 如bet f : 如frog g : 如frog h : 如hog i : 如pig j : 如jig k : 如keg l : 如leg m : 如met n : 如begin o : 如not p : 如pot r : 如rot s : 如sat t : 如sat u : 如put v : 如have w : 如wet y : 如yet z : 如zoo aa : 如fake ay : 如hay ee : 如bee ii : 如high oo : 如go bb : b的變化形式,重音不同 dd : d的變化形式,重音不同 ggg : g的變化形式,重音不同 hh : h的變化形式,重音不同 ll : l的變化形式,重音不同 nn : n的變化形式,重音不同 rr : r的變化形式,重音不同 tt : t的變化形式,重音不同 yy : y的變化形式,重音不同 ar : 如car aer : 如care ch : 如which ck : 如check ear : 如beer er : 如later err : 如later (長音) ng : 如feeding or : 如law ou : 如zoo ouu : 如zoo (長音) ow : 如cow oy : 如boy sh : 如shut th : 如thing dth : 如this uh : u 的變化形式 wh : 如where zh : 如Asian 人說話的時候,語音在整個句子之內起落變化。語調變化使得語音更自然、更富有感染力,使得問句和陳述句能夠相互區別。請考慮下面兩個句子: It is fake -- f|aa|k Is it fake? -- f|AA|k 也許你已經猜想到,提高語調的方法是使用大寫字母。 以上就是使用該軟體時你需要了解的東西。如果你對其後台實現細節感興趣,請繼續閱讀。
二、實現語音引擎 語音引擎的實現只包括一個類,四個方法。它利用了J2SE 1.3包含的Java Sound API。在這里,我不準備全面地介紹這個API,但你可以通過實例學習它的用法。Java Sound API並不是一個特別復雜的API,代碼中的注釋將告訴你必須了解的知識。 下面是Talker類的基本定義: package com.lotontech.speech; import javax.sound.sampled.*; import java.io.*; import java.util.*; import java.net.*; public class Talker { private SourceDataLine line=null; } 如果從命令行執行Talker,下面的main()方法將作為入口點運行。main()方法獲取第一個命令行參數,然後把它傳遞給sayPhoneWord()方法: /* * 讀出在命令行中指定的表示讀音的字元串 */ public static void main(String args[]) { Talker player=new Talker(); if (args.length>0) player.sayPhoneWord(args[0]); System.exit(0); }
sayPhoneWord()方法既可以通過上面的main()方法調用,也可以在Java程序中直接調用。從表面上看,sayPhoneWord()方法比較復雜,其實並非如此。實際上,它簡單地遍歷所有單詞的語音元素(在輸入字元串中語音元素以「|」分隔),通過一個聲音輸出通道一個元素一個元素地播放出來。為了讓聲音更自然一些,我把每一個聲音樣本的結尾和下一個聲音樣本的開頭合並了起來: /* * 讀出指定的語音字元串 */ public void sayPhoneWord(String word) { // 為上一個聲音構造的模擬byte數組 byte[] previousSound=null; // 把輸入字元串分割成單獨的音素 StringTokenizer st=new StringTokenizer(word,"|",false); while (st.hasMoreTokens()) { // 為音素構造相應的文件名字 String thisPhoneFile=st.nextToken(); thisPhoneFile="/allophones/"+thisPhoneFile+".au"; // 從聲音文件讀取數據 byte[] thisSound=getSound(thisPhoneFile); if (previousSound!=null) { // 如果可能的話,把前一個音素和當前音素合並 int mergeCount=0; if (previousSound.length>=500 && thisSound.length>=500) mergeCount=500; for (int i=0; i { previousSound[previousSound.length-mergeCount+i] =(byte)((previousSound[previousSound.length -mergeCount+i]+thisSound[i])/2); } // 播放前一個音素 playSound(previousSound); // 把經過截短的當前音素作為前一個音素 byte[] newSound=new byte[thisSound.length-mergeCount]; for (int ii=0; ii newSound[ii]=thisSound[ii+mergeCount]; previousSound=newSound; } else previousSound=thisSound; } // 播放最後一個音素,清理聲音通道 playSound(previousSound); drain(); } 在sayPhoneWord()的後面,你可以看到它調用playSound()輸出單個聲音樣本(即一個音素),然後調用drain()清理聲音通道。下面是playSound()的代碼: /* * 該方法播放一個聲音樣本 */ private void playSound(byte[] data) { if (data.length>0) line.write(data, 0, data.length); } 下面是drain()的代碼: /* * 該方法清理聲音通道 */ private void drain() { if (line!=null) line.drain(); try {Thread.sleep(100);} catch (Exception e) {} }
現在回過頭來看sayPhoneWord(),這里還有一個方法我們沒有分析,即getSound()方法。 getSound()方法從一個au文件以位元組數據的形式讀入預先錄制的聲音樣本。要了解讀取數據、轉換音頻格式、初始化聲音輸出行(SouceDataLine)以及構造位元組數據的詳細過程,請參考下面代碼中的注釋: /* * 該方法從文件讀取一個音素, * 並把它轉換成byte數組 */ private byte[] getSound(String fileName) { try { URL url=Talker.class.getResource(fileName); AudioInputStream stream = AudioSystem.getAudioInputStream(url); AudioFormat format = stream.getFormat(); // 把一個ALAW/ULAW聲音轉換成PCM以便回放 if ((format.getEncoding() == AudioFormat.Encoding.ULAW) || (format.getEncoding() == AudioFormat.Encoding.ALAW)) { AudioFormat tmpFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, format.getSampleRate(), format.getSampleSizeInBits() * 2, format.getChannels(), format.getFrameSize() * 2, format.getFrameRate(), true); stream = AudioSystem.getAudioInputStream(tmpFormat, stream); format = tmpFormat; } DataLine.Info info = new DataLine.Info( Clip.class, format, ((int) stream.getFrameLength() * format.getFrameSize())); if (line==null) { // 輸出線還沒有實例化 // 是否能夠找到合適的輸出線類型? DataLine.Info outInfo = new DataLine.Info(SourceDataLine.class, format); if (!AudioSystem.isLineSupported(outInfo)) { System.out.println("不支持匹配" + outInfo + "的輸出線"); throw new Exception("不支持匹配" + outInfo + "的輸出線"); } // 打開輸出線 line = (SourceDataLine) AudioSystem.getLine(outInfo); line.open(format, 50000); line.start(); } int frameSizeInBytes = format.getFrameSize(); int bufferLengthInFrames = line.getBufferSize() / 8; int bufferLengthInBytes = bufferLengthInFrames * frameSizeInBytes; byte[] data=new byte[bufferLengthInBytes]; // 讀取位元組數據,並計數 int numBytesRead = 0; if ((numBytesRead = stream.read(data)) != -1) { int numBytesRemaining = numBytesRead; } // 把位元組數據切割成合適的大小 byte[] newData=new byte[numBytesRead]; for (int i=0; i newData[i]=data[i]; return newData; } catch (Exception e) { return new byte[0]; } } 這就是全部的代碼,包括注釋在內,一個大約150行代碼的語音合成器。
三、文本-語音轉換 以語音元素的格式指定待朗讀的單詞似乎過於復雜,如果要構造一個能夠朗讀文本(比如Web頁面或Email)的應用,我們希望能夠直接指定原始的文本。 深入分析這個問題之後,我在本文後面的ZIP文件中提供了一個試驗性的文本-語音轉換類。運行這個類,它將顯示出分析結果。文本-語音轉換類可以從命令行執行,如下所示: java com.lotontech.speech.Converter "hello there" 輸出結果類如: hello -> h|e|l|oo there -> dth|aer 如果運行下面這個命令: java com.lotontech.speech.Converter "I like to read JavaWorld" 則輸出結果為: i -> ii like -> l|ii|k to -> t|ouu read -> r|ee|a|d java -> j|a|v|a world -> w|err|l|d 這個轉換類是如何工作的呢?實際上,我的方法相當簡單,轉換過程就是以一定的次序應用一組文本替換規則。例如對於單詞「ant」、「want」、「wanted」、「unwanted」和「unique」,則我們想要應用的替換規則可能依次為: 用「|y|ou|n|ee|k|」替換「*unique*」 用「|w|o|n|t|」替換「*want*」 用「|a|」替換「*a*」 用「|e|」替換「*e*」 用「|d|」替換「*d*」 用「|n|」替換「*n*」 用「|u|」替換「*u*」 用「|t|」替換「*t*」 對於「unwanted」,輸出序列為: unwanted un[|w|o|n|t|]ed (規則2) [|u|][|n|][|w|o|n|t|][|e|][|d|] (規則4、5、6、7) u|n|w|o|n|t|e|d (刪除多餘的符之後) 你將看到包含字母「wont」的單詞和包含字母「ant」的單詞以不同的方式發音,還將看到在特例規則的作用下,「unique」作為一個完整單詞優先於其他規則,從而「unique」這個單詞讀作「y|ou...」而不是「u|n...」。

③ 語音合成工具合成的語音從哪裡

除了使用C,VB,java這種程序代碼之外,直接使用Office就可以做到文本到聲音的轉換。 在Office XP的Excel中,就有「從文本到語音」的功能,但必須在Excel環境下才能實現。

④ java如何使用科大訊飛轉換語音並將語音下載

你到訊飛語音雲開放平台官網http://www.voicecloud.cn/index.html下載個語音開發包,可以支持應用的語音合成及合成音頻的保存

⑤ java能用的語音合成軟體

什麼意思,什麼叫JAVA能用的,一般是分為平台來算的,比如WIN32的平台、嵌入式平台,像ARM9的或者嵌入式操作系統下的,看你是用在什麼環境中的,如手機、電腦、導航儀等

⑥ espeak 安裝後java怎麼調用

眾所周知,所謂TTS即Text To Speech的英文縮寫,也就是「從文本轉換到語音」。

TTS技術的主要作用在於利用計算機合成人語,並將文字信息轉化為語音信息進行播放。簡單點說,TTS技術賦予了計算機「開口說人話」的能力。

作為一項歷史悠久的計算機技術,TTS的應用領域可謂非常之廣闊。不但可以用來閱讀電子郵件,進行IVR系統(Interactive Voice Response)的語音提示,也可以很方便的嵌入到游戲或者其它類型的應用程序當中,增強用戶體驗。尤其重要的是,在某些無法夠獲得詳細文字咨詢的場合(譬如聲訊台或者盲人服務),TTS技術具有其它技術無法替代的關鍵作用。

針對於TTS需求所要實現的功能,主要包含如下幾個部分:

1、文本分析:對輸入文本進行語言學分析,逐句進行詞彙的、語法的和語義的分析,以確定句子的低層結構和每個字的音素的組成,包括文本的斷句、字詞切分、多音字的處理、數字的處理、縮略語的處理等。

2、語音合成:把處理好的文本所對應的單字或短語從語音合成庫中提取,把語言學描述轉化成言語波形。

3、韻律處理:用以控制語音合成系統所輸出的語音的質量,一般可從清晰度、自然度和連貫性等方面進行主觀評價。

但是,即便上述所講從純技術角度來說並不很難,開發TTS引擎仍然是件非常讓人頭痛的事情。

因為除去核心架構的開發之外,TTS應用還存在有大量針對具體文字、片語、固定語句的采樣、歸類、矯正的工作要做,否則就無法滿足其「擬人」的最基本需求。從某種意義上講,這些非常耗時的重復性工作,其本質似乎更貼近體力勞動,而非嚴格意義上的技術領域。因此,對於TTS引擎的製造者而言,所需付出的體力勞動強度,將遠遠超出腦力勞動所應付出的代價(如果不是這樣,那些收費TTS引擎的開發商都要餓死了……)。

萬幸的是,我們生活在一個越來越傾向開源的國際大環境下,即使你一字不動,一筆不寫,也有數之不盡的現成輪子可供驅策,並不一定要花錢購買昂貴的商業引擎,也不必皓首窮經的自己從頭寫起。

比如本次發布的Java版TTS組件JTTS,就是基於著名開源TTS組件eSpeak封裝而來。(吾輩並沒狂妄(有癮)到想要(能夠)獨立開發TTS引擎的境界,所以效法Google對eSpeak進行jni封裝……)

關於eSpeak(eSpeak項目地址如下:http://espeak.sourceforge.net ):

eSpeak是一款緊湊的開放源碼軟體的語音合成器,允許自行編輯與修改詞庫,算得上是一個性價比合理的開源TTS解決方案。它支持包括中文(含粵語)在內的多種語言(可惜標准中文詞庫與擴展詞庫都不全,發音也不太好聽,想實用自己慢慢改吧,反正是開源的……),能夠跨平台運行於Linux和Windows之上(需要分別編譯)。值得一提的是,Google Android中所使用的TTS引擎,也是eSpeak。在如下地址:http://eyes-free.googlecode.com ,可以下載到Android版的eSpeak封裝項目。

關於jtts:

事實上,jtts只是將eSpeak進行簡單封裝後的「馬甲引擎」(很奇怪,此前為什麼沒人發java版的封裝,連php,Python,ruby版的都有……),使用方法基本與eSpeak相同,不過具體實現卻更為簡單,也更方便對於C/C++不太熟悉的朋友們使用。

目前已封裝eSpeak介面如下(未來有時間的話(目前業余以開發LGame為主),我會陸續添加更多的介面到jtts中,並逐漸擴展應用):

⑦ java使用freeTTS,怎麼能讓機器輸出中文語言

FreeTTS可以輸出中文語言過程:
①導入Java 語音API包
②為語音合成器聲明實例變數
③語音合成器的初始化
初始化是FreeTTS應用中關鍵的部分。首先需要建立一個SynthesizerModeDesc 對象,該對象用於指明語音合成器的屬性,包括語音引擎的的名稱、語音引擎的操作模式、支持的語言、語音引擎的運行狀態以及其發音能力等。
④創建語音合成器
創建語言合成器時需要用到Cen t ral 類, 其作用是提供用來訪問所有語音輸入和輸出的能力, 同時也可以定為語言引擎, 根據描述符所定義的屬性集合選擇匹配的引擎, 從而創建語音識別器和語音合成器。語音合成器的創建需使用Central類的createSynthesizer方法,該方法接受一個SynthesizerModeDesc描述符並返回同描述符中所指定屬性相匹配的一個Synthesizer對象,用以實現語音合成。
⑤准備用於朗讀的Synthesizer 對象
該部分通過Synthesizer對象的allocate和resume方法分配語音引擎所需要的資源並取得可用於朗讀的語音合成器。實現較為簡單:speechSynthesizer1allocate();speechSynthesizer1resume();
⑥設置Syn thesizer 對象的屬性
利用getSynthesizerProperties 方法可以獲得Synthesizer對象的屬性,其返回值是與語音合成器相關聯的SynthesizerProperties對象,該對象包含語音合成器的多種屬性, 每種屬性可以通過setProperties方法設置。例如: setSpeakingRate方法可設置speakingRate屬性,實現每分鍾朗讀單詞速率的控制。
⑦事件處理程序設計
speak ingRate 屬性, 實現每分鍾朗讀單詞速率的控制。完成應用程序界面中JButton「讀出號碼」的事件程序設計, 首先通過JComboBox(選擇人名的下拉列表)取得人名(namesArray)的一個索引,該索引與電話號碼索引(numbersArray)保持對應,然後調用Synthesizer對象speakingPlainText方法朗讀整理後的電話號碼字元串。

⑧ freetts引擎原理

FreeTTS 是完全採用 Java 開發的語音合成系統,它是卡內基梅隆大學基於
Flite 這個小型的語音合成引擎開發的。

⑨ java語音合成技術,該怎麼處理

去搜索 網路語音 ,調用 Restful 介面去做吧。

⑩ 科大訊飛的語音合成java介面有哪些函數,可以提供一下形參表嗎

官網的API文檔

~
~
~

熱點內容
壓縮比英文 發布:2024-05-06 01:56:35 瀏覽:171
數字php 發布:2024-05-06 01:53:10 瀏覽:742
編程中怎麼 發布:2024-05-06 01:43:32 瀏覽:629
如何訪問遠程資料庫 發布:2024-05-06 01:39:20 瀏覽:447
刷演算法的網站 發布:2024-05-06 01:30:39 瀏覽:270
少兒編程徐州 發布:2024-05-06 01:20:42 瀏覽:462
sqlserver連接驅動 發布:2024-05-06 00:33:34 瀏覽:646
存儲開銷 發布:2024-05-06 00:13:38 瀏覽:954
伺服器怎麼盈利 發布:2024-05-05 23:56:16 瀏覽:942
java網站培訓學校 發布:2024-05-05 23:43:11 瀏覽:41