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 {
// server識別完畢后會返回集合。我們這里就僅僅得到最匹配的那一項
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
轉載請注明.
