基於Google的嵌入式系統android開發語音技術(語音搜尋,語音朗讀文章,語音控制)

來源:互聯網
上載者:User

android是Google推出的嵌入式作業系統,有著廣泛的根基與基礎。最近一個中關村的一個CEO朋友送了一個摩托羅拉android手機,想玩玩語音技術過把癮。如何用android開發語音技術應用呢,本人下載的最新SDK,android-2.1_r01-windows,

廢話少說,看看老夫一展身手,雖然我本人精通C/C++,.Net,但是玩起java也是一點都不含糊的,老夫我的android手機提前安裝了

Linux開源語音辨識引擎simon,本人已經完全移植成功,英文識別率非常高只比nuance差一點

Linux開源語音朗讀引擎espeak, ,本人已經完全移植成功,英文朗讀只比於科大訊飛差一點

先簡單介紹下語音朗讀技術

詳細代碼見注釋

 

import android.app.Activity;<br />import android.os.Bundle;<br />import android.speech.tts.TextToSpeech;<br />import android.util.Log;<br />import android.view.View;<br />import android.widget.Button;<br />import com.example.android.apis.R;<br />import java.util.Locale;<br />import java.util.Random;<br />public class TextToSpeechActivity extends Activity implements TextToSpeech.OnInitListener {<br /> private static final String TAG = "TextToSpeech";<br /> private TextToSpeech mTts;<br /> private Button mAgainButton;</p><p> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.text_to_speech);<br /> //初始化文本到語音。這是一個非同步作業。<br /> //OnInitListener(第二個參數)被調用初始化後完成。<br /> mTts = new TextToSpeech(this,<br /> this // 建立介面初始化<br /> );<br /> //禁用按鈕的布局。<br /> //這將被啟用後的TTS引擎的初始化<br /> mAgainButton = (Button) findViewById(R.id.again_button);<br /> mAgainButton.setOnClickListener(new View.OnClickListener() {<br /> public void onClick(View v) {<br /> sayHello();<br /> }<br /> });<br /> }<br /> public void onDestroy() {<br /> // 刪除對象退出<br /> if (mTts != null) {<br /> mTts.stop();<br /> mTts.shutdown();<br /> }</p><p> super.onDestroy();<br /> }</p><p> // 實現TextToSpeech.OnInitListener<br /> public void onInit(int status) {<br /> // 返回成功或者失敗<br /> if (status == TextToSpeech.SUCCESS) {<br /> //設定慣用語言為美國英語。<br /> //注意語言可能無法使用,其結果將表明這一點。<br /> int result = mTts.setLanguage(Locale.US);<br /> // 定義結果 mTts.setLanguage(Locale.FRANCE);<br /> if (result == TextToSpeech.LANG_MISSING_DATA ||<br /> result == TextToSpeech.LANG_NOT_SUPPORTED) {<br /> // 語言不受支援<br /> Log.e(TAG, "Language is not available.");<br /> } else {<br /> //檢查其他可能的結果代碼檔案。<br /> //例如,語言可能是可用的語言環境,但不是指定的國家和變體。</p><p> //TTS引擎已成功初始化。<br /> //允許使用者按下按鈕的應用程式再次發言。<br /> mAgainButton.setEnabled(true);<br /> // 開始調用<br /> sayHello();<br /> }<br /> } else {<br /> // Initialization failed.<br /> Log.e(TAG, "Could not initialize TextToSpeech.");<br /> }<br /> }</p><p> private static final Random RANDOM = new Random();<br /> private static final String[] HELLOS = {<br /> "Hello",<br /> "yincheng",<br /> "ShanDongUniversity",<br /> "microsoft",<br /> "google is great",<br /> "My name is yincheng!"<br /> };</p><p> private void sayHello() {<br /> // 隨機播放朗讀文本<br /> int helloLength = HELLOS.length;<br /> String hello = HELLOS[RANDOM.nextInt(helloLength)];<br /> mTts.speak(hello,<br /> TextToSpeech.QUEUE_FLUSH,<br /> null);<br /> }</p><p>}<br />

 

 

android語音辨識是通過一個Intent的Action動作來完成的。主要有以下兩種模式:

ACTION_RECOGNIZE_SPEECH:一般語音辨識,主要用於語音控制。

ACTION_WEB_SEARCH:網路搜尋識別,主要用於語音搜尋

 

我們先來分析下語音控制,

import android.app.Activity;<br />import android.content.Intent;<br />import android.content.pm.PackageManager;<br />import android.content.pm.ResolveInfo;<br />import android.os.Bundle;<br />import android.speech.RecognizerIntent;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.ArrayAdapter;<br />import android.widget.Button;<br />import android.widget.ListView;<br />import java.util.ArrayList;<br />import java.util.List;<br />public class VoiceRecognition extends Activity implements OnClickListener {<br />private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;<br /> private ListView mList;<br /> public void onCreate(Bundle savedInstanceState)<br /> {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.voice_recognition);<br /> Button speakButton = (Button) findViewById(R.id.btn_speak);<br /> mList = (ListView) findViewById(R.id.list);<br /> // 檢查是否有語音辨識活動<br /> PackageManager pm = getPackageManager();<br /> List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);<br /> if (activities.size() != 0)<br /> {<br /> speakButton.setOnClickListener(this);<br /> }<br /> else<br /> {<br /> speakButton.setEnabled(false);<br /> speakButton.setText("Recognizer not present");<br /> }<br /> } </p><p> public void onClick(View v)<br /> {<br /> if (v.getId() == R.id.btn_speak)<br /> {<br /> startVoiceRecognitionActivity();<br /> }<br /> } </p><p> private void startVoiceRecognitionActivity()<br /> {<br /> //藉助Intent傳遞語音辨識的模式<br /> Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);<br /> //語言模式和自由形式的語音辨識<br /> intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);<br /> //提示音開始<br /> intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");<br /> //開始語音辨識<br /> startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);<br /> } </p><p> //當語音結束時的回呼函數onActivityResult<br /> @Override<br /> protected void onActivityResult(int requestCode, int resultCode, Intent data)<br /> {<br /> if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK)<br /> {<br /> // 取得語音結果,加入一個選擇判斷就可以語音控制<br /> ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);<br /> mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches));<br /> } </p><p> super.onActivityResult(requestCode, resultCode, data);<br /> }<br />}

 

 

然後我們來親自實踐一個語音搜尋,建立一個webview 來進行搜尋,就是完整的語音搜尋了,結合上述的語音合成,那簡直牛的很,

 

 

import android.app.Activity;<br />import android.content.Intent;<br />import android.content.pm.PackageManager;<br />import android.content.pm.ResolveInfo;<br />import android.os.Bundle;<br />import android.speech.RecognizerIntent;<br />import android.view.View;<br />import android.view.View.OnClickListener;<br />import android.widget.ArrayAdapter;<br />import android.widget.Button;<br />import android.widget.ListView;<br />import java.util.ArrayList;<br />import java.util.List;<br />public class VoiceRecognition extends Activity implements OnClickListener {<br />private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234; </p><p> private ListView mList;<br /> public void onCreate(Bundle savedInstanceState)<br /> {<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.voice_recognition);<br /> Button speakButton = (Button) findViewById(R.id.btn_speak);<br /> mList = (ListView) findViewById(R.id.list);<br /> // 檢查是否有語音辨識活動<br /> PackageManager pm = getPackageManager();<br /> List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);<br /> if (activities.size() != 0)<br /> {<br /> speakButton.setOnClickListener(this);<br /> }<br /> else<br /> {<br /> speakButton.setEnabled(false);<br /> speakButton.setText("Recognizer not present");<br /> }<br /> } </p><p> public void onClick(View v)<br /> {<br /> if (v.getId() == R.id.btn_speak)<br /> {<br /> startVoiceRecognitionActivity();<br /> }<br /> } </p><p> private void startVoiceRecognitionActivity()<br /> {<br /> //藉助Intent傳遞語音辨識的模式 ,註明語音搜尋識別模式<br /> Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);<br /> //語言模式和自由形式的語音辨識<br /> intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);<br /> //提示音開始<br /> intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");<br /> //開始語音辨識<br /> startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);<br /> } </p><p> //當語音結束時的回呼函數onActivityResult<br /> @Override<br /> protected void onActivityResult(int requestCode, int resultCode, Intent data)<br /> {<br /> if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK)<br /> {<br /> // 取得語音結果,加入一個選擇判斷就可以語音控制<br /> ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);<br /> mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, matches));</p><p> //進行訪問網頁的語音搜尋,可以結合上述例子實現語音合成朗讀,他媽的,太爽了哈</p><p> WebView webView = (WebView) findViewById(R.id.webView);</p><p> // 配置瀏覽器,使其可支援 JavaScript<br /> WebSettings webSettings = webView.getSettings();<br /> webSettings.setJavaScriptEnabled(true);<br /> // 清除瀏覽器緩衝<br /> webView.clearCache(true);<br /> // 指定瀏覽器地址,就是google搜尋關鍵詞的訪問格式,檢索語音結果<br /> webView.loadUrl("http://www.google.com.hk/search?hl=zh-CN&source=hp&q="+data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)+"&meta=&aq=f&aqi=g10&aql=&oq=&gs_rfai=");<br /> // 指定瀏覽器需要解析的 html 資料 ,可以結合語音朗讀讀出<br /> // webView.loadData("<a href="http://webabcd.cnblogs.com/" mce_href="http://webabcd.cnblogs.com/">webabcd</a>", "text/html", "utf-8");</p><p> } </p><p> super.onActivityResult(requestCode, resultCode, data);<br /> }<br />} </p><p>

 

至此大功告成,本文未經許可,不準轉載。否則侵權後果自負。

需要原始碼(Andrroid語音控制撥號sample,Andrroid語音自動搜尋並朗讀結果的語音瀏覽器sample),請在本人CSDN部落格留言,源碼將在4.12日VS2010發布大會那一天統一發送源碼(僅發送前200樓),請大家踴躍留下Email.後面排隊的將等到5.20日。

 

作為語音技術業內專家,提供語音技術開發應用企業諮詢顧問,有需要者請聯絡MSN:yincheng01@163.com,

策劃有一套雲端運算語音互動移動3G商業計劃正在實施已經獲得天使投資,在移動3G上面有想法的站長們可以聯絡我共創語音3G時代!

 

另外本人正在參加Google Andrroid軟體開發大賽(作品為基於人工智慧與語音互動的3D寵物),希望有空大家去捧場!

http://code.google.com/intl/zh-CN/android/

http://code.google.com/intl/zh-CN/android/adc/

 

 本人完成作品時,得到中國科學院陳博士後在人工智慧與多線程並行計算上的支援,在此特別感謝!

 

 

 

也特別感謝中國科學院著名的圖形學天才專家顏博士後完成了3D智能寵物的所有表情與動作,其效果之炫麗簡直是驚天地,泣鬼神!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.