主頁 > 移動端開發 > Android 訊飛語音聽寫SDK快速接入(附空指標解決和修改對話框文字方法)

Android 訊飛語音聽寫SDK快速接入(附空指標解決和修改對話框文字方法)

2020-09-11 12:09:53 移動端開發

 

1、賬號準備作業

首先要有一個訊飛的賬號啦,為后面申請APPID、APPKey等東西做準備,順帶一提:訊飛對不同認證型別用戶開

放的SDK的使用次數是有不同的,詳情如下圖,

不同用戶的套餐區別

賬號申請完成后,需要去你自己的控制臺注冊你的應用,同時也可以看到你的應用對應的 APPID 等屬性,開通的功能,呼叫量剩余次數等資訊,

本文介紹的是Android SDK的接入,這是Android SDK的下載地址,可以根據專案的具體需求具體分析,

2、SDK集成準備作業

如果參照官方檔案中或者官方DEMO的做法,需要把對應架構的檔案拷貝到 Android工程的libs目錄下 ,

而官方提供的DEMO中,它只拷貝了armeabi-v7a架構,如下圖所示(我信了它的邪,在我第一次接入時,就因為參考了官方DEMO只匯入了armeabi-v7a架構,導致出了一大堆毛病?)

官方DEMO

為了避免這個坑,我的建議是:把提供的架構都拷貝到工程里,(有特殊設備需求的除外)

然后在build.gradle檔案中,添加SDK的依賴

    implementation files('libs/Msc.jar')

如果將SDK匯入到lib檔案夾后,可能還會有無法識別的錯誤,

可以試下在build.gradle(app)中注釋掉以下的代碼(玄學操作~~),再繼續排查,

//        ndk {
//            //選擇要添加的對應cpu型別的.so庫,
//            abiFilters 'armeabi-v7a', 'armeabi'
//        }

//    sourceSets {
//        main{
//            jniLibs.srcDirs = ['libs']
//        }
//    }

3、在 AndroidManifest.xml 檔案 添加所需權限

靜態添加權限部分,參考了官方檔案的說法,

<!--連接網路權限,用于執行云端語音能力 -->
<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.WRITE_EXTERNAL_STORAGE"/>
<!--外存盤讀權限,構建語法需要用到此權限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--配置權限,用來記錄應用配置資訊 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--手機定位資訊,用來為語意等功能提供定位,提供更精準的服務-->
<!--定位資訊是敏感資訊,可通過Setting.setLocationEnable(false)關閉定位請求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人臉識別,還要添加:攝相頭權限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />

不過,靜態申請了權限,還不夠哦,對于現在的手機,很大部分都已經是Android版本678910的了,應用是需要動態申請權限的,得讓用戶確認同意了,APP才可以使用這些權限,

動態申請權限的方法有很多,也有很多開源的專案,這里就不做介紹了,

4、SDK初始化

SDK初始化建議放在程式入口處(如Application、Activity的onCreate方法),非常簡單,就一行陳述句,

初始化代碼如下:

//將“1234567”替換成您申請的APPID
SpeechUtility.createUtility(context, SpeechConstant.APPID +"=1234567");

注意:SpeechConstant.APPID +"=1234567" 采用的是拼接的方式,所以不可以在“=”與appid之間添加任何空字符或者轉義符,

5、呼叫語音聽寫功能

最重要的來了,前面鋪墊這么久,就是為了能呼叫它的語音聽寫啊,

離線聽寫方式,需要購買且下載特定的離線識別SDK,故這里使用的是在線聽寫,

在線聽寫的SDK,提供了兩種識別方式,分別是帶語音對話框識別和無UI識別,

一.無UI識別

//初始化識別無UI識別物件
//使用SpeechRecognizer物件,可根據回呼訊息自定義界面--自己的語音識別UI
mIat = SpeechRecognizer.createRecognizer(IatDemo.this, mInitListener);

//設定語法ID和 SUBJECT 為空,以免因之前有語法呼叫而設定了此引數;或直接清空所有引數,具體可參考 DEMO 的示例,
mIat.setParameter( SpeechConstant.CLOUD_GRAMMAR, null );
mIat.setParameter( SpeechConstant.SUBJECT, null );
//設定回傳結果格式,目前支持json,xml以及plain 三種格式,其中plain為純聽寫文本內容
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
//此處engineType為“cloud”
mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType );
//設定語音輸入語言,zh_cn為簡體中文
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
//設定結果回傳語言
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
// 設定語音前端點:靜音超時時間,單位ms,即用戶多長時間不說話則當做超時處理
//取值范圍{1000~10000}
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
//設定語音后端點:后端點靜音檢測時間,單位ms,即用戶停止說話多長時間內即認為不再輸入, 
//自動停止錄音,范圍{0~10000}
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
//設定標點符號,設定為"0"回傳結果無標點,設定為"1"回傳結果有標點
mIat.setParameter(SpeechConstant.ASR_PTT,"1");
//開始識別,并設定監聽器
mIat.startListening(mRecogListener);

二.帶語音對話框識別(SDK自帶)

// 初始化聽寫Dialog,如果只使用有UI聽寫功能,無需創建SpeechRecognizer
// 使用UI聽寫功能,請根據sdk檔案目錄下的notice.txt,放置布局檔案和圖片資源
mIatDialog = new RecognizerDialog(IatDemo.this, mInitListener);

//以下為dialog設定聽寫引數
        mIatDialog.setParameter(SpeechConstant.RESULT_TYPE, "json");
        //設定語音輸入語言,zh_cn為簡體中文
        mIatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        //設定結果回傳語言
        mIatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        // 設定語音前端點:靜音超時時間,單位ms,即用戶多長時間不說話則當做超時處理
        //取值范圍{1000~10000}
        mIatDialog.setParameter(SpeechConstant.VAD_BOS, "4500");
        //設定語音后端點:后端點靜音檢測時間,單位ms,即用戶停止說話多長時間內即認為不再輸入,
        //自動停止錄音,范圍{0~10000}
        mIatDialog.setParameter(SpeechConstant.VAD_EOS, "1500");
        //開始識別并設定監聽器
        mIatDialog.setListener(mRecognizerDialogListener);

//開始識別并設定語音UI監聽器
mIatDialog.setListener(mRecognizerDialogListener);
//顯示聽寫對話框,show方法實際是內部呼叫無UI識別方式
mIatDialog.show();

重點來了,也是很多人很困擾的一步,官方檔案的說法是使用這個SDK自帶的語音識別對話框,需要把對應的布局檔案和圖片資源放入工程中,然而,很多人這樣做了之后, mIatDialog.show(); 呼叫了還是會出現空指標的例外,,例如:?

java.lang.NullPointerException
      at com.iflytek.cloud.ui.a.a(Unknown Source)
      at com.iflytek.cloud.ui.RecognizerDialog.setParameter(Unknown Source)
      atcom.example.mediaplayer.activity.SearchActivity.setParam(SearchActivity.java:111)
      at com.example.mediaplayer.activity.SearchActivity.onClick(SearchActivity.java:86)
      at android.view.View.performClick(View.java:4438)
      at android.view.View$PerformClick.run(View.java:18422)
      at android.os.Handler.handleCallback(Handler.java:733)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:136)
      at android.app.ActivityThread.main(ActivityThread.java:5045)
      at java.lang.reflect.Method.invokeNative(Native Method)
      at java.lang.reflect.Method.invoke(Method.java:515)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
      at dalvik.system.NativeStart.main(Native Method)

解決方法,如下:

首先,在asset檔案內,放入所需的資源,注意:asset檔案夾的位置,是要在src/main/ 的下一級,然后在與

asset檔案夾同級的地方創建 jniLibs 檔案夾,把 libs/檔案夾的對應SDK檔案拷貝到 jniLibs 中,如圖:

同時檢查下,SDK初始化的 APPId 有無出錯的可能,

獲取資料

解決了空指標的問題后,接下來呼叫 show 方法,就可以在自定義的監聽器里愉快地獲取到回傳的聽寫資料了

 //創建語音識別UI對話框
 mIatDialog = new RecognizerDialog(getActivity(), searchViewModel.mInitListener);
 
 
 
 	/**
     * 初始化聽寫事件監聽器,
     */
    public InitListener mInitListener = new InitListener() {

        @Override
        public void onInit(int code) {
            if (code != ErrorCode.SUCCESS) {
                //Todo
            }
        }
    };
    /**
     * 聽寫UI監聽器 訊飛
     */
    public RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {

        /**
         * 接收語音聽寫回呼資訊
         * @param recognizerResult 回呼結果
         * @param b 是否翻譯
         */
        @Override
        public void onResult(com.iflytek.cloud.RecognizerResult recognizerResult, boolean b) {
        //回傳的資料
		String data = https://www.cnblogs.com/DMingO/p/recognizerResult.getResultString();
        }
        /**
         * 識別回呼錯誤.
         */
        public void one rror(SpeechError error) {
            if(error.getErrorCode() == 14002) {
               //Todo
            } else {
               //Todo
            }
        }

    };

修改默認對話框的文字

//動態更換了訊飛自帶對話框的底部文字,必須在dialog的show執行后更換,否則空指標報錯
TextView recorderDialogTextView = (TextView)  mIatDialog.getWindow().getDecorView().findViewWithTag("textlink");

recorderDialogTextView.setText(R.string.recorder_dialog_textview_text);

默認文本修改后

回傳的聽寫資料實體,用于創建物體類:

{
    "sn": 1,
    "ls": true,
    "bg": 0,
    "ed": 0,
    "ws": [
        {
            "bg": 0,
            "cw": [
                {
                    "w": "今天",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "的",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "天氣",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": "怎么樣",
                    "sc": 0
                }
            ]
        },
        {
            "bg": 0,
            "cw": [
                {
                    "w": ",",
                    "sc": 0
                }
            ]
        }
    ]
}

注意:若在SDK中開通了 動態修正的功能,回傳的資料會出現格式不一致的情況,官方的說法如下:

動態修正:
  • 未開啟動態修正:實時回傳識別結果,每次回傳的結果都是對之前結果的追加;
  • 開啟動態修正:實時回傳識別結果,每次回傳的結果有可能是對之前結果的的追加,也有可能是要替換之前某次回傳的結果(即修正);
  • 開啟動態修正,相較于未開啟,回傳結果的顆粒度更小,視覺沖擊效果更佳;
  • 使用動態修正功能需到控制臺-流式聽寫-高級功能處點擊開通,并設定相應引數方可使用,引數設定方法:mIat.setParameter(“dwa”, “wpgs”); ;
  • 動態修正功能僅 中文 支持;
  • 未開啟與開啟回傳的結果格式不同,詳見下方;

若開通了動態修正功能并設定了dwa=wpgs(僅中文支持),會有如下欄位回傳:

引數型別描述
pgs string 開啟wpgs會有此欄位 取值為 “apd"時表示該片結果是追加到前面的最終結果;取值為"rpl” 時表示替換前面的部分結果,替換范圍為rg欄位
rg array 替換范圍,開啟wpgs會有此欄位 假設值為[2,5],則代表要替換的是第2次到第5次回傳的結果

PS:一般專案中的語音聽寫需求,完全可以不使用動態修正功能,但若要使用同步顯示語音識別結果或者比較需要比較精準的結果,可以考慮使用此功能,

總結

訊飛語音聽寫SDK,坑點不少,但是都不是很難,還是適專案快速接入語音聽寫需求的,,?

如果要更多操作和功能,請參考訊飛語音聽寫SDK官方檔案

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/5572.html

標籤:Android

上一篇:Android 自定義View—清爽小巧靈活的多節點進度條

下一篇:andorid jar/庫原始碼決議之Bolts

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more