標籤:語音辨識 訊飛語音 android 語音合成
Android語音播報、後台播報、語音辨識
本文介紹使用訊飛語音實現語音播報、語音辨識功能。
訊飛開放平台:http://www.xfyun.cn/index.php/default/index
程式:
簡單的XML布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <EditText android:id="@+id/et" android:layout_width="fill_parent" android:layout_height="wrap_content" android:editable="true" /> <Button android:id="@+id/bt_recognize" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="識別" /> <Button android:id="@+id/bt_speek" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="Speek" /> <Button android:id="@+id/bt_speek_bg" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="後台Speek" /> <TextView android:textColor="@android:color/white" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="語音控制開關" /> <ToggleButton android:id="@+id/tb" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
識別
case R.id.bt_recognize: // 這是語言識別部分,最重要的執行個體化一個 // RecognizerDialog並把你在官方網站申請的appid填入進去,非法id不能進行識別 RecognizerDialog isrDialog = new RecognizerDialog(Voice1Activity.this, APPID); /* * 設定引擎目前支援五種 ”sms”:普通文本轉寫 “poi”:地名搜尋 ”vsearch”:熱詞搜尋 * ”video”:視頻音樂搜尋 ”asr”:命令詞識別 */ isrDialog.setEngine("sms", null, null); isrDialog.setListener(recoListener); isrDialog.show(); break;
// 語言識別監聽器,有兩個方法 RecognizerDialogListener recoListener = new RecognizerDialogListener() { @Override public void onResults(ArrayList<RecognizerResult> results, boolean isLast) { // 新增加了一個ToggleButton tb,首先檢查tb是否被按下,如果被按下才進行語言控制,沒被按下就進行文字識別 if (tb.isChecked()) { // doVoice方法就是進行識別 doVoice(results); } else { // 伺服器識別完成後會返回集合,我們這裡就只得到最匹配的那一項 text += results.get(0).text; System.out.println(text); } } // 首先迭代結果,然後擷取每個結果,並進行對比,如果包含有特定字串,那麼就執行相應Intent跳轉。 // 注意 凡是Intent能辦到的(發郵件,跳到已安裝應用,撥號,發簡訊,發多媒體訊息,瀏覽網頁,播放多媒體),它就都能辦到。 private void doVoice(ArrayList<RecognizerResult> results) { Intent i = new Intent(); for (RecognizerResult result : results) { if (result.text.contains("天氣")) { // 天氣介面的跳轉 i.setClass(Voice1Activity.this, Weather.class); startActivity(i); } else if (result.text.contains("新聞")) { // 新聞介面的跳轉 i.setClass(Voice1Activity.this, News.class); startActivity(i); } else if (result.text.contains("簡訊")) { // 簡訊介面的跳轉 i.setAction(Intent.ACTION_VIEW); i.setType("vnd.android-dir/mms-sms"); startActivity(i); } else { // 如果沒有相應指令就用Toast提示使用者 Toast.makeText(Voice1Activity.this, "無法識別",Toast.LENGTH_SHORT).show(); } } } @Override public void onEnd(SpeechError error) { if (error == null) { // 完成後就把結果顯示在EditText上 et.setText(text); } } };
Speek
case R.id.bt_speek: // 這是語言合成部分 同樣需要執行個體化一個SynthesizerDialog ,並輸入appid SynthesizerDialog syn = new SynthesizerDialog(Voice1Activity.this, APPID); syn.setListener(new SynthesizerDialogListener() { @Override public void onEnd(SpeechError arg0) { } }); // 根據EditText裡的內容實現語音合成 syn.setText(et.getText().toString(), null); syn.show(); break;
後台Speek
case R.id.bt_speek_bg: //這是後台朗讀,執行個體化一個SynthesizerPlayer SynthesizerPlayer player = SynthesizerPlayer.createSynthesizerPlayer(Voice1Activity.this, APPID); //設定語音朗讀者,可以根據需要設定男女朗讀,具體請看api文檔和官方論壇 player.setVoiceName("vivixiaoyan");//在此設定語音播報的人選例如:vivixiaoyan、vivixiaomei、vivixiaoqi player.playText(et.getText().toString(), "ent=vivi21,bft=5",null); break;
源碼下載:http://download.csdn.net/download/gao_chun/8775975
Android語音播報、後台播報、語音辨識