訊飛語音的簡單使用
使用方法:
1 匯入SDK:
將開發工具包中libs目錄下的Msc.jar和armeabi(實際還有多個檔案,我們全部拷貝進來,以便機型適配)複製到Android工程的libs目錄.
2 在專案build.gradle檔案的android{}內,配置下面一段程式碼,同步一下gradle檔案.
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
3 對清單檔案進行許可權配置,以下是訊飛語音用到的許可權.
<!--連線網路許可權,用於執行雲端語音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--獲取手機錄音機使用許可權,聽寫、識別、語義理解需要用到此許可權 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<!--讀取網路資訊狀態 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--獲取當前wifi狀態 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允許程式改變網路連線狀態 -->
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<!--讀取手機資訊許可權 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<!--讀取聯絡人許可權,上傳聯絡人需要用到此許可權 -->
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<!-- 如需使用人臉識別,還要新增:攝相頭許可權,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
5 初始化訊飛語音SDK:只有初始化後才可以使用MSC的各項服務。建議將初始化放在程式入口處(如Application、Activity的onCreate方法),初始化程式碼如下:
public class MyApplication extends Application {
@Override
public void onCreate() {
//將“12345678”替換成您申請的 APPID,申請地址:http://www.xfyun.cn
//請勿在“=”與 appid 之間新增任務空字元或者轉義符
SpeechUtility.createUtility(this, SpeechConstant.APPID +"=12345678");
super.onCreate();
}
}
注意:自定義的APPlication要到清單檔案配置一下.在application的">"內,填上android:name=".APP"6 執行識別語音為文字的的邏輯程式碼.(程式碼放到點選事件裡)
public void Listen(View view) {
//1.建立RecognizerDialog物件,第二個引數就是一個初始化的監聽器,我們用不上就設定為null
RecognizerDialog mDialog = new RecognizerDialog(this, null);
//2.設定accent、language等引數
mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//設定為中文模式
mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//設定普通話模式
//若要將UI控制元件用於語義理解,必須新增以下引數設定,設定之後onResult回撥返回將是語義理解
//mDialog.setParameter("asr_sch", "1");
//mDialog.setParameter("nlp_version", "2.0");
//建立一個裝每次解析資料的容器
stringBuilder = new StringBuilder();
//3.設定回撥介面
mDialog.setListener(new RecognizerDialogListener() {
//識別成功執行,引數recognizerResult 識別的結果,Json格式的字串
//第二引數 b:等於true時會話結束,方法才不會繼續回撥
//一般情況下通過onResult介面多次返回結果,完整識別內容是多次累加的
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
//拿到訊飛是別的結果
String resultString = recognizerResult.getResultString();
//自定義解析bean資料的方法,得到解析資料
String content= parseData(resultString);
System.out.println("訊飛識別的結果 "+resultString);
System.out.println("b引數是什麼 "+b);
}
//識別失敗執行的方法,speechError:錯誤碼
@Override
public void onError(SpeechError speechError) {
}
});
//4.顯示dialog,接收語音輸入
mDialog.show();
}
7 建立Bean類(名字自定義,如果使用本文章全套程式碼,那麼就暫時不要改,牽一髮動全身),以用來存放訊飛語音識別的結果json資料.
public class XFBean {
public ArrayList<WS> ws;
public class WS{
public ArrayList<CW> cw;
}
public class CW{
public String w;
}
}
8 建立解析訊飛識別結果bean資料的方法,使用谷歌的Gson.
private String parseData(String resultString){
//建立gson物件.記得要關聯一下gson.jar包,方可以使用
Gson gson = new Gson();
//引數1 String型別的json資料 引數2.存放json資料對應的bean類
XFBean xfBean = gson.fromJson(resultString, XFBean.class);
//建立集合,用來存放bean類裡的物件
ArrayList<XFBean.WS> ws=xfBean.ws;
//建立一個容器,用來存放從每個集合裡拿到的資料,使用StringBUndle效率高
StringBuilder stringBuilder = new StringBuilder();
for (XFBean.WS w : ws) {
String text= w.cw.get(0).w;
stringBuilder.append(text);
}
//把容器內的資料轉換為字串返回出去
return stringBuilder.toString();
}
9 執行識別語音為文字的的邏輯程式碼(之前的拿到的資料是無法直接使用的bean資料,現在就是解析出來的最終String型別資料)
public void Listen(View view) {
//1.建立RecognizerDialog物件,第二個引數就是一個初始化的監聽器,我們用不上就設定為null
RecognizerDialog mDialog = new RecognizerDialog(this, null);
//2.設定accent、language等引數
mDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//設定為中文模式
mDialog.setParameter(SpeechConstant.ACCENT, "mandarin");//設定普通話模式
//若要將UI控制元件用於語義理解,必須新增以下引數設定,設定之後onResult回撥返回將是語義理解
//mDialog.setParameter("asr_sch", "1");
//mDialog.setParameter("nlp_version", "2.0");
//建立一個裝每次解析資料的容器
stringBuilder = new StringBuilder();
//3.設定回撥介面
mDialog.setListener(new RecognizerDialogListener() {
//識別成功執行,引數recognizerResult 識別的結果,Json格式的字串
//第二引數 b:等於true時會話結束,方法才不會繼續回撥
//一般情況下通過onResult介面多次返回結果,完整識別內容是多次累加的
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
//拿到訊飛是別的結果
String resultString = recognizerResult.getResultString();
System.out.println("訊飛識別的結果 "+resultString);
//自定義解析bean資料的一個方法.用到了Gson,在專案裡關聯一下.
String text = parseData(resultString);
//容器裝解析出來的資料
stringBuilder.append(text);
//對引數2進行判斷,如果為true,代表這個方法不會再回調,就把容器裡的資料轉成字串.拿來使用.
if(b){
String result = stringBuilder.toString();
System.out.println("話說完,最終的結果 : "+ result);
}
}
//識別失敗執行的方法,speechError:錯誤碼
@Override
public void onError(SpeechError speechError) {
}
});
//4.顯示dialog,接收語音輸入
mDialog.show();
}
10 訊飛固定的把文字轉文語音的邏輯程式碼,把String引數傳進去,然後呼叫此方法即可
public void textToVoice(String result){
//1.建立 SpeechSynthesizer 物件, 第二個引數:本地合成時傳 InitListener
SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);
//2.合成引數設定,詳見《MSC Reference Manual》SpeechSynthesizer 類
// 設定發音人(更多線上發音人,使用者可參見 附錄13.2
mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan"); //設定發音人
mTts.setParameter(SpeechConstant.SPEED, "50");//設定語速
mTts.setParameter(SpeechConstant.VOLUME, "80");//設定音量,範圍 0~100
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //設定雲端,這些功能用到了訊飛伺服器,所以要有網路
//設定合成音訊儲存位置(可自定義儲存位置),儲存在“./sdcard/iflytek.pcm”
//儲存在 SD 卡需要在 AndroidManifest.xml 新增寫 SD 卡許可權
//僅支援儲存為 pcm 和 wav 格式,如果不需要儲存合成音訊,註釋該行程式碼
// mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");
// 3.開始合成,第一個引數就是轉換成聲音的文字,自定義,第二個引數就是合成監聽器物件,我們不需要對聲音有什麼特殊處理,就傳null
mTts.startSpeaking(result, null);
}
11 使智慧語音能根據使用者說的話,回答相映的內容,這就需要拿到使用者說話的結果,進行判斷,回答對應的內容,在if(b)中新增
String result = stringBuilder.toString();
//回答物件,在沒有匹配到使用者說的話,預設輸出語句
String anwser="不好意思,年紀大了,耳朵不好,沒有聽清楚";
if(result.contains("你好")){
anwser="你好,我是你的智慧語音助手,很高興為你服務";
}
textToVoice(anwser);
12 語音合成中呼叫textToVoice並傳入你想說的話就可以public void Talk(View view) {
textToVoice("你好");
}
MainActivity佈局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:onClick="Listen"
android:text="語音識別"/>
<Button
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:onClick="Talk"
android:text="語音合成"/>
</LinearLayout>