1. 程式人生 > >Java學習筆記之FreeTTS(語音)

Java學習筆記之FreeTTS(語音)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                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 = new SynthesizerModeDesc( "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 來對系統資源進行有效管理併合理排程任務的。            

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述