- 首先去讯飞开放平台申请一个账号地址,然后点击右上角的“控制台”进入新的页面,创建一个应用,找到“语音听写”,下载相应的SDK。
解压如下
- 在android studio中新建一个空项目,将libs文件夹中的内容复制到安卓项目的libs文件夹下,其中msc.jar要右键添加Add As Library
- 在AndriodManifest.xml中添加以下权限:
<!--连接网络权限,用于执行云端语音能力 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="Manifest.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"
tools:ignore="ProtectedPermissions" />
<!--手机定位信息,用来为语义等功能提供定位,提供更精准的服务-->
<!--定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--如需使用人脸识别,还要添加:摄像头权限,拍照需要用到 -->
<uses-permission android:name="android.permission.CAMERA" />
- 在app目录下的build.gradle中添加以下代码
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
- 布局文件activity_main.xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_click"
android:text="点击打开讯飞语音识别"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<EditText
android:id="@+id/result"
android:layout_below="@id/btn_click"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="此处显示你所录下的内容"
/>
</LinearLayout>
- 新建一个名为XunFeiCallbackListener的接口
package com.example.myapplication;
import com.iflytek.cloud.RecognizerResult;
public interface XunFeiCallbackListener {
void onFinish(RecognizerResult results);
}
- 新建一个名为XunFeiUtil的类
package com.example.myapplication;
import android.content.Context;
import android.widget.Toast;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
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 XunFeiUtil {
public static String appid = "自己的appid";
public static void initXunFei(Context context){
SpeechUtility.createUtility(context, SpeechConstant.APPID +"="+appid);
}
public static void startVoice(Context context, final XunFeiCallbackListener callbackListener) {
RecognizerDialog dialog = new RecognizerDialog(context,null);
dialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
dialog.setParameter(SpeechConstant.ACCENT, "mandarin");
dialog.setParameter(SpeechConstant.ASR_PTT, "0");
dialog.setListener(new RecognizerDialogListener() {
@Override
public void onResult(RecognizerResult recognizerResult, boolean b) {
callbackListener.onFinish(recognizerResult);
}
@Override
public void onError(SpeechError speechError) {
}
});
dialog.show();
//Toast.makeText(this, "请开始说话", Toast.LENGTH_SHORT).show();
}
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();
}
}
- MainActivity
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.iflytek.cloud.RecognizerResult;
import static com.example.myapplication.XunFeiUtil.parseIatResult;
import static com.example.myapplication.XunFeiUtil.*;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn_click;
private EditText mResultText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initXunFei(this);
btn_click = (Button) findViewById(R.id.btn_click);
mResultText = ((EditText) findViewById(R.id.result));
btn_click.setOnClickListener(this);
}
@Override
public void onClick(View v) {
startVoice(this, new XunFeiCallbackListener() {
@Override
public void onFinish(RecognizerResult results) {
String text = parseIatResult(results.getResultString());
// 自动填写地址
mResultText.append(text);
}
});
}
}
完成后运行项目,会出现语音开启失败,错误码为20006的错误,如下图
出错原因是android系统在非动态申请权限的情况下,默认是把麦克风权限是关闭了的,因此需要打开权限,可以在手机的权限中自己修改权限设置
- 也可以参考动态获取权限
- 或者手动赋予权限如下:
成功后的界面如下:
如果你想去掉Dialog中语音识别能力由讯飞输入法提供去掉这几个字 点击参考链接
如果 讯飞集成 “组件未安装.(错误码:21002)” 点解参考解决链接
- 常用的设置参数
// 清空参数
mIat.setParameter(SpeechConstant.PARAMS, null);
//短信和日常用语:iat (默认) 视频:video 地图:poi 音乐:music
mIat.setParameter(SpeechConstant.DOMAIN, "iat");
// 简体中文:"zh_cn", 美式英文:"en_us"
mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
//普通话:mandarin(默认)
//粤 语:cantonese
//四川话:lmz
//河南话:henanese<span style="font-family: Menlo;"> </span>
mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");
// 设置听写引擎 "cloud", "local","mixed" 在线 本地 混合
//本地的需要本地功能集成
mIat.setParameter(SpeechConstant.ENGINE_TYPE, "cloud");
// 设置返回结果格式 听写会话支持json和plain
mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
//设置是否带标点符号 0表示不带标点,1则表示带标点。
mIat.setParameter(SpeechConstant.ASR_PTT, "0");
//只有设置这个属性为1时,VAD_BOS VAD_EOS才会生效,且RecognizerListener.onVolumeChanged才有音量返回默认:1
mIat.setParameter(SpeechConstant.VAD_ENABLE,"1");
// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理1000~10000
mIat.setParameter(SpeechConstant.VAD_BOS, "5000");
// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音0~10000
mIat.setParameter(SpeechConstant.VAD_EOS, "1800");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
//设置识别会话被中断时(如当前会话未结束就开启了新会话等),
//是否通 过RecognizerListener.onError(com.iflytek.cloud.SpeechError)回调ErrorCode.ERROR_INTERRUPT错误。
//默认false [null,true,false]
mIat.setParameter(SpeechConstant.ASR_INTERRUPT_ERROR,"false");
//音频采样率 8000~16000 默认:16000
mIat.setParameter(SpeechConstant.SAMPLE_RATE,"16000");
//默认:麦克风(1)(MediaRecorder.AudioSource.MIC)
//在写音频流方式(-1)下,应用层通过writeAudio函数送入音频;
//在传文件路径方式(-2)下,SDK通过应用层设置的ASR_SOURCE_PATH值, 直接读取音频文件。目前仅在SpeechRecognizer中支持。
mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");
//保存音频文件的路径 仅支持pcm和wav
mIat.setParameter(SpeechConstant.ASR_SOURCE_PATH, Environment.getExternalStorageDirectory().getAbsolutePath() + "test.wav");