1. 程式人生 > >訊飛語音識別SDK整合 語音識別 語音合成 訊飛英語識別

訊飛語音識別SDK整合 語音識別 語音合成 訊飛英語識別

最近專案集成了訊飛語音識別功能,由此記錄簡單的整合流程

demo效果(logcat)

這裡寫圖片描述

資源下載

1、首先用as建一個model (這個不用介紹)

2、登入訊飛開發者平臺,進入控制檯,建立應用生成appid

1、 建立應用

這裡寫圖片描述

2、生成appid

這裡寫圖片描述

3、下載SDK(非常重要,必須下載,因為每個appid和so和jar一一相對,所以要下載sdk拿到相應的so檔案和jar檔案,使用別人的是不行的哦,除非使用對應的appid)

1、下載SDK;

這裡寫圖片描述

2、新增需要的功能

這裡寫圖片描述

3、sdk文件(libs資料夾下是需要的so庫和jar包,smaple資料夾下是官方demo)

這裡寫圖片描述

4、複製lib資料夾下的so庫和jar包到demo中(so放在libs下記得builder中新增引用)

1、複製so庫和新增依賴
這裡寫圖片描述
2、as中相關配置
這裡寫圖片描述

5、初始化訊飛(新建一個application 在OnCreate()中配置就好)

這裡寫圖片描述
這裡寫圖片描述

6、前期sdk整合工作已經完成,好了,開始愉快的引用了(下面是小木子寫的簡單識別功能,同時能切換英語識別,順便吐槽下自己的英語,著實爛)

1、新增許可權(測試的時候記得給許可權)

  <uses-permission android:name="android.permission.RECORD_AUDIO"
/>
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <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.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

2、acticity中的程式碼:

public class MainActivity extends AppCompatActivity implements InitListener {
    private static final String TAG = "MainActivity";
    // 語音聽寫物件
    private SpeechRecognizer mIat;
    private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
    // 引擎型別
    private String mEngineType = SpeechConstant.TYPE_CLOUD;
    int ret = 0; // 函式呼叫返回值
    private static String LANGUAGE_E = "en_us";
    private static String LANGUAGE_C = "zh_cn";
    private String currLanguage = LANGUAGE_C;
    private TextView text_result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text_result = findViewById(R.id.text_result);
        initDtat();

        findViewById(R.id.start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                startIflySpeechRecognize(LANGUAGE_C);
            }
        });
        findViewById(R.id.language).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (currLanguage.equals(LANGUAGE_C)) {
                    currLanguage = LANGUAGE_E;
                }
            }
        });
    }

    private void initDtat() {
        mIat = SpeechRecognizer.createRecognizer(this, this);
    }


    /**
     * SpeechRecognizer 初始化監聽
     *
     * @param code
     */
    @Override
    public void onInit(int code) {
        Log.d(TAG, "SpeechRecognizer init() code = " + code);
        if (code != ErrorCode.SUCCESS) {
            Log.d(TAG, "初始化失敗,錯誤碼: " + code);
        }
    }

    /**
     * 開始訊飛語音識別
     */
    private void startIflySpeechRecognize(String language) {
        if (null == mIat) {
            // 建立單例失敗,與 21001 錯誤為同樣原因,參考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
            Log.d(TAG, "建立物件失敗,請確認 libmsc.so 放置正確,且有呼叫 createUtility 進行初始化");
            return;
        }
        // 移動資料分析,收集開始聽寫事件
        FlowerCollector.onEvent(this, "iat_recognize");
        mIatResults.clear();
        // 設定引數
        setParam(language);
        // 不顯示聽寫對話方塊
        ret = mIat.startListening(mRecognizerListener);
        if (ret != ErrorCode.SUCCESS)
            Log.d(TAG, "聽寫失敗,錯誤碼:" + ret);
    }

    /**
     * 引數設定
     *
     * @return
     */
    public void setParam(String language) {
        // 清空引數
        mIat.setParameter(SpeechConstant.PARAMS, null);

        // 設定聽寫引擎
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
        // 設定返回結果格式
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");

        if (language.equals("en_us")) {
            // 設定語言
            mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");
            mIat.setParameter(SpeechConstant.ACCENT, null);
            //Log.d(TAG, "設定語言-英文");
        } else {
            // 設定語言
            mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
            // 設定語言區域
            mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
            //Log.d(TAG, "設定語言-中文");
        }

        // 設定語音前端點:靜音超時時間,即使用者多長時間不說話則當做超時處理
        mIat.setParameter(SpeechConstant.VAD_BOS, "8000");

        // 設定語音後端點:後端點靜音檢測時間,即使用者停止說話多長時間內即認為不再輸入, 自動停止錄音
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");

        // 設定標點符號,設定為"0"返回結果無標點,設定為"1"返回結果有標點
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");

        // 設定音訊儲存路徑,儲存音訊格式支援pcm、wav,設定路徑為sd卡請注意WRITE_EXTERNAL_STORAGE許可權
        // 注:AUDIO_FORMAT引數語記需要更新版本才能生效
        mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
        mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/msc/iat.wav");
    }

    /**
     * 聽寫監聽器。
     */
    private RecognizerListener mRecognizerListener = new RecognizerListener() {

        @Override
        public void onBeginOfSpeech() {
            // 此回調錶示:sdk內部錄音機已經準備好了,使用者可以開始語音輸入
            Log.d(TAG, "開始說話");
        }

        @Override
        public void onError(SpeechError error) {
            // Tips:
            // 錯誤碼:10118(您沒有說話),可能是錄音機許可權被禁,需要提示使用者開啟應用的錄音許可權。
            if (error.getErrorCode() == 14002) {
//                Log.d(TAG, error.getPlainDescription(true) + "\n請確認是否已開通翻譯功能");
            } else {
//                Log.d(TAG, error.getPlainDescription(true));
            }
            // TODO 重新開啟語音識別監聽
            startIflySpeechRecognize(currLanguage);
        }

        @Override
        public void onEndOfSpeech() {
            // 此回調錶示:檢測到了語音的尾端點,已經進入識別過程,不再接受語音輸入
            Log.d(TAG, "結束說話");
        }

        @Override
        public void onResult(RecognizerResult results, boolean isLast) {
//            Log.d(TAG, "**********************" + results.getResultString());
            printResult(results);
        }

        @Override
        public void onVolumeChanged(int volume, byte[] data) {
        }

        @Override
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
            // 以下程式碼用於獲取與雲端的會話id,當業務出錯時將會話id提供給技術支援人員,可用於查詢會話日誌,定位出錯原因
            // 若使用本地能力,會話id為null
            if (SpeechEvent.EVENT_SESSION_ID == eventType) {
                String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
//                Log.d(TAG, "session id =" + sid);
            }
            // TODO 重新開啟語音識別監聽
        }
    };

    /**
     * 處理結果
     *
     * @param results
     */
    private void printResult(RecognizerResult results) {
        String text = JsonParser.parseIatResult(results.getResultString());
        String sn = null;
        // 讀取json結果中的sn欄位
        try {
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        mIatResults.put(sn, text);
        StringBuffer resultBuffer = new StringBuffer();
        for (String key : mIatResults.keySet()) {
            resultBuffer.append(mIatResults.get(key));
        }
        String result = resultBuffer.toString();
        text_result.setText(result);
        Log.d(TAG, "結果:" + result);
//        if (mIFlyTTS != null)
//            mIFlyTTS.playText(result);
        // TODO 處理結果 然後重新開啟
        startIflySpeechRecognize(currLanguage);
    }
}

資源下載