當前位置:編程學習大全網 - 編程語言 - 如何用java編程,實現聲音特征的提取?

如何用java編程,實現聲音特征的提取?

您好,1 雙方之間的網絡連接

Java在這方面有其獨特的優勢,Java提供了豐富的網絡類庫的支持,可以輕松編寫多種類型的網絡通信程序。在我下面的例子中我就使用了TCP/IP協議,通過Java的Socket類進行編程。

2 音頻信號的采集和回放以及音頻數字信號的編碼與解碼

在解決這兩個問題的時候,在網上很幸運地通過壹些文章的介紹,找到了Answer Machine 演示程序的源代碼(由of jsresources.org的Florian Bomers 和Matthias Pfisterer編寫,網址munications)就是我們下面例子中采用的壓縮格式,GSM格式可以將128kbps 的音頻數據流 (16bit通過8k Hz的音頻采樣) 壓縮為13kbps 的音頻數據流,非常適合語音信號的傳送,所以可謂是壹石二鳥。

我分析過這幾個類的源代碼,不得不佩服它的作者,每個類的源代碼都很精煉,大家可以自己分析壹下。好了下面就給大家講講這幾個類,並且將它們用到的Java Sound API中的類和函數等壹並做個簡單介紹,讓大家對Java Sound API中常用的類也有個大致的了解。由於Java Sound API中的類比較多。限於篇幅無法對所有用到的類做詳盡的解釋,以下內容只是簡單提及了各個類的用途和使用規範,有關Java Sound API中類的具體介紹請大家訪問這裏/j2se/1.4.2/docs/api/, 查找javax.sound.sampled的相關內容。

以下的提到幾個文件是從Answer Machine 演示程序的源代碼中提取出來的,由於是開放源代碼的程序,大家在使用的時候請註意相關的公***協議。

① AMAudioFormat類(封裝在AMAudioFormat.java文件中)

AMAudioFormat類封裝了CD、FM、TELEPHONE、GSM這四種質量的音頻格式的參數,使用起來也非常簡單,這樣我們在使用Java Sound API時就不用自己去寫那些復雜的代碼了,但為了明白Java Sound API的原理,我們需要對它的代碼做壹下分析。它使用了Java Sound API中的AudioFormat這個類,這個類非常重要,在Java中對任何音頻數據的使用都要實現通過它指定所需要使用的音頻格式,AudioFormat類有壹個嵌套的類AudioFormat.Encoding,實際上大部分對AudioFormat類的使用都是使用的這個嵌套的類。

AMAudioFormat類的重要方法:

名稱:getLineAudioFormat

調用格式:getLineAudioFormat(整型音頻格式代號)

返回值: 根據傳遞音頻格式代號生成的AudioFormat對象。

說道這裏大家可能要問了,那麽通過Java Sound API可以直接使用GSM格式嗎?答案是比較復雜,但同樣有解決的辦法,作者在這裏使用了另外的開源程序的類庫-tritonus的GSM編碼解碼庫。大家需要在這裏www.tritonus.org/plugins.html下載tritonous_share.jar和tritonus_gsm.jar兩個文件,並在AMAudioFormat類中引用,這樣就完成了GSM格式的設置。需要告訴大家的是在對AMAudioFormat.java這個類進行編譯後,我們的程序運行的時候就可以不需要tritonous_share.jar和tritonus_gsm.jar這兩個文件的支持了。

② AudioCapture類(封裝在AudioCapture.java文件中)

AudioCapture類封裝了從音頻硬件捕獲音頻數據並自動編碼為GSM音頻壓縮數據的過程,並且通過它的getAudioInputStream()方法提供給我們壹個音頻數據輸入流,我們就可以直接將這個流發送到網絡中。

AudioCapture 類的重要方法:

名稱:getAudioInputStream

調用格式:getAudioInputStream()

返回值:AudioInputStream對象

AudioCapture 類使用了Java Sound API中的AudioInputStream、AudioFormat、AudioSystem這幾個類和TargetDataLine、LineListener接口。除了AudioFormat類我再簡單介紹壹下其他的類:

AudioInputStream 類是帶有特殊音頻格式和長度的InputStream類,它有兩個構造方法,分別是AudioInputStream(InputStream stream, AudioFormat format,long length)和AudioInputStream(TargetData -Line line)。

TargetDataLine 接口是DataLine接口的壹種,通過它就可以直接從音頻硬件獲取數據了,它有幾個常用的方法,分別是:open(AudioFormat format)、void open(AudioFormat format, int bufferSize)、int read(byte[] b, int off, int len)。

AudioSystem 類是Java標準音頻系統的入口點,在AudioSystem 類中使用他的getLine() 方法創建TargetDataLine對象。

LineListener接口用來對線路狀態改變的時間進行監聽,他的重要的方法是update(LineEvent event)方法。

③ AudioPlayStream類(封裝在AudioPlayStream.java文件中)

AudioPlayStream類與AudioCapture類剛好相反,它封裝了GSM壓縮音頻數據的解碼和音頻信號的回放過程,提供給我們壹個音頻信號輸出流。AudioCapture類用到的Java Sound API中的類它也基本都用到了,只是它使用了SourceDataLine接口而不是TargetDataLine接口

④ Debug類(封裝在Debug.java文件中)

Debug類主要用來在調試時輸出訊息,代碼很少,後來我把其中輸出信息的語句都屏蔽了,對程序運行沒有影響。

為了方便使用以上的幾個類,我們需要對它們進行編譯和打包,編譯時需要設置相關的編譯環境,以下是我們需要用到的命令行

set CLASSPATH=%CLASSPATH%;.;tritonus_gsm.jar;tritonus_share.jar

javac am*.java amaudio*.java

jar cmf packagingmanifest.mf am.jar am*.class

amaudio*.class

說明壹下,我將以上提到的Java源碼文件放在了am目錄下,編譯之後可以得到壹個8k的am.jar文件,我們下壹步所需要做的就是在我們的程序中引用這個包。

  • 上一篇:歷史上有名的病毒
  • 下一篇:C語言編程問題 高手進......加分的啊~~
  • copyright 2024編程學習大全網