简介:本地讲解的是 科大讯飞开发平台的语音转换功能的集成方法和封装

准备工作:

1、首先申请平台账号,创建我的应用,新增语音服务,获取Appid

2、下载创建的应用的对应SDK,这条很重要,每一个应用会对应一个SDK,用于做区分。

构建项目:

1、首先将需要的组件.jar包和.so文件引入工程,(注:由于CPU型号限制,speechDemo下的libs下的 arm64-v8a文件夹不要粘贴到我的工程,否则会报CPU型号异常而打不开APP,记得将你的其他组件的.so文件分别复制粘贴到 armeabi和armeabi-v7a文件下,否则会报错)

2、其次将下载的SDK的speechDemo中的 assets目录下的所有文件拷贝到我的项目中。注:必须是对应的SDK下的SpeechDemo中的assets文件夹,这个文件夹的内部文件其实也可以说是,区别于其他APP的SDK,内部包括录音Dialog的图片素材等文件

3、复制speechDemo中的相关Util组件到我的项目

下面贴几张图:("设置"界面我将它放在外部了,因为是SDK中提供好的Activity我就不贴代码了)

               

下面是我封装的speechDemo的方法:

package com.android.action.app.iflytek.util;/*** 录音转译功能封装类,用于语音识别和转换文字* * @version 1* @param 2016.10.31 由Sherdon构建* */
public class SpeechService {private Context context;private SpeechRecognizer speechRecognizer;//private String mEngineType;// 转译类型private static String TAG = "SpeechService_";public SpeechService() {};/*** 录音转译功能封装类* * @param mEngineType*            转译模式类型((云端)在线,本地,混合)* */public SpeechService(Context context, String mEngineType) {this.context = context;this.mEngineType = mEngineType;};private RecognizerDialog speechRecognizerDialog;private SharedPreferences mSharedPreferences;/*** 返回语音转换对象,* @return SpeechRecognizer*            返回语音识别器对象,在当前Activity的生命周期中需要用到,进行销毁暂停等操作* */public SpeechRecognizer initIflytek() {// 注册// SpeechUtility.createUtility(context,SpeechConstant.APPID +// "=ab123456");这里替换为你自己的AppidSpeechUtility.createUtility(context, SpeechConstant.APPID+ StringConstants.VoiceAppid);// 使用SpeechRecognizer对象,可根据回调消息自定义界面;speechRecognizer = SpeechRecognizer.createRecognizer(context,mInitListener);// 初始化听写Dialog,如果只使用有UI听写功能,无需创建SpeechRecognizer// 使用UI听写功能,请根据sdk文件目录下的notice.txt,放置布局文件和图片资源speechRecognizerDialog = new RecognizerDialog(context, mInitListener);mSharedPreferences = context.getSharedPreferences(IatSettings.PREFER_NAME, Activity.MODE_PRIVATE);// mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);// et_remark = ((EditText) findViewById(R.id.iat_text));// mInstaller = new ApkInstaller(context);// Activity activity = (Activity) context;return speechRecognizer;}/*** 初始化监听器。*/private InitListener mInitListener = new InitListener() {@Overridepublic void onInit(int code) {Log.d(TAG + "初始化监听器", "SpeechRecognizer init() code = " + code);if (code != ErrorCode.SUCCESS) {Toast.makeText(context, "初始化失败,错误码:" + code, Toast.LENGTH_SHORT).show();}}};// 用HashMap存储听写结果private HashMap<String, String> speechRecognizerResults = new LinkedHashMap<String, String>();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();}speechRecognizerResults.put(sn, text);StringBuffer resultBuffer = new StringBuffer();for (String key : speechRecognizerResults.keySet()) {resultBuffer.append(speechRecognizerResults.get(key));}currentEditText.setText(resultBuffer.toString());currentEditText.setSelection(currentEditText.length());// switch (voiceType) {// case 1:// 今日小结// mEdResult.setText(resultBuffer.toString());// mEdResult.setSelection(mEdResult.length());// break;// case 2:// 补充说明// mEdSuppleExplan.setText(resultBuffer.toString());// mEdSuppleExplan.setSelection(mEdSuppleExplan.length());// break;// }}private EditText currentEditText;// 当前需要赋值的EditText/*** 返回录音文件的路径用于播放* * @param mEngineType*            语音识别模式 云端(在线)、本地、混合,此处传该参数是用于,刷新可能被修改的语音识别模式* @param editText 目标输入框,语音转译后生成文本的目标控件* @return mAudioPath 返回录音文件路径,用于录音文件处理* */public String doIflytek(EditText editText, String mEngineType) {this.mEngineType = mEngineType;this.currentEditText = editText;// 移动数据分析,收集开始听写事件FlowerCollector.onEvent(context, "iat_recognize");editText.setText(null);// 清空显示内容speechRecognizerResults.clear();// 设置参数setParam();boolean isShowDialog = mSharedPreferences.getBoolean(context.getString(R.string.pref_key_iat_show), true);if (isShowDialog) {// 显示听写对话框speechRecognizerDialog.setListener(mRecognizerDialogListener);speechRecognizerDialog.show();// showMessage(context.getString(R.string.text_begin));Toast.makeText(context, context.getString(R.string.text_begin),Toast.LENGTH_SHORT).show();} else {// 不显示听写对话框int ret = speechRecognizer.startListening(mRecognizerListener);if (ret != ErrorCode.SUCCESS) {Toast.makeText(context, "听写失败,错误码:" + ret, Toast.LENGTH_SHORT).show();} else {Toast.makeText(context, context.getString(R.string.text_begin),Toast.LENGTH_SHORT).show();}}return mAudioPath;}private String mAudioPath; // 录音public void setParam() {// 清空参数speechRecognizer.setParameter(SpeechConstant.PARAMS, null);// 设置听写引擎speechRecognizer.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);// 设置返回结果格式speechRecognizer.setParameter(SpeechConstant.RESULT_TYPE, "json");String lag = mSharedPreferences.getString("iat_language_preference","mandarin");if (lag.equals("en_us")) {// 设置语言speechRecognizer.setParameter(SpeechConstant.LANGUAGE, "en_us");} else {// 设置语言speechRecognizer.setParameter(SpeechConstant.LANGUAGE, "zh_cn");// 设置语言区域speechRecognizer.setParameter(SpeechConstant.ACCENT, lag);}// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理speechRecognizer.setParameter(SpeechConstant.VAD_BOS,mSharedPreferences.getString("iat_vadbos_preference", "4000"));// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音speechRecognizer.setParameter(SpeechConstant.VAD_EOS,mSharedPreferences.getString("iat_vadeos_preference", "1800"));// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点speechRecognizer.setParameter(SpeechConstant.ASR_PTT,mSharedPreferences.getString("iat_punc_preference", "1"));// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限// 注:AUDIO_FORMAT参数语记需要更新版本才能生效speechRecognizer.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");// mAudioPath = Environment.getExternalStorageDirectory()// + "/ydsanbu/msc/" + DateUtil.getCurrentTime() + ".wav";mAudioPath = context.getExternalFilesDir(null) + File.separator+ "logReport.wav";speechRecognizer.setParameter(SpeechConstant.ASR_AUDIO_PATH, mAudioPath);}/*** 听写监听器。*/private RecognizerListener mRecognizerListener = new RecognizerListener() {@Overridepublic void onBeginOfSpeech() {// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入Toast.makeText(context, "开始说话", Toast.LENGTH_SHORT).show();}@Overridepublic void onError(SpeechError error) {// Tips:// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。Toast.makeText(context, error.getPlainDescription(true),Toast.LENGTH_SHORT).show();}@Overridepublic void onEndOfSpeech() {// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入Toast.makeText(context, "结束说话", Toast.LENGTH_SHORT).show();}@Overridepublic void onResult(RecognizerResult results, boolean isLast) {Log.d(TAG + "onResult", results.getResultString());printResult(results);if (isLast) {// TODO 最后的结果// File file=new File(mAudioPath);// if(file!=null){// // mAudioPath = pVisitVO.getOpinionAudio();// int time = Util.getSeconds(mAudioPath);// rl_audio.setVisibility(View.VISIBLE);// tv_audio.setCompoundDrawablesWithIntrinsicBounds(// R.drawable.chatto_voice_playing, 0, 0, 0);// tv_audio.setCompoundDrawablePadding(5);// tv_audio.setText(String.valueOf(time));// tv_audio.setGravity(Gravity.CENTER_VERTICAL);// }}}@Overridepublic void onVolumeChanged(int volume, byte[] data) {// showMessage("当前正在说话,音量大小:" + volume);Log.d(TAG + "onVolumeChanged", "返回音频数据:" + data.length);}@Overridepublic void onEvent(int eventType, int arg1, int arg2, Bundle obj) {// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因// 若使用本地能力,会话id为null// if (SpeechEvent.EVENT_SESSION_ID == eventType) {// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);// Log.d(TAG, "session id =" + sid);// }}};/*** 听写UI监听器*/private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {public void onResult(RecognizerResult results, boolean isLast) {printResult(results);if (isLast) {// TODO 最后的结果// File file=new File(mAudioPath);// if(file!=null){// // mAudioPath = pVisitVO.getOpinionAudio();// int time = Util.getSeconds(mAudioPath);// rl_audio.setVisibility(View.VISIBLE);// tv_audio.setCompoundDrawablesWithIntrinsicBounds(// R.drawable.chatto_voice_playing, 0, 0, 0);// tv_audio.setCompoundDrawablePadding(5);// tv_audio.setText(String.valueOf(time));// tv_audio.setGravity(Gravity.CENTER_VERTICAL);// }}}/*** 识别回调错误.*/public void onError(SpeechError error) {Toast.makeText(context, error.getPlainDescription(true),Toast.LENGTH_SHORT).show();}};
}

以下是Activity的调用:

package com.android.action.app.activity.page.vspharmacy;@SuppressLint("NewApi")
public class SalesActiveActivity extends BaseActivity implementsOnLongClickListener {private final String TAG = "SalesActiveActivity";/**private String mAbnormalAudio; // 录音private EditText et_remark;private TextView m_tv_word; // 剩余字数
 private TextView title; //private int m_total_count = 200; // 默认最长输入200个字符@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.abnormal_layout);// 获取上个界面传递过来的数据parseIntent();initViews();initListeners();initData();initIflytek();}private String mEngineType = SpeechConstant.TYPE_CLOUD;private SpeechRecognizer sRecognizer;// 语记安装助手类,用于语音模式切换,切换本地或者混合模式时,提示安装语记,来部署本地环境ApkInstaller mInstaller;private void initIflytek() {// TODO Auto-generated method stubmInstaller = new ApkInstaller(SalesActiveActivity.this);speechService = new SpeechService(SalesActiveActivity.this, mEngineType);//这就是我的语音转换初始化和事件的封装类sRecognizer = speechService.initIflytek();//语音识别器,OnDestroy(),和OnResume()事件中需要用到}// private String SignType;// 签到类型private void parseIntent() {}private RelativeLayout rl_audio_layout;private void initViews() {title = (TextView) findViewById(R.id.title);title.setText("促销活动");rl_audio_layout = (RelativeLayout) findViewById(R.id.rl_audio_layout);
//       rl_audio_layout.setVisibility(View.GONE);//影藏布局mBtnBack = (ImageView) findViewById(R.id.iv_back);btn_submit = (Button) findViewById(R.id.btn_submit);et_remark = (EditText) findViewById(R.id.etxt_abnormal_remark);btn_audio = (Button) findViewById(R.id.btn_abnormal_audio);rl_audio = (RelativeLayout) findViewById(R.id.rl_abnormal_audio_del);m_tv_word = (TextView) findViewById(R.id.tv_rest_word);}private void initListeners() {mBtnBack.setOnClickListener(listener);btn_audio.setOnClickListener(listener);btn_audio.setOnLongClickListener(this);//长按按钮进入语音模式选择界面btn_submit.setOnClickListener(listener);et_remark.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {}@Overridepublic void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {}@Overridepublic void afterTextChanged(Editable editable) {m_tv_word.setText(String.valueOf(m_total_count- editable.toString().length()));}});}private SpeechService speechService;private void initData() {}private OnClickListener listener = new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent;switch (v.getId()) {case R.id.btn_abnormal_audio:speechService.doIflytek(et_remark, mEngineType);//这里来触发语音识别事件break;//此方法我返回了录音文件路径,可作为扩展的语音播放功能的文件来源case R.id.iv_back:SalesActiveActivity.this.finish();break;}}};@SuppressLint("NewApi")@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {switch (requestCode) {case REQUEST_CODE_VOICE_MODE:int datas = data.getIntExtra("VoiceMode", -1);switch (datas) {case 0:mEngineType = SpeechConstant.TYPE_CLOUD;//在线模式break;case 1:mEngineType = SpeechConstant.TYPE_LOCAL;//本地模式if (!SpeechUtility.getUtility().checkServiceInstalled()) {mInstaller.install();} else {String result = FucUtil.checkLocalResource();if (!TextUtils.isEmpty(result)) {showMessage(result);}}break;case 2:mEngineType = SpeechConstant.TYPE_MIX;//混合模式if (!SpeechUtility.getUtility().checkServiceInstalled()) {mInstaller.install();} else {String result = FucUtil.checkLocalResource();if (!TextUtils.isEmpty(result)) {showMessage(result);}}break;}break;}}}@Overridepublic void finish() {// TODO Auto-generated method stubsuper.finishWithAnimation(R.anim.start_activity_out2,R.anim.finish_activity_out2);}@Overrideprotected void onDestroy() {super.onDestroy();// 退出时释放连接sRecognizer.cancel();sRecognizer.destroy();}@Overrideprotected void onResume() {// 开放统计 移动数据统计分析FlowerCollector.onResume(SalesActiveActivity.this);FlowerCollector.onPageStart(TAG);super.onResume();}@Overrideprotected void onPause() {// 开放统计 移动数据统计分析FlowerCollector.onPageEnd(TAG);FlowerCollector.onPause(SalesActiveActivity.this);super.onPause();}@Overridepublic boolean onLongClick(View v) {//我把设置语音识别模式放到外部,做了一个单独的activity// TODO Auto-generated method stubIntent intent = new Intent(SalesActiveActivity.this,VoiceModeActivity.class);int mode = -1;if (mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {mode = 0;}if (mEngineType.equals(SpeechConstant.TYPE_LOCAL)) {mode = 1;}if (mEngineType.equals(SpeechConstant.TYPE_MIX)) {mode = 2;}intent.putExtra("VoiceMode", mode);startActivityForResult(intent, REQUEST_CODE_VOICE_MODE);return false;}private final int REQUEST_CODE_VOICE_MODE = 10;
}

再把语音模式设置activity代码贴上:

package com.android.action.app.iflytek.setting;import android.content.Intent;import android.content.pm.PackageInfo;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;import com.android.ydsanbu.app.R;
import com.android.ydsanbu.app.activity.BaseActivity;
import com.android.ydsanbu.app.iflytek.setting.IatSettings;public class VoiceModeActivity extends BaseActivity implements OnClickListener,OnCheckedChangeListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setView();initView();initData();initListener();}private LinearLayout lltt;private ImageView iv_back;private TextView tv_tt;private void setView() {// TODO Auto-generated method stubsetContentView(R.layout.activity_voice_mode);lltt = (LinearLayout) findViewById(R.id.ll_tittle);iv_back = (ImageView) lltt.findViewById(R.id.iv_tittle_back);tv_tt = (TextView) lltt.findViewById(R.id.tv_title_text);tv_tt.setText("语音模式选择");}private RadioGroup rd_group;private void initView() {// TODO Auto-generated method stubrd_group = (RadioGroup) findViewById(R.id.radioGroup);rd_cloud = (RadioButton) findViewById(R.id.iatRadioCloud);rd_local = (RadioButton) findViewById(R.id.iatRadioLocal);rd_mix = (RadioButton) findViewById(R.id.iatRadioMix);}private int mode;private RadioButton rd_cloud;private RadioButton rd_local;private RadioButton rd_mix;private void initData() {mode = getIntent().getIntExtra("VoiceMode", 0);switch (mode) {case 0:rd_cloud.setChecked(true);break;case 1:rd_local.setChecked(true);break;case 2:rd_mix.setChecked(true);break;default:break;}}private void initListener() {// TODO Auto-generated method stubiv_back.setOnClickListener(this);rd_group.setOnCheckedChangeListener(this);}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.iv_tittle_back:Intent intent = new Intent();intent.putExtra("VoiceMode", checkedId);setResult(RESULT_OK, intent);onBackPressed();break;default:break;}}private int checkedId;// 语音模式@Overridepublic void onCheckedChanged(RadioGroup group, int checkedId) {// TODO Auto-generated method stubswitch (checkedId) {case R.id.iatRadioCloud://在线模式this.checkedId = 0;break;case R.id.iatRadioLocal://本地模式this.checkedId = 1;break;case R.id.iatRadioMix://混合模式this.checkedId = 2;break;}Intent intent = new Intent();intent.putExtra("VoiceMode", this.checkedId);setResult(RESULT_OK, intent);onBackPressed();}
}

android 语音转换文字(科大讯飞SDK简易封装)相关推荐

  1. 语音转换文字工具,怎么将语音转换成文字

    我们有时候懒得打字的时候,就会用语音来代替打字.那么我们如果想把我们说的一段语音以文字 的形式给保存下来,我们该如何做呢?下面给大家介绍一个可以将语音转换成文字的工具,我们可 以用它来实现语音转换成文 ...

  2. 使用腾讯云实现录音语音转换文字简单DEMO

    使用腾讯云实现录音语音转换文字简单DEMO 感谢 对接腾讯云 新建springboot项目 创建一个接口(VoiceService) 创建controller层(VoiceController) 加入 ...

  3. 语音转换文字的软件怎么使用

    语音转换文字的软件怎么使用?这个问题问的好,语音转换文字的软件其实有很多种的,如果让小编来为大家讲解怎么使用这个软件的话,那就拿迅捷文字转语音软件为例吧,这个软件里也可以将语音转换成为文字,那么下面就 ...

  4. iOS 语音播放文字内容--制作简易听书软件(AVSpeechSynthesizer)

    iOS 语音播放文字内容--制作简易听书软件(AVSpeechSynthesizer) 字数46 阅读731 评论8 喜欢50 Collection/Bookmark/Share for width ...

  5. android语音输入文字,盘点好用的语音输入APP,懒得打字的时候就说话吧!

    原标题:盘点好用的语音输入APP,懒得打字的时候就说话吧! 本文为「智活范」原创作品,欢迎关注我们! 上次推完好用的录音APP后,立刻就有萌友来问了,能不能直接录音转文字呢,这样说话就能生成文字,多省 ...

  6. Android Studio中配置科大讯飞SDK

    1.将科大讯飞SDK文件夹中的Mac.jar包拷入到工程中的libs目录下,Android Studio将视图切换至Project下即可看到.       2.将jar包与模块关联,可通过以下两种方式 ...

  7. 录音文件/音频实现mp3等文件语音转换文字txt文档提取文字精准高效识别

    音频录音文件实现语音转换识别文字最后文档输出结果 实现对mp3等录音文件进行语音识别成文字,最终获取文档格式或者其它定义格式文件,也可以进行提取数据处理逻辑,轻松实现大文件的语音文字转换功能,精准高效 ...

  8. Android语音转文字STT(通过第三方程序实现)

    通过第三方程序实现语音转文字功能,如讯飞语音等 首先先检测系统中是否存在支持语音识别功能,如果存在直接启动语音识别,若不存在则引导用户通过应用商店下载讯飞语音助手. 代码如下: /*** 语音助手辅助 ...

  9. 华为手机在线将语音转换文字的办公黑科技便签,轻松提高你的工作效率

    华为是常见的手机品牌,华为手机质量好.耐用,深受职场人士的喜欢.很多人为了办公方便,在华为手机上安装了一些工具软件,从不同维度来满足职场上的效率需求.那么在华为手机上如何将语音转文字呢?有没有音转文的 ...

最新文章

  1. vue3启动项目时,自动打开浏览器怎么配置?
  2. 皮一皮:手机?橡皮?傻傻分不清...
  3. Java调用C++webservice接口
  4. 14.vue路由脚手架
  5. Oracle坏块处理常用SQL
  6. JVM 虚拟机类加载过程和双亲委派机制
  7. 查看华为应用商店APPID
  8. eclipse基本操作
  9. (原创)日志处理(修改)
  10. Proteus内部编程仿真STM32(附程序)
  11. 基于知识图谱的问答系统简单流程理解(开放型知识图谱、实体类型较多的图谱)
  12. python字符串怎么定义_Python 字符串定义
  13. 4.树和二叉树——数据结构 (严蔚敏C语言版)
  14. Java使用对象使用属性过滤集合对象重复数据
  15. 华为手机忘记密码如何解开,有什么相关教程吗
  16. okcc中FXS网关老掉注册要怎么解决?
  17. JavaScript 设计模式之发布-订阅模式(上)
  18. 你知道如何用 Git 来统计代码吗?
  19. CTF解题技能之图片分析(一)
  20. 天下布魔服务器维护,2017年4月20日服务器停机维护公告

热门文章

  1. 神兽保佑 码无BUG
  2. 2020.10.17--PS--淌泪表情、翻白眼、摇晃脑袋
  3. 2022年最新版Android安卓面试题+答案精选(每日20题,持续更新中)【一】
  4. 速卖通产品编辑中使用html,速卖通新手注意了,教你怎么上传产品
  5. linux-shell脚本-利用shell函数计算两数之和--思考return原理
  6. NPOI读取Excel设置单元格格式为数值不生效问题
  7. 深入Android系统(七)Zygote进程
  8. mac OS 10.15 catalina内录声音同时使用quicktime录屏教程
  9. 40 - xml文档与字典之间的互相转换
  10. 两种方式设置SVN提交代码时必须填写日志