導航:首頁 > 編程語言 > 文字轉語音java

文字轉語音java

發布時間:2022-10-03 09:26:44

1. java使用Sapi.SpVoice完成語音朗讀,如何選擇語音庫

做語音的話,應該聽說過訊飛吧,可以去了解下訊飛的API

2. 在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...」。

3. java文字轉語音的jar包你能給我嗎

什麼意思?可以下啊:http://freetts.sourceforge.net/docs/index.php

4. 用java實現語音轉文本的功能你最後有實現沒啊

後來沒有做,當時從網上查了些資料,發現用C++做比較好,因為微軟提供了一個語音文本轉換開發包,我忘了叫什麼了,這個包是用C++寫的,提供了介面,好像調用一個方法就可以解決了,要不你研究下吧,你可以用C++寫一些,然後用java代碼調用,這個我也不會,你再研究下吧

5. 可否通過java調用sdk實現文字轉換成語音

目前有android平台的離線語音合成(文字轉語音)服務
使用的是java語言實現的。

6. Java有沒有語音處理的庫錄音,語音轉文字之類的

沒有的哦。不過想要將錄音或者語音轉換成文字的功能也是可以完成轉換的 。

當需要完成轉換的時候。在錄音轉文字助手這個工具上是可以完成轉換的。

在應用市場或者網路手機助手裡面能夠幫助完成轉換的哦。

7. java如何實現中文語音轉換文字

沒有直接的java類庫調用,只能通過JNI技術調用操作系統提供的TTS支持才能實現。

8. 想換手機!

聯想i921 2200元左右
規格參數
網路頻率: GSM/GPRS;900/1800MHz
尺寸/體積: 104×51×21.7mm
重 量 : 124 克
屏幕參數: 26萬色TFT彩色屏幕;240×320像素,2.2英寸;
通話時間: 180-300 分鍾
待機時間: 80-150 小時
上市時間: 2006年
標准配置: 兩塊鋰電池(900mAh),旅行充電器,線控立體聲耳機,同步數據線+專用軟體光碟,座充,128M MINI SD卡,手機皮套,選配:立體聲音箱,藍牙耳機
價格等級: 未知

基本功能
『內置天線』 『時鍾』 『內置振動』 『錄音』
『MP3鈴聲』 『錄制鈴聲』 『情景模式』 『通話記錄』
『EFR STK服務』

中文輸入: 聯想式中文拼音/英文/數字/手寫
中文簡訊: SMS機身存儲500條,支持簡訊回執,支持預置簡訊
簡訊群發: SMS/MMS群發30條,支持簡訊群刪
超長簡訊: 支持長簡訊
多媒體簡訊: 彩信機身存儲80條
可選鈴聲: 15 首
和弦鈴聲: 128 和弦;支持mp3,midi,wav,mmf,amr格式
通話時間提示: 支持通話計時
話機通訊錄: 共1000條;支持名片式存儲,快速檢索
通訊錄群組: 支持電話本分組查找方式
內置游戲: 4 個;泡泡龍、俄羅斯方塊、貪吃蛇、氣球
待機圖片: 支持牆紙更換
圖形菜單: 支持菜單背景主題

高級功能
『下載圖鈴游戲』 『觸摸屏』 『視頻播放』

內存容量: 30M
多媒體卡擴展: MINI SD
WAP瀏覽器: WAP 2.0,支持WAP PUSH
Java擴展: JAVA 2.0 + JSR184,JAVA游戲:2D游戲2款 3D游戲2款
藍牙介面: 內置
數據線介面: 支持PC同步
手寫輸入: 支持全屏手寫輸入
攝像頭: 內置
攝像頭像素: 200萬像素
感測器類型: CMOS
閃光燈: 內置
變焦模式: 4倍數碼變焦
照片解析度: 6種尺寸可選
連拍: 支持
定時拍攝: 支持
拍攝模式: 拍攝環境:三種:通常、室內、夜景,5種可選亮度調整
照片特效: 普通、懷舊、黑白
照片質量: 超精細、精細、通常
視頻拍攝: 支持

MP3播放器: 內置

附加功能
『鬧鍾』 『計算器』 『記事本』 『日程表』
『世界時鍾』

日歷: 支持(支持農歷),支持周年紀念日
單位換算: 支持單位換算
貨幣換算: 支持匯率換算

更多信息
GPRS CLASS 10
內置3D立體聲喇叭

9. java web jacob 調用微軟語音庫獲取音頻流

生成 wav,然後網頁中嵌入

請參考生成wave的C#代碼

/// <summary>
/// 輸出WAV
/// </summary>
/// <param name="path">保存路徑</param>
/// <param name="str">要轉換的文本內容</param>
/// <returns></returns>
public bool WreiteToWAV(string path,string str,SpeechAudioFormatType SpAudioType)
{
SpeechStreamFileMode SpFileMode = SpeechStreamFileMode.SSFMCreateForWrite;
SpFileStream SpFileStream = new SpFileStream();
SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
SpAudioFormat SpAudio = new DotNetSpeech.SpAudioFormat();
SpAudio.Type = SpAudioType;
SpFileStream.Format = SpAudio;
SpFileStream.Open(path, SpFileMode, false);
voice.AudioOutputStream = SpFileStream;
voice.Speak(str, SpFlags);
voice.WaitUntilDone(Timeout.Infinite);
SpFileStream.Close();
return File.Exists(path);
}

10. java可以實現語音識別嗎

這個是可以實現的。
註:test.pcm是語音文件,可以用audacity軟體打開,選擇 文件->導入->裸數據。 設置采樣率為8000Hz。點擊播放就能聽見聲音了。
這個時候程序跑起來還有問題,需要將apiKey 以及secretKey填寫上。這兩個值是你申請應用對應的分配好的。
cuid填本機mac地址就可以了,這個值我試過好像無所謂沒啥要求。
程序能跑起來,並且按照正常返回識別的語音結果。但是返回結果的編碼為GBK,所以漢字顯示為亂碼,需要對其進行一次轉碼。轉碼的代碼是我自己加上去的

閱讀全文

與文字轉語音java相關的資料

熱點內容
阿里雲郵smtp伺服器地址 瀏覽:250
解壓館認知理解 瀏覽:239
為什麼使用非官方伺服器會封號 瀏覽:9
佛山加密文檔軟體 瀏覽:813
港式5張梭哈源碼 瀏覽:241
數據中心pdf 瀏覽:524
crf源碼解析 瀏覽:853
伺服器軟體開發是什麼意思 瀏覽:941
刪除彩信android 瀏覽:862
元宵節猜燈謎h5源碼 瀏覽:69
樂培生app怎麼綁定 瀏覽:762
視頻壓縮不清楚怎麼說 瀏覽:525
加好友伺服器繁忙是怎麼回事 瀏覽:381
怎麼解綁app的支付寶賬號 瀏覽:912
ip地址伺服器不可用怎麼解決方法 瀏覽:185
為什麼軟體需要伺服器 瀏覽:63
redis操作命令大全 瀏覽:597
python字元串重復索引 瀏覽:963
為什麼香信新版本連接不上伺服器 瀏覽:50
元旦程序員打羽毛球 瀏覽:615