Java提供了語音API技術用於支援應用程式或Web頁面中的人機語音互動,其核心技術包括語音合成和語音辨識。FreeTTS是Java語音合成技術的實現手段之一,以建立電話號碼朗讀程式為例, 探討了基於該技術的Java語音API實現方法及相關問題。
電腦技術的快速發展同時也推動了多媒體技術的廣泛應用, 人機語音互動已經不再是純粹的理論研究, 其應用在日常生活中越來越普遍: 如移動終端、通訊、資訊系統服務、家庭娛樂等。作為流行的程式設計語言, Java 提供了語音A P I 技術用於實現應用程式或者Web 頁面中的人機語音互動, 包括語音合成和語音辨識兩部分核心技術,但官方並未提供其實現工具。 FreeTTS 屬於第三方免費語音合成java組件, 由Speech Interat ion Group of Sun Micro systemsLaboratiories 和來自IBM的Speech for Java兩公司合作開發。本文探討了基於FreeTTS的語音朗讀程式設計與實現, 為工業應用中相關係統的開發提供一個技術參考。1.FreeTTS 的獲得、安裝與配置 FreeTTS屬於免費的開源java組件, 其官方網站是: http://freetts.sourceforge.net,使用者可以在該網站上免費下載。目前最新的版本是11211,下載後的檔案名稱與格式是: freetts-1.2.2-bin.zip。基於java的特點,該組件是跨平台的,安裝方法與普通java 應用程式或者組件的方法類似, 將檔案解壓至特定目錄並設定環境變數即可, 具體過程可以參考其安裝說明。2.語音合成功能實現 以一個例子來說明FreeTTS 的應用。該程式最終實現的效果1所示。使用者在下拉式功能表中可選擇“張三”、“王五”、“趙七”三個名字,三人依次對應電話號碼:“07138616661”,“13871990001”,“07136767555”。選擇人名後點擊“讀出號碼”,系統即可發出聲音,將對應的電話號碼讀出。該程式的設計包括以下過程:①匯入Java 語音API包主要代碼:Import javax.speech.* ;Import javax.speech.synthesis.* ;其中javax1speech中的類和介面用來支援音頻連通性;javax1speech.synthesis中的類和介面用來支援語音合成。②為語音合成器聲明執行個體變數 例如: private Synthesizer speechSynthesizer;③語音合成器的初始化 初始化是FreeTTS應用中關鍵的部分。首先需要建立一個SynthesizerModeDesc 對象,該對象用於指明語音合成器的屬性,包括語音引擎的的名稱、語音引擎的操作模式、支援的語言、語音引擎的運行狀態以及其發音能力等。 Syn thesizerModeDesc的構造方法需要接收5 個參數。第一個St ring 類型的參數用於指明文本到語音引擎的的名稱,如果是FreeTTS 內建,其名稱為“Unlimited dom ain FreeTTS Speech Synthesizerrom Sun Labs”; 第二個String 類型的參數用於標示語音引擎的操作模式,如果設定為null,則意味該引擎不存在特定的操作要求; 第三個參數用於指明該語音引擎所支援的語言,為Local類型,Local對象代表世界上特定的地區, 如果設定為Locale1US,則代表與之關聯的語言為英語;第四個參數是布爾類型,表示是否有一個正在啟動並執行語音引擎,如果為False,表示不去選擇已得到啟動並執行引擎;第五個參數是一個Voice數組對象, 允許開發人員指定某一語音合成器所輸出的語言,設定為null代表不存在特定的要求。下面是構造的例子:SynthesizerModeDesc descriptor = newSynthesizerModeDesc("Unlimited domain FreeTTS Speech Synthesizer " +" from Sun Labs", null, Locale1US, Boolean1FALSE,null) ;④建立語音合成器 建立語言合成器時需要用到Cen t ral 類, 其作用是提供用來訪問所有語音輸入和輸出的能力, 同時也可以定為語言引擎, 根據描述符所定義的屬性集合選擇匹配的引擎, 從而建立語音辨識器和語音合成器。語音合成器的建立需使用Central類的createSynthesizer方法,該方法接受一個SynthesizerModeDesc描述符並返回同描述符中所指定屬性相匹配的一個Synthesizer對象,用以實現語音合成。樣本如下:speechSynthesizer = Cent ral1createSynthesizer(descriptor)⑤準備用於朗讀的Synthesizer 對象 該部分通過Synthesizer對象的allocate和resume方法分配語音引擎所需要的資源並取得可用於朗讀的語音合成器。實現較為簡單:speechSynthesizer1allocate();speechSynthesizer1resume();⑥設定Syn thesizer 對象的屬性 利用getSynthesizerProperties 方法可以獲得Synthesizer對象的屬性,其傳回值是與語音合成器相關聯的SynthesizerProperties對象,該對象包含語音合成器的多種屬性, 每種屬性可以通過setProperties方法設定。例如: setSpeakingRate方法可設定speakingRate屬性,實現每分鐘朗讀單詞速率的控制。樣本:SynthesizerP ropertiesproperties =speechSynthesizer1getSynthesizerP roperties();properties.setSpeakingRate(100.0f) ; //設定朗讀速率,為浮點型資料⑦事件處理常式設計 speak ingRate 屬性, 實現每分鐘朗讀單詞速率的控制。完成應用程式介面中JButton“讀出號碼”的事件程式設計, 首先通過JComboBox(選擇人名的下拉式清單)取得人名(namesArray)的一個索引,該索引與電話號碼索引(numbersArray)保持對應,然後調用Synthesizer對象speakingPlainText方法朗讀整理後的電話號碼字串。下面是主要功能實現代碼:private String[] namesArray = {“張三”,“王五”,“趙七”};private String [] numbersA rray = {“071328616661”,“13871990001”,“07136767555”};//部分介面設計代碼, 省略//⋯⋯instruction.JLabel = new JLabel();instruction.JLabel1setBounds(16,8,264,23);//添加說明標籤instruction.JLabel1setText(“請從下拉式清單中選擇一個姓名1”);contentPane.add(instruction.JLabel);//設計下拉式清單JComboBox, 此處略//⋯instruction JLabel = new JLabel() ;instruction JLabel.setBounds(16,35,264,23) ;//添加說明標籤instruction JLabel.setText (“單擊按鈕聽號碼朗讀1”) ;contentPane1add(instruction JLabel) ;öö設計按鈕JBut ton 以及其他介面, 此處略//⋯//編寫按鈕事件程序private void getPhoneN umberJButtonActionPerformed(ActionEvent event ){ //獲得下拉式清單選定的索引 int selectedName = nameJComboBox1getSelectedIndex(); //設定朗讀電話號碼字元String textToSpeak = "sphone number is " + numbersArray[selectedName]; //實現朗讀 speechSynthesizer.speakPlainText(textToSpeak,null);}3.其他說明 開發人員在驗證或者運行該樣本程式時需要注意運行環境的配置, 首先要安裝好java2 軟體包j2sdk,根據FreeTTS 的版本, j2sdk 至少應該為114版本,同時應對環境變數進行正確的設定。在程式設計中需要注意相關資源(如: Synthesizer對象) 的釋放, 以使程式能夠作為子模組高效運行,而不影響大型系統的整體效能。2.2 MCU(LPC2132)主控程式 LPC2132 主控程式流程圖3 所示,LPC2132首先初始化晶片ENC28J60初始化部分主要完成:軟體複位;設定臨時使用的乙太網路物理地址; 設定接收幀的類型;確定資料的傳送方向;中斷允許;使能接收中斷;接收發送使能。LPC2132主要完成資料的解包打包。LPC2132從網路接收到資料報,則對資料報進行分析,如果是ARP資料包,則程式轉入ARP處理常式。如果是IP資料包且使用UDP協議,連接埠正確,則將資料解包後通過串口輸出。反之,如果LPC2132從串口收到資料,則將資料按照UDP 協議格式打包,送入ENC28J 60, 由ENC28J 60 把資料輸出到區域網路中。可以看出,鏈路層由ENC28J60 完成,TCP/IP 的網路層和傳輸層由LPC2132 來處理,而應用程式層則由使用者根據需要進行資料處理。整個系統模組是通過UC/OS2II 來對系統資源進行有效管理併合理調度任務的。