導航:首頁 > 編程語言 > java語音播報如何實現

java語音播報如何實現

發布時間:2023-07-02 20:02:24

java下如何實現語音通信的功能 新手求教 謝謝

我做過SIP的開發.sip是一種類似http的協議,比H323簡單多了.特別適合JAVA開發.

准備工具:java環境,開發工具eclipse等,測試工具ethereal必要的.

SIP:會話初始化協議(Session Initiation Protocol)
會話初始化協議(SIP)是一種應用層控制協議,它可用來創建、修改或終止多媒體會話,如網際網路電話呼叫。 SIP 能夠邀請參與者加入已存在的會話,如組播會議。現有的會話中可以添加或刪除媒體。 SIP 支持名稱映射和重定向服務,其支持用戶移動性。不管用戶網路位置在哪,用戶只需維持單一外部可視標識符。

SIP 在五個方面支持創建和終止多媒體通信:

用戶定位:決定用於通信的終端系統的確定;
用戶可用性:決定被叫方是否願意加入通信;
用戶能力:媒體和媒體參數的確定;
呼叫建立:「響鈴「,主叫方和被叫方的會話參數的建立;
呼叫管理:包括傳輸和終止會話、修改呼叫參數和調用服務。
SIP 可以結合其它 IETF 協議來建立完善的多媒體結構,如提供實時數據傳輸和服務質量(QOS)反饋的實時傳輸協議(RTP)、提供流媒體發送控制的實時流協議(RTSP)、為公用交換電話網路(PSTN)提供網關控制的媒體網關控制協議(MEGACO),以及描述多媒體會話的會話描述協議(SDP)。因此, SIP 需要與其它協議協同作用來為用戶提供完善的服務。然而 SIP 的基本功能和操作並不依賴於這些協議。

SIP 提供了一組安全服務,包括防止拒絕服務攻擊、認證(用戶對用戶和代理對用戶)、完整性保護和加密及隱私服務。

SIP 同時支持 IPv4 and IPv6 。關於網際網路電話會話, SIP 做如下工作:

通過 SIP 地址識別主叫方和被叫方。當建立一個 SIP 呼叫時,主叫方首先定位適合的伺服器,然後發出一個 SIP 請求。最通常的 SIP 行為是邀請。 SIP 請求會被代理重定向或者觸發一系列的新 SIP 請求,而不是直接到達目的被叫方。用戶可以通過 SIP 伺服器注冊他們的位置。 SIP 地址 (URL) 可以嵌入到網頁中,因此只要點擊一下就可以和對方建立呼叫會話。

⑵ 使用java製作一個在網頁端輸入文字,將文字以語音的方式播放 的案例

你的java是WEB應用嗎?不理解你的意思

播放語音可以在瀏覽器端調用JS實現
Createobject("SAPI.SPVoice").Speak("I love you")
但僅限IE瀏覽器下可以

⑶ 用java 實現文本語音朗讀

使用這個即可,採納即可。

⑷ 讓Java說話-用Java實現語音引擎

為應用程序加上語音能力有什麼好處呢?粗略地講 是為了趣味 它適合所有注重趣味的應用 比如游擾則戲 當然 從更嚴肅的角度來講 它還涉及到應用的可用性問題 注意 這里我考慮的不僅是可視化界面固有的不足 而且還有這樣一些情形 一些時候 讓雙眼離開當前的工作很不方便 甚至是不合法的 比如 假設有一個帶語音功能的瀏覽器 你就可以在外出散步或開車上班的同時 用聽的方式瀏覽自己喜愛的網站 從目前來看 郵件閱讀器或許是語音技術更實際的應用 在JavaMail API的幫助下 這一切已經可能 郵件閱讀器可以定期地檢查收件箱 然後用語音 You have new mail would you like me to read it to you? 引起你的注意 按照類似的思路 我們還可以考慮一個帶語音功能的提醒器 把它連接到一個日歷應用 它會及時地提醒你 Don t fet your meeting with the boss in minutes! 也許你已經被這些主意吸引 或者有了自己更好的主意 現在讓我們繼續 首先我將介紹如何啟用本文提供的語音引擎 這樣 如果你認為語音引擎的實現細節過於復雜 就可以直接使用它而忽略其實現細節 一 試用語音引擎 要使用這個語音引擎 你必須在CLASSPATH中加入本文提供的javatalk jar文件 然後從命令行運行(或者從Java程序調用) lotontech speech Talker類 如果從命令行運行 則命令為 java lotontech speech Talker h|e|l|oo 如果從Java程序調用 則代碼為 lotontech speech Talker talker=new 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 也許你已經猜想到 提高語調的方法是使用大寫字母 以上就是使用該軟體時你需要了解的東西 如果你對其後台實現細節感興趣 請繼續閱讀 二 實現語音引擎 語音引擎的實現只包括一個類 四個方法 它利用了J SE 包含的Java Sound API 在這里 我不準備全面地介紹這個API 但你可以通過實例學習它的用法 Java Sound API並不是一個特別復雜的API 代碼中的注釋將告訴你必須了解的知識 下面是Talker類的基本定義 package lotontech speech; import javax sound sampled *; import java io *; import java util *; import *; public class Talker { private SourceDataLine line=null; } 如果從命令行執行Talker 下面的main()方法將作為入口點運行 main()方法獲取第一個命令行參數 然後把它傳遞給sayPhoneWord()方法 /* * 讀出在命令行中指定的表示讀音的字元串 */ public static void main(String args[]) { Talker player=new Talker(); if (args length> ) player sayPhoneWord(args[ ]); System exit( ); } 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= ; if (previousSound length>= && thisSound length>= ) mergeCount= ; for (int i= ; i{ previousSound[previousSound length mergeCount+i] =(byte)((previousSound[previousSound length mergeCount+i]+thisSound[i])/ ); } // 播放前一個音素 playSound(previousSound); // 把經過截短的當前音素作為前一個音素 byte[] newSound=new byte[thisSound length mergeCount]; for (int ii= ; iinewSound[ii]=thisSound[ii+mergeCount]; previousSound=newSound; } else previousSound=thisSound; } // 播放最後一個音素 清理聲音通道 playSound(previousSound); drain(); } 在sayPhoneWord()的後面 你可以看到它調用playSound()輸出單個聲音樣本(即一個音素) 然後調用drain()清理聲音通道 下面是playSound()的代碼 /* * 該方法播放一個聲音樣本 */ private void playSound(byte[] data) { if (data length> ) line write(data data length); } 下面是drain()的代碼 /* * 該方法清理聲音通道 */ <b lishixin/Article/program/Java/JSP/201311/19532

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

⑹ java語言向指定的ip埠發語音,如何實現

伺服器端:最簡單的就是暴露一個http介面
使用servlet,用tomact部署
會有一個地址,假設是:版192.168.1.2:8080
客戶端:權那就應該是向上述地址發送語音了
具體:監聽音頻輸入源,使用傅里葉變換將語音轉換成數字信號
調用192.168.1.2:8080,將數字信號塞入request中,伺服器端就能收到了

⑺ java如何快速簡便地實現語音通話

直接接入第三發的SDK就好,試試ZEGO即構科技的語音SDK吧,直接通過四行代碼就可以接入,不用自己研發,省時省伍嘩讓力。蘆穗
並且這個的語音通話功能很好,沒有腔局卡頓、延遲、回聲等情況,音質很細膩。

閱讀全文

與java語音播報如何實現相關的資料

熱點內容
5g網路什麼時候普及河北邢台 瀏覽:709
編程和運營哪個更適合創業 瀏覽:893
尤里x怎麼升級 瀏覽:399
做業務績效考核需要哪些數據 瀏覽:433
dnf85版本劍魔刷圖加點 瀏覽:407
手機硬碟測試架可以讀取哪些數據 瀏覽:704
ug前後處理結算結果找不到文件 瀏覽:769
網頁框架拆分代碼 瀏覽:382
未來十年網路安全有什麼影響 瀏覽:362
win10更新後進不了劍靈 瀏覽:243
iphone471激活出錯 瀏覽:648
怎麼把文件拷到u盤 瀏覽:620
中伊簽署文件視頻 瀏覽:661
電信光寬頻網路不穩定 瀏覽:504
網路崗軟路由 瀏覽:995
黑莓z10在哪裡下載app 瀏覽:310
net批量下載文件 瀏覽:696
怎麼把蘋果一體機文件拷貝 瀏覽:117
sql文件怎麼寫 瀏覽:9
帝豪ec718導航升級 瀏覽:257

友情鏈接