android语音识别接科大讯飞sdk
1.下载科大讯飞语音识别sdk(http://www.xfyun.cn/sdk/dispatcher)选择语音听写SDK(如下图) ,下载前会让你先创建应用,创建应用后会得到一个appid。然后点“立即开通”去开通“语音识别”功能,之后就会跳出“SDK下载”的页面,然后就可以下载了(未注册账号的要先注册一个账号)。
2.如果是android开发选择android如果是ios选择ios平台(如图)
3.将下载好的sdk中的libs里面的msc.jar以及libmsc.so文件复制到自己创建的libs下面 (如图)
4.接下来将Manifest中添加一下权限并且创建appid时包名需要跟自己创建的工程包名保持一致 (例如 com.vice.android)并且在application中设置android:name以及bunid gradle里面配置sourceSets(如下图)
<!--获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--连接网络权限,用于执行云端语音能力 --> <uses-permission android:name="android.permission.INTERNET" />
<!--读取网络信息状态 --> <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.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
5. 具体代码目录结构
6.主要代码如下
package com.voice.android; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.view.Window; /** * 听写设置界面 */ public class IatSettings extends PreferenceActivity implements OnPreferenceChangeListener { public static final String PREFER_NAME = "com.iflytek.setting"; private EditTextPreference mVadbosPreference; private EditTextPreference mVadeosPreference; @SuppressWarnings("deprecation") public void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); getPreferenceManager().setSharedPreferencesName(PREFER_NAME); addPreferencesFromResource(R.xml.iat_setting); mVadbosPreference = (EditTextPreference)findPreference("iat_vadbos_preference"); mVadbosPreference.getEditText().addTextChangedListener(new SettingTextWatcher(IatSettings.this,mVadbosPreference,0,10000)); mVadeosPreference = (EditTextPreference)findPreference("iat_vadeos_preference"); mVadeosPreference.getEditText().addTextChangedListener(new SettingTextWatcher(IatSettings.this,mVadeosPreference,0,10000)); } @Override public boolean onPreferenceChange(Preference preference, Object newValue) { return true; } }
package com.voice.android; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONTokener; /** * Json结果解析类 */ public class JsonParser { 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.voice.android; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; import android.widget.ImageView; 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.ui.RecognizerDialog; import com.iflytek.cloud.ui.RecognizerDialogListener; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.LinkedHashMap; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ private EditText et_name; private ImageView iv_yuyin_button; // 语音识别对象 private SpeechRecognizer mAsr; private Toast mToast; private SharedPreferences mSharedPreferences; // 语音听写UI private RecognizerDialog mIatDialog; private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_name= (EditText) findViewById(R.id.et_name); iv_yuyin_button= (ImageView) findViewById(R.id.iv_yuyin_button); initXfun(); initView(); initListener(); mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.iv_yuyin_button: voiceTurnWords(); break; default: break; } } private void initView(){ mIatDialog = new RecognizerDialog(this, mInitListener); } private void initListener(){ iv_yuyin_button.setOnClickListener(this); } private void initXfun(){ mAsr = SpeechRecognizer.createRecognizer(MainActivity.this, mInitListener); } /** * 初始化监听器。 */ private InitListener mInitListener = new InitListener() { @Override public void onInit(int code) { if (code != ErrorCode.SUCCESS) { showTip("初始化失败,错误码:"+code); } } }; private void showTip(final String str) { runOnUiThread(new Runnable() { @Override public void run() { mToast.setText(str); mToast.show(); } }); } private void voiceTurnWords(){ setParam(); mIatDialog.setListener(mRecognizerDialogListener); mIatDialog.show(); showTip(getString(R.string.text_begin)); } public void setParam() { // 清空参数 mAsr.setParameter(SpeechConstant.PARAMS, null); // 设置听写引擎 mAsr.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); // 设置返回结果格式 mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json"); // 设置语言 mAsr.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); // 设置语言区域 mAsr.setParameter(SpeechConstant.ACCENT, "mandarin"); // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理 mAsr.setParameter(SpeechConstant.VAD_BOS,"4000"); // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音 mAsr.setParameter(SpeechConstant.VAD_EOS, "1000"); // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点 mAsr.setParameter(SpeechConstant.ASR_PTT, "0"); } /** * 听写UI监听器 */ private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() { public void onResult(RecognizerResult results, boolean isLast) { printResult(results); } /** * 识别回调错误. */ public void onError(SpeechError error) { showTip(error.getPlainDescription(true)); } }; private void printResult(RecognizerResult results) { String text = JsonParser.parseIatResult(results.getResultString()); String sn = null; // 读取json结果中的sn字段 try { JSONObject resultJson = new JSONObject(results.getResultString()); sn = resultJson.optString("sn"); } catch (JSONException e) { e.printStackTrace(); } mIatResults.put(sn, text); StringBuffer resultBuffer = new StringBuffer(); for (String key : mIatResults.keySet()) { resultBuffer.append(mIatResults.get(key)); } et_name.setText(resultBuffer.toString()); et_name.setSelection(et_name.length()); } }
package com.voice.android; import java.util.regex.Pattern; import android.content.Context; import android.preference.EditTextPreference; import android.text.Editable; import android.text.TextUtils; import android.text.TextWatcher; import android.widget.Toast; /** * 输入框输入范围控制 */ public class SettingTextWatcher implements TextWatcher { private int editStart ; private int editCount ; private EditTextPreference mEditTextPreference; int minValue;//最小值 int maxValue;//最大值 private Context mContext; public SettingTextWatcher(Context context,EditTextPreference e,int min, int max) { mContext = context; mEditTextPreference = e; minValue = min; maxValue = max; } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { editStart = start; editCount = count; } @Override public void beforeTextChanged(CharSequence s, int start, int count,int after) { } @Override public void afterTextChanged(Editable s) { if (TextUtils.isEmpty(s)) { return; } String content = s.toString(); if (isNumeric(content)) { int num = Integer.parseInt(content); if (num > maxValue || num < minValue) { s.delete(editStart, editStart+editCount); mEditTextPreference.getEditText().setText(s); Toast.makeText(mContext, "超出有效值范围", Toast.LENGTH_SHORT).show(); } }else { s.delete(editStart, editStart+editCount); mEditTextPreference.getEditText().setText(s); Toast.makeText(mContext, "只能输入数字哦", Toast.LENGTH_SHORT).show(); } } /** * 正则表达式-判断是否为数字 */ public static boolean isNumeric(String str){ Pattern pattern = Pattern.compile("[0-9]*"); return pattern.matcher(str).matches(); } };
package com.voice.android; import android.app.Application; import com.iflytek.cloud.Setting; import com.iflytek.cloud.SpeechUtility; public class SpeechApp extends Application { @Override public void onCreate() { // 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null // 如在Application中调用初始化,需要在Mainifest中注册该Applicaiton // 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true" // 参数间使用半角“,”分隔。 // 设置你申请的应用appid,请勿在'='与appid之间添加空格及空转义符 // 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误 SpeechUtility.createUtility(SpeechApp.this, "appid=5a4ae664"); // 以下语句用于设置日志开关(默认开启),设置成false时关闭语音云SDK日志打印 super.onCreate(); } }