1. 程式人生 > >訊飛語音的簡單使用

訊飛語音的簡單使用

使用方法:

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>