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"><EditTextandroid: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" /><Buttonandroid: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或jsonprivate StringBuffer buffer = new StringBuffer(); // 用于存储结果private Toast mToast; // 用于输出提示int ret = 0; // 函数调用返回值SpeechRecognizer mIat; // 语音识别模型private RecognizerDialog mIatDialog; // 语音识别对话框@Overrideprotected 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() {@Overridepublic void onClick(View v) {buffer.setLength(0);mResultText.setText(null);setParam();mIatDialog.setListener(mRecognizerDialogListener);mIatDialog.show();showTip("请开始说话");}});}/*** 初始化监听器。*/private InitListener mInitListener = new InitListener() {@Overridepublic 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() {@Overridepublic 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");}@Overrideprotected void onDestroy() {super.onDestroy();if( null != mIat ){// 退出时释放连接mIat.cancel();mIat.destroy();}}private void showTip(final String str) {mToast.setText(str);mToast.show();}
}