王 薇,楊麗萍
(長春大學 計算機科學技術學院,長春 130022)
隨著人工智能技術、信息技術的飛速發展和人類與計算機關系的日益密切,人們已經不在滿足于計算機能播放和識別人類的語音信號,而且還希望計算機能夠識別人類的語音情感信息,對人類情感的變化給出一定的判別。目前較多的語音情感研究都是從語音信號中提取出一些聲學特征,然后將特征化簡提取出一些更有效的特征,再用模式識別中的一些方法嘗試去識別語音信號中的情感[1]。語音情感特征值的提取與分析是語音情感識別的基礎,而語音情感識別是一門綜合性的多領域的交叉學科,具有一定的難度,所以對情感語音信號的分析需要有一個十分方便且功能強大的工具。
MATLAB是matrix laboratory(矩陣實驗室)的縮寫,它自1984年由美國MathWorks公司推出后,經過不斷地改進和發展,現已成為國際公認的優秀的工程應用環境,已被廣泛的應用到教學、工程計算、通信、圖像處理、自動化控制等領域[2]。該軟件主要包括MATLAB和Simulink兩大部分。MATLAB語句書寫簡單,功能強大,一條語句往往相當于其它高級語言中的幾十條、幾百條甚至幾千條語句[3]。在很大程度上,MATLAB擺脫了傳統非交互式程序設計語言(如C、Fortran)的編輯模式,為工程設計、科學研究以及必須進行有效數值計算的眾多科學領域提供了一種全面的解決方案,成為國際科學計算軟件的先進代表。
Java是由Sun公司發布的一種純面向對象程序設計語言。目前Sun公司已被Oracle公司收購。Java語言具有跨平臺性、可移植性、多線程、分布式、安全可靠等優點。但Java程序設計語言對一些較為復雜的數值計算的編程較繁瑣,編程效率較低。對于情感語音特征值的分析與處理可以采用Java及Matlab的混合編程,實現二者的優勢互補。
Java與Matlab的混合編程可以是Java程序調用Matlab,也可以采用Matlab調用Java程序。
從Matlab 5.3版本起,在Matlab的安裝程序中集成了Java虛擬機JVM(Java Virtual Machine),這樣用戶就可以通過Matlab的命令訪問Java命令解釋器,完成對象的創建和訪問過程。Matlab訪問Java程序具有以下優點:
(1)通過訪問Java API擴展Matlab功能,例如一些輸入輸出功能及網絡功能,Matlab完全可以通過Java中的URL類訪問網絡上的資源;
(2)通過訪問第三方提供的Java類庫提高編程的重用率;
(3)在Matlab中較容易地構建Java對象,可以用Java或是Matlab的語法訪問Java對象中的方法;
(4)較容易地完成Matlab及Java之間的對象傳遞或是數值傳遞。
Matlab訪問Java中的類主要有三個來源:一是Java類庫中的類;二是第三方軟件提供者提供的類;三是用戶根據需求自己創建的類。Matlab加載類時在類路徑中查找所需要的類,因此Java類要加載到Matlab中首先要在Matlab中設置類所在的路徑。Matlab中的Java類路徑有靜態路徑與動態路徑兩種:靜態路徑是在Matlab啟動時加載的,在Matlab運行期間不能更改的路徑;動態路徑則可以在任何時間進行加載和修改。在Matlab提示符狀態下可使用javaclasspath查看當前的靜態路徑與動態路徑設置,若要修改靜態路徑的設置內容可先使用witch classpath.txt命令查看classpath.txt靜態類路徑文件所在的位置,再進一步用edit classpath.txt修改文件內容。定義動態路徑時使用javaclasspath命令,修改動態路徑時可使用javaaddpath和javarmpath完成。
當確定Matlab中所要用的Java類存在后,可用在Matlab程序中使用import命令將Java類或Java類所在的包完全導入到Matlab程序中,以便于在Matlab程序中使用。例如:
import java.lang.String;
import java.util.*;
import java.aut.*;
import java.util.Enumeration;
而在Matlab中使用類中的方法與Java中類似,同樣是點分隔符完全對類中方法的訪問。但是應注意的是要在MATLAB中調用的變量或方法必須要聲明為public類型[2]。
Java程序訪問Matlab主要有三種方式:
(1)利用COM對象實現訪問
COM是指通用對象模型(Common Object Model),是Microsoft推出的一個二進制代碼標準。此標準包括規范和實現兩大部分,這些規范不依賴于任何的語言和操作系統。在Matlab中構建COM對象需要使用ComBuilder完成Matlab算法到COM對象的轉換,從而使Java、C/C++、VB等基于COM+的應用程序使用COM對象。
(2)利用CORBA實現訪問
CORBA是指公共對象請求代理結構(Common Object Request Broker Architecture),它是體系結構最完整、最清晰,跨越平臺最多的構件模型[4]。使用CORBA連接Matlab十分復雜,開發效率低[5]。
(3)利用JNI技術實現訪問
JNI是指本地編程接口(Java Native Interface),Matlab向C/C++語言提供了Matlab Engine函數,Java通過JNI技術調用這些函數實現對Matlab的訪問。Matlab Engine是指Matlab提供的一種面向C/C++和Fortran語言的接口函數,應用程序的前端程序是用C或Java實現的GUI,而應用程序的后端采用Matlab編程,這樣可以提高編程效率,縮短編程時間。用戶應用程序使用Matlab的Engine函數時,一個新的Matlab進程會產生,通過控制該進程完成計算及繪圖任務。
情感語音分析中常用的特征值分為兩類:一是韻律特征;另一是音質特征。而各分類中又包含著多個特征值的選取,如短時能量、基音、強度、共振峰、語譜圖分析等。
語譜圖主要用于反映語音信號動態頻率特征,在語音分析中具有極其重要的實用價值。有時也可以把語譜圖看作是可視語言。語譜圖的水平方向表示時間軸,垂直方向表示頻率軸,圖上的灰度條紋則可表示各個時間點的語音短時譜。語譜圖上因其不同的灰度,形成不同的紋路,稱之為“聲紋”。聲紋因人而異,所以語譜圖在司法、安全等場合得到廣泛應用。
語譜圖包括時間分辨率和頻率分辨率,這兩個分辨率均由窗函數決定。時間分辨率越高,則時間波形的每個周期及共振峰隨時間的變化可以觀察得越明顯。但若頻率分辨率低,在語譜圖上則不足以分辨出由于激勵所形成的細微結構,此時可稱為寬帶語譜圖,而窄帶語譜圖正好與之相反。寬帶語譜圖由于可獲得較高的時間分辨率,則可以反映頻譜的快速時變過程;窄帶語譜圖可以獲得較高的頻率分辨率,所以可以反映頻譜的精細結構。兩者之間相結合,就可以提供帶寬與語音特性相關的信息。
在Matlab的安裝目錄下查找toolbox文件夾,在該文件夾中如果看到存在javabuilder文件夾,則說明已經安裝了Matlab Builder for Java。Matlab Builder for Java也可稱為Java Builder,它是對Matlab Compiler的一個擴展。用Matlab的Java Builder可以將Matlab函數包裝成一個或多個Java類,從而形成一個Java組件或者包被Java程序調用。
本實驗所采用的開發環境為jdk1.6.0_16、MyEclipse10和MATLAB R2012a,主要進行情感語音信號語譜圖的讀取和顯示。
將Matlab中的.m文件生成Java環境中的.jar文件的操作步驟如下:
(1)在Matlab的command窗口輸入deploytool命令,彈出一個新窗口Deployment Project。
(2)在Deployment Project窗口中單擊new按鈕創建新工程,輸入新工程名MyPro并在Type列表框中選擇Java Package選項。
(3)在Matlab的編輯器中編寫yupu.m文件,代碼如下:

代碼中wavread函數支持多通道數據,最多可支持32位采樣并支持讀取24位和32位的.wav文件。該函數讀取的情感語音文件是來源于北京航空航天大學電子信息工程學院毛峽教授課程組所建立的情感語音數據庫[6]。該語音數據庫為雙聲道的wav格式文件,樣本語句采樣頻率為11025Hz,量化精度為16bit。代碼中采用的函數格式是[y,Fs,bits]=wavread('filename'),該函數的返回值是以赫茲為單位的采樣率(Fs),以及用于文件數據編碼的每樣點比特數(bits)。上述程序執行結果如圖1所示。

圖1 語譜圖
specgram函數使用滑動窗計算信號的短時傅立葉變換,語譜圖是該函數的幅度值。代碼中采用的函數格式為specgram(a,nfft,fs,window),該函數參數指定了窗函數和矢量a每個窗口分區的樣點數。如果用戶提供了窗口尺寸,specgram函數則使用該尺寸的漢寧窗計算矢量a所表示信號的短時傅立葉變換。參數nfft指定specgram函數所用FFT長度,該值決定了計算短時傅立葉變換的各頻點;參數fs是指定采樣頻率的一個標量。
(4)在右側的Java Package中單擊Add Class創建新類,該類的名字為以后在Java所調用的類名,然后將該文件加入到類中。
(5)單擊build按鈕,即可在Matlab的當前工作路徑下,生成一個與工程名同名的文件夾,并生成一個.jar文件和一個.ctf文件,將這兩個文件復制到Java的.classpath所在文件夾中。
在MyEclipse中新建Java項目,并將Matlab中創建的jar包加入項目的build path,并且要把Matlab安裝目錄下的toolboxjavabuilderjarjavabuilder.jar文件加入項目的build path中。新建一個Java類VoiceTest,并引入相關的包,具體如下:

以上兩條引入了Matlab相關包及建立的包和類,這樣即可在Java類文件中使用Matlab中創建的.jar包。實驗經過以上設置后,通過構建Java GUI用戶界面,則可以在指定的菜單中選擇語譜圖進行顯示。
Matlab具有較好的數值計算功能,而Java具有較強的多線程、GUI設計等功能,將Matlab與Java進行結合應用在語音情感特征值研究過程中,不僅可以獲取用戶所需要的研究數據,還可以在更加友好的圖形界面中進行操作,簡化了操作方式,為用戶提供了友好的操作界面。而Matlab與Java的相互調用具有各自的方式和特點,用戶可以在研究過程中,結合具體需要采用Matlab調用Java程序或是Java程序調用Matlab方式。
[1]曾光菊.基于粗神經網絡的語音情感識別[J].四川理工學院學報,2011,24(4):472-476.
[2]王薇,楊麗萍.MATLAB在數據可視化中的應用[J].長春大學學報,2008,10:52-54.
[3]王薇.MATLAB的循環向量化編程方法研究[J].長春大學學報,2010,2:57-59.
[4]任文杰,王偉,馬松輝,陳懷民.MATLAB和JAVA的混合編程研究與實現[J].測控技術,2009,28(1):77-82.
[5]夏榆濱.軟件構件技術[M].北京:清華大學出版社,2011:12-13.
[6]李文趨.Java與Matlab混合編程在圖像處理中的應用[J].信息與電腦,2009,10:108.
[7]毛峽,陳立江.語音情感信息的提取及建模方法[P].中國專利:CN101261832,2008.