sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
package com.example.myapplication;
import com.iflytek.cloud.RecognizerResult;
public interface XunFeiCallbackListener {
void onFinish(RecognizerResult results);
}
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();
}
}
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系统在非动态申请权限的情况下,默认是把麦克风权限是关闭了的,因此需要打开权限,可以在手机的权限中自己修改权限设置
成功后的界面如下:
// 清空参数
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
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");