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();
   }
   
}



  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值