訊飛SDK的使用

 

在配置好Android Studio 2.3.3後,依照結合網上例子,動手建立訊飛語言聽寫app,最終手機上運行成功。前端

主要參考兩篇博文(zqHero/XunFeiVoiceDEmo ,Android Studio 2.3.3 接入訊飛語音接口),都很是好,基本步驟參考第一篇,代碼參考第二篇。java

  1. 建立訊飛應用:在訊飛開發平臺註冊帳號,在網站上建立應用,獲得一個APPID,這個ID用來綁定訊飛SDK和本身製做的APPandroid

  2. 建立SDK:選擇所需服務(如語言聽寫)、平臺(Android)、和應用(第一步建立的應用),而後下載該SDK。SDK主要有三個文件夾,/assets,/libs,/sample.git

  3. 建立android Studio項目:新建項目,修改項目名(如VoiceDemo)後其他都爲默認,建立一個helloworld項目,文件瀏覽方式默認爲Android,改成Project方式。github

  4. 複製.jar文件:將SDK中/libs文件夾中的.jar文件都複製到android項目VoiceDemo/app/libs/文件夾下。可能因爲生成SDK時只選擇語言聽寫,只有兩個.jar文件(分別爲Msc.jar,Sunflower.jar)編程

  5. 複製.so文件:先在android項目VoiceDemo/app/src/main/下新建文件夾/jniLibs,將SDK中/libs下的包含.so文件夾所有複製到VoiceDemo/app/src/main/jniLibs/文件夾下。總共七個文件夾分別是/arm64-v8a,/armeabi,/armeabi-v7a,/mips,/mips64,/x86,/86_64,每一個文件夾下都只有一個名爲libmsc.so的文件json

  6. 複製/assets文件夾:將SDK中/assets文件夾複製到VoiceDemo/app/src/main/後端

  7. 刷新.gradle文件:選中VoiceDemo/app下的build.gradle,右鍵選擇Synchronize 'build.gradle',依次刷新其它兩個.gradle文件。工具欄中也有Synch Project with Gradle Files*可能達到一樣效果。在這一步中.gradle中沒有出現文章二中的代碼,我也沒有手動添加,但好像影響不大。初次接觸Android編程,不懂原理,但願熱心人解答。網絡

  8. 編輯權限:在*VoiceDemo/app/src/main/AndroidManifest.xml文件中依照第二篇文章代碼添加相應權限;app

  9. 編輯佈局:在*VoiceDemo/app/src/main/res/layout/activity_main.xml文件中依照第二篇文章添加按鈕和文本框

  10. 編輯功能:在*VoiceDemo/app/src/main/java/example.org.voicedemo/MainActivity.java文件中依照第二篇文章添加給按鈕添加功能,將在訊飛平臺建立獲得的APPID添加進去。在這一步時import com.iflytek包所有顯示有紅色下劃線,提示找不到com.iflytek。我將項目關閉後從新打開紅色下劃線就不存在了。這個bug出現的很奇怪,解決的也很奇怪。但願有熱心人解答。

  11. Run app:選擇在模擬其中運行,可以顯示主頁面佈局,點擊按鈕錄音時提示權限不對,但卻沒有贊成權限的選擇彈出。選擇在手機中安裝運行,報錯-26.

  12. 打包生成APK:在Build工具選項下選擇Build APK將生成的APK拷貝到手機中安裝,贊成相應權限後,語音聽寫功能正常運行。如第二篇文章。

項目文件的代碼:

AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="example.org.voicedemo">

   <application
       android:allowBackup="true"
       android:icon="@mipmap/ic_launcher"
       android:label="@string/app_name"
       android:roundIcon="@mipmap/ic_launcher_round"
       android:supportsRtl="true"
       android:theme="@style/AppTheme">
       <activity android:name=".MainActivity">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>

   <uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.RECORD_AUDIO" />
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
   <!--讀取網絡信息狀態 -->
   <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.WRITE_SETTINGS" />


</manifest>

 

activity_main.xml


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context="example.org.voicedemo.MainActivity">

   <TextView
       android:id="@+id/textView"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Hello World!"
       tools:layout_constraintTop_creator="1"
       tools:layout_constraintRight_creator="1"
       tools:layout_constraintBottom_creator="1"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintRight_toRightOf="parent"
       tools:layout_constraintLeft_creator="1"
       app:layout_constraintLeft_toLeftOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

   <Button
       android:id="@+id/button"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Button"
       tools:layout_constraintTop_creator="1"
       tools:layout_constraintRight_creator="1"
       app:layout_constraintRight_toRightOf="parent"
       android:layout_marginTop="20dp"
       app:layout_constraintTop_toBottomOf="@+id/textView"
       tools:layout_constraintLeft_creator="1"
       app:layout_constraintLeft_toLeftOf="parent" />



</android.support.constraint.ConstraintLayout>

 

MainActivity.java


package example.org.voicedemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONTokener;

public class MainActivity extends AppCompatActivity {

   private SpeechRecognizer mIat;
   private RecognizerDialog mIatDialog;
   private RecognizerDialogListener mRListener;

   private Button button;
   private TextView tv;
   private String result;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       SpeechUtility.createUtility(MainActivity.this, SpeechConstant.APPID +"=59f05070");  //=後面這裏要替換成本身申請的 AppID

       mRListener = new RecognizerDialogListener() {
           @Override
           public void onResult(RecognizerResult results, boolean isLast) {
               String text = parseIatResult(results.getResultString());
               result += text;
               tv.setText(result);
               if (isLast) {

                   result = "";
              }
          }

           @Override
           public void onError(SpeechError speechError) {

          }
      };
       mIatDialog = new RecognizerDialog(MainActivity.this, null);
       mIatDialog.setListener(mRListener);

       button = (Button)findViewById(R.id.button);
       tv = (TextView)findViewById(R.id.textView);

       button.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               setIatParam("zph");
               mIatDialog.show();
          }
      });
  }

   private void setIatParam(String filename) {
       // 清空參數
       mIatDialog.setParameter(SpeechConstant.PARAMS, null);

       // 設置聽寫引擎
       mIatDialog.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);

       // 設置返回結果格式
       mIatDialog.setParameter(SpeechConstant.RESULT_TYPE, "json");

       // 設置語言
       mIatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
       // 設置語言區域
       mIatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");

       // 設置語音前端點:靜音超時時間,即用戶多長時間不說話則當作超時處理
       mIatDialog.setParameter(SpeechConstant.VAD_BOS, "4000");

       // 設置語音後端點:後端點靜音檢測時間,即用戶中止說話多長時間內即認爲再也不輸入, 自動中止錄音
       mIatDialog.setParameter(SpeechConstant.VAD_EOS, "2000");

       // 設置標點符號,設置爲"0"返回結果無標點,設置爲"1"返回結果有標點
       mIatDialog.setParameter(SpeechConstant.ASR_PTT, "1");

       // 設置音頻保存路徑,保存音頻格式支持pcm、wav,設置路徑爲sd卡請注意WRITE_EXTERNAL_STORAGE權限
       // 注:AUDIO_FORMAT參數語記須要更新版本才能生效
       mIatDialog.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
       mIatDialog.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory() + "/MyApplication/" + filename + ".wav");
  }

   public static String parseIatResult(String json) {
       StringBuffer ret = new StringBuffer();
       try {
           JSONTokener tokener = new JSONTokener(json);
           JSONObject joResult = new JSONObject(tokener);

           JSONArray words = joResult.getJSONArray("ws");
           for (int i = 0; i < words.length(); i++) {
               // 轉寫結果詞,默認使用第一個結果
               JSONArray items = words.getJSONObject(i).getJSONArray("cw");
               JSONObject obj = items.getJSONObject(0);
               ret.append(obj.getString("w"));
          }
      } catch (Exception e) {
           e.printStackTrace();
      }
       return ret.toString();
  }
}

 

Github項目地址: https://github.com/danieltangdx/xunFeiVoiceDeom

email:danieltangdx@outlook.com

相關文章
相關標籤/搜索