1. 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) 可以嵌入到網頁中,因此只要點擊一下就可以和對方建立呼叫會話。
2. java實現語音
原理很簡單,你有從漢字字元到語音的映射也就是對應關系就行。
但是復雜的是,回你要如何得到這個映射答呢?很不好弄吧,java是沒有這樣的原始api的。另外多音字問題也是一個不容易解決的問題。
不過,如果是windows xp系統裝有語音支持的話,可以靠JNI調用windows相關函數來實現,推薦看看windows體系編程的書籍,會有相關的介紹
3. java如何快速簡便地實現語音通話
直接接入第三發的SDK就好,試試ZEGO即構科技的語音SDK吧,直接通過四行代碼就可以接入,不用自己研發,省時省伍嘩讓力。蘆穗
並且這個的語音通話功能很好,沒有腔局卡頓、延遲、回聲等情況,音質很細膩。
4. Java有沒有語音處理的庫錄音,語音轉文字之類的
你好!這個是沒有的,java沒有自帶語音處理的庫。如果你想要實現錄音,語音轉文字,推薦使用網路的語音識別,同時支持普通話,英文,粵語和四川話,很方便,也很好用
5. 用JAVA實現語音對講,有沒有會的,交流交流
這個要用到網路、音頻、壓縮、多媒體等的庫,Java本身提供的雖然也能實現,但回是差太多了,但答是Java官方提供了一個封裝好的API庫,叫做JMF, 意為Java媒體框架(Java Media Framework),你可以去了解一下:
但是其實用Java做這個也是沒法趕上潮流的,qq和msn這些都是用C/C++做的,更新的趨勢是在網頁里頭進行音視頻,你可以試著了解一下google的瀏覽器最新版本支持的協議,可以實現無插件網頁音視頻聊天,用過google+(國內是被牆的)的都知道。
6. 在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...」。
7. java語言向指定的ip埠發語音,如何實現
伺服器端:最簡單的就是暴露一個http介面
使用servlet,用tomact部署
會有一個地址,假設是:版192.168.1.2:8080
客戶端:權那就應該是向上述地址發送語音了
具體:監聽音頻輸入源,使用傅里葉變換將語音轉換成數字信號
調用192.168.1.2:8080,將數字信號塞入request中,伺服器端就能收到了
8. 求解,JAVA語言多人語音聊天怎麼解決混音問
兩路音視頻流,符合以下條件才能混合:
格式相同,要解壓成 PCM 格式。回
采樣答率相同,要轉換成相同的采樣率。主流采樣率包括:16k Hz、32k Hz、44.1k Hz 和 48k Hz。
幀長相同,幀長由編碼格式決定,PCM 沒有幀長的概念,開發者自行決定幀長。為了和主流音頻編碼格式的幀長保持一致,推薦採用 20ms 為幀長。
位深(Bit-Depth)或采樣格式 (Sample Format) 相同,承載每個采樣點數據的 bit 數目要相同。
聲道數相同,必須同樣是單聲道或者雙聲道 (立體聲)。這樣,把格式、采樣率、幀長、位深和聲道數對齊了以後,兩個音頻流就可以混合了。
JAVA代碼問題可以到即構開發者中心看看
9. 鐢╦ava鍐欎釜錛屽㈡埛絝涓庢湇鍔$錛屽㈡埛絝鐢ㄤ腑鏂囪緭鍏ュ彂閫佺粰鏈嶅姟絝錛屾湇鍔$鐢ㄨ闊寵誨嚭...楂樺垎奼傚姪
鏈嬪弸絝瀵圭鐨勭▼搴忓緢濂藉啓錛屼綘闇瑕佺殑璇闊寵誨嚭鍦–鍜宩ava涓婁篃宸茬粡姣旇緝鎴愮啛浜嗭紝浣犲彲浠ヨ嚜宸卞厛灝濊瘯鎶婄瀵圭鐨勭▼搴忓啓濂斤紝鐒跺悗鍐嶆妸鏂囧瓧杞璇闊崇殑妯″潡鍔犱笂鍘匯傝嚦浜庤闊蟲ā鍧椾綘鍙浠ュ皾璇曠敤涓涓猅TS(Test to Speech)錛宩ava 鏈変笓涓氱殑speech api浣犲彲浠ヤ笅杞藉幓鐪嬩竴涓嬨