1 登錄訊飛平臺,申請賬號,創建一個應用
具體步驟可以百度查找
2 進入“我的應用”,下載相應的SDK文件
選擇語音聽寫(流式版)-> Android MSC
3 打開安卓,新建項目
創建一個EditText和一個Button
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".MainActivity">
<EditText
android:id="@+id/textShow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="what heard will be shown here"
android:text=""
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.344" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SPEAK"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textShow1"
app:layout_constraintVertical_bias="0.284" />
</androidx.constraintlayout.widget.ConstraintLayout>
4 將在官網下載的Android SDK 壓縮包中libs目錄下所有子文件拷貝至Android工程的libs目錄下
5 在安卓項目文件中添加.so文件
在build.gradle(Module:XXX)文件中,在android節點下加入下面的內容(代碼的作用是使得項目找到libs下的libmsc.so文件)
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
比較新的Gradle版本,已經自動實現打包.so文件的功能(在拷貝libs目錄下文件後,配置上面的代碼,即可完成在項目中添加.so文件)
6 右擊libs目錄下的msc.jar文件,選擇Add As Library
7 sdk下文件夾main/assets/,自帶UI頁面(iflytek文件夾)和相關其他服務資源文件(語法文件、音頻示例、詞表),將該文件夾拷貝到項目main目錄下
8 在工程 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" />
<!-- 申請錄音權限,記得在手機設置中的權限管理部分,給app分配錄音權限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
9 編寫java代碼,實現語音聽寫功能
包名這裏就不顯示了
APPID
需要在訊飛平臺“我的應用”界面中尋找
package XXXXXXXX;
import androidx.appcompat.app.AppCompatActivity;
import android.nfc.Tag;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
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;
public class MainActivity extends AppCompatActivity {
private EditText mResultText;
private Button button;
private static String TAG = "speech"; // 輸出log信息
private String engineType = "cloud"; // 語音識別引擎類型
private String resultType = "plain"; // 語音識別結果類型,plain或json
private StringBuffer buffer = new StringBuffer(); // 用於存儲結果
private Toast mToast; // 用於輸出提示
int ret = 0; // 函數調用返回值
SpeechRecognizer mIat; // 語音識別模型
private RecognizerDialog mIatDialog; // 語音識別對話框
@Override
protected void onCreate(Bundle savedInstanceState) {
SpeechUtility.createUtility(this, SpeechConstant.APPID +"=XXX"); // 在訊飛平臺查找
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mResultText = findViewById(R.id.textShow1);
button = findViewById(R.id.button1);
mToast = Toast.makeText(this, "",Toast.LENGTH_SHORT);
// 初始化識別無UI識別對象
// 使用 SpeechRecognizer 對象,即語音識別對話框
mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
// 初始化識別有UI識別對象,即語音識別對話框
mIatDialog = new RecognizerDialog(this, mInitListener);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
buffer.setLength(0);
mResultText.setText(null);
setParam();
mIatDialog.setListener(mRecognizerDialogListener);
mIatDialog.show();
showTip("請開始說話");
}
});
}
/**
* 初始化監聽器。
*/
private InitListener mInitListener = new InitListener() {
@Override
public void onInit(int code) {
Log.d(TAG, "SpeechRecognizer init() code = " + code);
if (code != ErrorCode.SUCCESS) {
showTip("初始化失敗,錯誤碼:" + code+",請點擊網址https://www.xfyun.cn/document/error-code查詢解決方案");
}
}
};
// 語音識別對話框監聽器
private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
//得到識別結果 results, 顯示到界面EditText中
if(resultType.equals("plain")) {
buffer.append(recognizerResult.getResultString());
mResultText.setText(buffer.toString());
mResultText.setSelection(mResultText.length());
}
}
@Override
/**
* 識別回調錯誤.
*/
public void onError(SpeechError error) {
showTip(error.getPlainDescription(true));
}
};
public void setParam() {
mIat.setParameter( SpeechConstant.CLOUD_GRAMMAR, null );
mIat.setParameter( SpeechConstant.SUBJECT, null );
mIat.setParameter(SpeechConstant.RESULT_TYPE, resultType);
mIat.setParameter( SpeechConstant.ENGINE_TYPE, engineType );
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
mIat.setParameter(SpeechConstant.ACCENT, "mandarin");
mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
mIat.setParameter(SpeechConstant.ASR_PTT,"0");
}
@Override
protected void onDestroy() {
super.onDestroy();
if( null != mIat ){
// 退出時釋放連接
mIat.cancel();
mIat.destroy();
}
}
private void showTip(final String str) {
mToast.setText(str);
mToast.show();
}
}