最近在做一个翻译戒指的项目 ,里面有语音识别,然后拿到识别的文字去翻译内容

语音识别,肯定是用讯飞的 ,但是项目的的声音来源不是手机 ,是蓝牙耳机 ,也是第一次接手这样的项目,有点蒙蔽了,去网上找了一圈

这个仁兄的代码,给了很大的帮助

原文地址:http://blog.csdn.net/ec_boy_hl/article/details/45112493

按照他的方向 ,我写了一个demo,来测试,妥妥的 能采集到声音,实现语音识别 ,分享给大家

重点的代码 :

在识别的时候,设置声音来源从蓝牙

mAudioManager.setBluetoothScoOn(true);
mAudioManager.startBluetoothSco();

识别完之后关闭(经测试,不关也可以)

mAudioManager.setBluetoothScoOn(false);
mAudioManager.stopBluetoothSco();

整体代码就不全部贴了 ,下面就是讯飞的官方demo, 加上上面的两段话就OK 了,是不是很简单 ,

相关的权限,注意权限,不然没法使用

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.BROADCAST_STICKY" /><uses-permission android:name="android.permission.BLUETOOTH" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><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" />

主题的代码

package com.iflytek.voicedemo;import java.util.HashMap;
import java.util.LinkedHashMap;import org.json.JSONException;
import org.json.JSONObject;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.media.AudioManager;
import android.os.Bundle;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;import com.iflytek.cloud.ErrorCode;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.LexiconListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;
import com.iflytek.cloud.util.ContactManager;
import com.iflytek.cloud.util.ContactManager.ContactListener;
import com.iflytek.speech.setting.IatSettings;
import com.iflytek.speech.util.ApkInstaller;
import com.iflytek.speech.util.FucUtil;
import com.iflytek.speech.util.JsonParser;
import com.iflytek.sunflower.FlowerCollector;public class IatDemo extends Activity implements OnClickListener {private static String TAG = IatDemo.class.getSimpleName();// 语音听写对象private SpeechRecognizer mIat;// 语音听写UIprivate RecognizerDialog mIatDialog;// 用HashMap存储听写结果private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();private EditText mResultText;private Toast mToast;private SharedPreferences mSharedPreferences;// 引擎类型private String mEngineType = SpeechConstant.TYPE_CLOUD;private boolean mTranslateEnable = false;private BroadcastReceiver receiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context arg0, Intent intent) {String action = intent.getAction();if (action.equals("android.intent.action.VOICE_COMMAND")) {Log.i("main", "======你点击了按钮");}}};@SuppressLint("ShowToast")public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.iatdemo);initReceiver();initLayout();mIat = SpeechRecognizer.createRecognizer(IatDemo.this, mInitListener);mIatDialog = new RecognizerDialog(IatDemo.this, mInitListener);mSharedPreferences = getSharedPreferences(IatSettings.PREFER_NAME,Activity.MODE_PRIVATE);mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);mResultText = ((EditText) findViewById(R.id.iat_text));}private void initReceiver() {IntentFilter filter = new IntentFilter();filter.addAction("android.intent.action.VOICE_COMMAND");registerReceiver(receiver, filter);}/*** 初始化Layout。*/AudioManager mAudioManager;private void initLayout() {mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);findViewById(R.id.iat_recognize).setOnClickListener(IatDemo.this);findViewById(R.id.iat_recognize_stream).setOnClickListener(IatDemo.this);findViewById(R.id.iat_stop).setOnClickListener(IatDemo.this);findViewById(R.id.iat_cancel).setOnClickListener(IatDemo.this);findViewById(R.id.btn_test).setOnClickListener(IatDemo.this);}int ret = 0; // 函数调用返回值@Overridepublic void onClick(View view) {if (null == mIat) {this.showTip("创建对象失败,请确认 libmsc.so 放置正确,且有调用 createUtility 进行初始化");return;}switch (view.getId()) {case R.id.iat_recognize:mAudioManager.setBluetoothScoOn(true);mAudioManager.startBluetoothSco();// 移动数据分析,收集开始听写事件mResultText.setText(null);// 清空显示内容mIatResults.clear();// 设置参数setParam();boolean isShowDialog = mSharedPreferences.getBoolean(getString(R.string.pref_key_iat_show), true);if (isShowDialog) {// 显示听写对话框mIatDialog.setListener(mRecognizerDialogListener);mIatDialog.show();showTip(getString(R.string.text_begin));} else {// 不显示听写对话框ret = mIat.startListening(mRecognizerListener);if (ret != ErrorCode.SUCCESS) {showTip("听写失败,错误码:" + ret);} else {showTip(getString(R.string.text_begin));}}break;case R.id.btn_test:mResultText.setText(null);// 清空显示内容mIatResults.clear();// 设置参数setParam();// 设置音频来源为外部文件// mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");// 也可以像以下这样直接设置音频文件路径识别(要求设置文件在sdcard上的全路径):mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-2");mIat.setParameter(SpeechConstant.ASR_SOURCE_PATH,"sdcard/record.pcm");ret = mIat.startListening(mRecognizerListener);if (ret != ErrorCode.SUCCESS) {showTip("识别失败,错误码:" + ret);} else {byte[] audioData = FucUtil.readAudioFile(IatDemo.this,"iattest.wav");Log.i("main", "====获取的数据流===" + audioData.length);if (null != audioData) {showTip(getString(R.string.text_begin_recognizer));// 一次(也可以分多次)写入音频文件数据,数据格式必须是采样率为8KHz或16KHz(本地识别只支持16K采样率,云端都支持),位长16bit,单声道的wav或者pcm// 写入8KHz采样的音频时,必须先调用setParameter(SpeechConstant.SAMPLE_RATE,// "8000")设置正确的采样率// 注:当音频过长,静音部分时长超过VAD_EOS将导致静音后面部分不能识别。// 音频切分方法:FucUtil.splitBuffer(byte[] buffer,int length,int// spsize);mIat.writeAudio(audioData, 0, audioData.length);mIat.stopListening();} else {mIat.cancel();showTip("读取音频流失败");}}break;// 音频流识别case R.id.iat_recognize_stream:mResultText.setText(null);// 清空显示内容mIatResults.clear();// 设置参数setParam();// 设置音频来源为外部文件mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-1");// 也可以像以下这样直接设置音频文件路径识别(要求设置文件在sdcard上的全路径):// mIat.setParameter(SpeechConstant.AUDIO_SOURCE, "-2");// mIat.setParameter(SpeechConstant.ASR_SOURCE_PATH,// "sdcard/record.pcm");ret = mIat.startListening(mRecognizerListener);if (ret != ErrorCode.SUCCESS) {showTip("识别失败,错误码:" + ret);} else {// byte[] audioData = FucUtil.readAudioFile(IatDemo.this,// "record.wav");byte[] audioData = FucUtil.readSdFile(IatDemo.this);Log.i("main", "====获取的数据流===" + audioData.length);if (null != audioData) {showTip(getString(R.string.text_begin_recognizer));// 一次(也可以分多次)写入音频文件数据,数据格式必须是采样率为8KHz或16KHz(本地识别只支持16K采样率,云端都支持),位长16bit,单声道的wav或者pcm// 写入8KHz采样的音频时,必须先调用setParameter(SpeechConstant.SAMPLE_RATE,// "8000")设置正确的采样率// 注:当音频过长,静音部分时长超过VAD_EOS将导致静音后面部分不能识别。// 音频切分方法:FucUtil.splitBuffer(byte[] buffer,int length,int// spsize);mIat.setParameter(SpeechConstant.VAD_BOS, "4000");mIat.setParameter(SpeechConstant.VAD_EOS, "4000");mIat.setParameter(SpeechConstant.SAMPLE_RATE, "8000");mIat.writeAudio(audioData, 0, audioData.length);mIat.stopListening();} else {mIat.cancel();showTip("读取音频流失败");}}break;// 停止听写case R.id.iat_stop:mIat.stopListening();showTip("停止听写");break;// 取消听写case R.id.iat_cancel:mAudioManager.setBluetoothScoOn(false);mAudioManager.stopBluetoothSco();mIat.cancel();showTip("取消听写");break;default:break;}}/*** 初始化监听器。*/private InitListener mInitListener = new InitListener() {@Overridepublic void onInit(int code) {Log.d(TAG, "SpeechRecognizer init() code = " + code);if (code != ErrorCode.SUCCESS) {showTip("初始化失败,错误码:" + code);}}};/*** 上传联系人/词表监听器。*/private LexiconListener mLexiconListener = new LexiconListener() {@Overridepublic void onLexiconUpdated(String lexiconId, SpeechError error) {if (error != null) {showTip(error.toString());} else {showTip(getString(R.string.text_upload_success));}}};/*** 听写监听器。*/private RecognizerListener mRecognizerListener = new RecognizerListener() {@Overridepublic void onBeginOfSpeech() {// 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入showTip("开始说话");}@Overridepublic void onError(SpeechError error) {// Tips:// 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。// 如果使用本地功能(语记)需要提示用户开启语记的录音权限。if (mTranslateEnable && error.getErrorCode() == 14002) {showTip(error.getPlainDescription(true) + "\n请确认是否已开通翻译功能");} else {showTip(error.getPlainDescription(true));}}@Overridepublic void onEndOfSpeech() {// 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入showTip("结束说话");}@Overridepublic void onResult(RecognizerResult results, boolean isLast) {Log.d(TAG, results.getResultString());if (mTranslateEnable) {printTransResult(results);} else {printResult(results);}if (isLast) {// TODO 最后的结果}}@Overridepublic void onVolumeChanged(int volume, byte[] data) {showTip("当前正在说话,音量大小:" + volume);Log.d(TAG, "返回音频数据:" + 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);// }}};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));}mResultText.setText(resultBuffer.toString());mResultText.setSelection(mResultText.length());}/*** 听写UI监听器*/private RecognizerDialogListener mRecognizerDialogListener = new RecognizerDialogListener() {public void onResult(RecognizerResult results, boolean isLast) {if (mTranslateEnable) {printTransResult(results);} else {printResult(results);}}/*** 识别回调错误.*/public void onError(SpeechError error) {if (mTranslateEnable && error.getErrorCode() == 14002) {showTip(error.getPlainDescription(true) + "\n请确认是否已开通翻译功能");} else {showTip(error.getPlainDescription(true));}}};/*** 获取联系人监听器。*/private ContactListener mContactListener = new ContactListener() {@Overridepublic void onContactQueryFinish(final String contactInfos,boolean changeFlag) {// 注:实际应用中除第一次上传之外,之后应该通过changeFlag判断是否需要上传,否则会造成不必要的流量.// 每当联系人发生变化,该接口都将会被回调,可通过ContactManager.destroy()销毁对象,解除回调。// if(changeFlag) {// 指定引擎类型runOnUiThread(new Runnable() {public void run() {mResultText.setText(contactInfos);}});mIat.setParameter(SpeechConstant.ENGINE_TYPE,SpeechConstant.TYPE_CLOUD);mIat.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8");ret = mIat.updateLexicon("contact", contactInfos, mLexiconListener);if (ret != ErrorCode.SUCCESS) {showTip("上传联系人失败:" + ret);}}};private void showTip(final String str) {mToast.setText(str);mToast.show();}/*** 参数设置* * @param param* @return*/public void setParam() {// 清空参数mIat.setParameter(SpeechConstant.PARAMS, null);// 设置听写引擎mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);// 设置返回结果格式mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");this.mTranslateEnable = mSharedPreferences.getBoolean(this.getString(R.string.pref_key_translate), false);if (mTranslateEnable) {Log.i(TAG, "translate enable");mIat.setParameter(SpeechConstant.ASR_SCH, "1");mIat.setParameter(SpeechConstant.ADD_CAP, "translate");mIat.setParameter(SpeechConstant.TRS_SRC, "its");}String lag = mSharedPreferences.getString("iat_language_preference","mandarin");if (lag.equals("en_us")) {// 设置语言mIat.setParameter(SpeechConstant.LANGUAGE, "en_us");mIat.setParameter(SpeechConstant.ACCENT, null);if (mTranslateEnable) {mIat.setParameter(SpeechConstant.ORI_LANG, "en");mIat.setParameter(SpeechConstant.TRANS_LANG, "cn");}} else {// 设置语言mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");// 设置语言区域mIat.setParameter(SpeechConstant.ACCENT, lag);if (mTranslateEnable) {mIat.setParameter(SpeechConstant.ORI_LANG, "cn");mIat.setParameter(SpeechConstant.TRANS_LANG, "en");}}// 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理mIat.setParameter(SpeechConstant.VAD_BOS,mSharedPreferences.getString("iat_vadbos_preference", "4000"));// 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音mIat.setParameter(SpeechConstant.VAD_EOS,mSharedPreferences.getString("iat_vadeos_preference", "1000"));// 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点mIat.setParameter(SpeechConstant.ASR_PTT,mSharedPreferences.getString("iat_punc_preference", "1"));// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限// 注:AUDIO_FORMAT参数语记需要更新版本才能生效mIat.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH,Environment.getExternalStorageDirectory() + "/msc/iat.wav");}private void printTransResult(RecognizerResult results) {String trans = JsonParser.parseTransResult(results.getResultString(),"dst");String oris = JsonParser.parseTransResult(results.getResultString(),"src");if (TextUtils.isEmpty(trans) || TextUtils.isEmpty(oris)) {showTip("解析结果失败,请确认是否已开通翻译功能。");} else {mResultText.setText("原始语言:\n" + oris + "\n目标语言:\n" + trans);}}@Overrideprotected void onDestroy() {super.onDestroy();if (null != mIat) {mIat.cancel();mIat.destroy();}unregisterReceiver(receiver);}}

蓝牙耳机录音进行讯飞语音识别相关推荐

  1. 腾讯、百度、讯飞 语音识别

    一.腾讯语音识别-一句话语音识别 1.账号申请 (1)搜索腾讯云官网 https://cloud.tencent.com/?fromSource=gwzcw.2212127.2212127.22121 ...

  2. Flutter版讯飞语音识别demo

    xf_demo是根据科大讯飞语音听写的WebAPI编写的Flutter版demo 官方文档地址:https://www.xfyun.cn/doc/asr/voicedictation/API.html ...

  3. 微信小程序前台调用讯飞语音识别接口

    开整 之前我这边微信小程序调用讯飞的接口还是发一段音频到后台 再去连接讯飞的websocket 真的 贼慢 要是两三秒的还好 稍微长一点就GG 最近突然发现微信小程序有PCM格式了 所以就直接用小程序 ...

  4. unity通过WebAPI连接Websocket实现讯飞语音识别与合成。

    下载地址:https://download.csdn.net/download/qq_39735878/12447473 unity写的讯飞语音识别合成与评测功能,走的是webapi,连接讯飞WebS ...

  5. 语音识别技术原理是什么 讯飞语音识别技术特点介绍【详解】

    语音识别技术原理简介 自动语音识别技术(Auto Speech Recognize,简称ASR)所要解决的问题是让计算机能够"听懂"人类的语音,将语音中包含的文字信息"提 ...

  6. python实时语音智能聊天<讯飞语音识别+青云客机器人>

    python基于 讯飞语音识别实现语音智能聊天 GitHub项目链接:https://github.com/superzhangjc/python-Voice_chat.git

  7. 讯飞语音识别配置笔记

    不久前开发过讯飞语音识别和小程序结合的系统,发表了一篇配置记录,有一些同学问一下问题,我再把我但是自己做的另外一篇记录发出来,给需要的同行参考一下.上一篇文章的地址:http://blog.csdn. ...

  8. 讯飞语音识别和唤醒开发示例

    讯飞语音识别和唤醒开发示例 最近需要用到讯飞的语音识别和语音唤醒的功能,就对这方面进行了一下简单研究. 本文帮助大家简单入门,并且提供几个代码示例给大家参考. 讯飞开发者网址:https://www. ...

  9. 讯飞语音识别demo实现

    最近看了看百度语音和讯飞语音识别的实现,吐个槽,他们的官方文档是真的写得垃圾,可能是我技术不到位, 反正我是很难看懂的,不吐槽了,先上实现 讯飞的官方文档 https://doc.xfyun.cn/m ...

最新文章

  1. SQLite第三方框架FMDB的使用,以及使用FMDatabaseQueue保证线程安全
  2. 年度盘点!必看AI顶会论文、Github高星项目大合集(附链接)
  3. K项目的一些心得之全球模板里的几个骚操作
  4. 浅议 JavaScript 的 Promises/Futures 模式
  5. ubuntu16.04下配置caffe无GPU
  6. C++ : 内联函数和引用变量
  7. 邮件发送类,支持Gmail
  8. 二十大数据可视化工具(二)
  9. js深拷贝和浅拷贝对数组的影响_javaScript中的深拷贝和浅拷贝
  10. 计算机如何进行数值计算
  11. PivotGridControl与ChartControl控件结合使用(一)
  12. 楼宇报警器 java程序_智能楼宇防盗报警系统
  13. Delphi取整函数
  14. 互链独家 | 决战区块链金融战场 中国金融机构行动图谱
  15. 孙陶然:有能力的第三个标准是有亮点
  16. 智慧立法平台,以“智慧”赋能立法工作新格局
  17. BAV99的ESD保护作用解析
  18. EOS 智能合约如何调试?
  19. 长安大学计算机专业考研科目,长安大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  20. ./configure的含义

热门文章

  1. 2022 年终奖个税计算方法,看看你被多收割了多少
  2. 辛普森悖论和朴素贝叶斯
  3. 6-2 使用函数输出指定范围内Fibonacci数的个数 (20 分)
  4. python_6_17
  5. Apache 开启和关闭 Keep-Alive 解决访问长连接问题
  6. 全球值得关注的11家人脸识别公司与机构
  7. 家门口的微醺“buff”——酒分之一开启社区酒吧式便利店次元
  8. 查看jenkins端口linux,Jenkins修改端口号(成功率高)
  9. 安检x光机原理计算机实现,安检X光机组成及工作原理(图文)
  10. 计算机专业,真的这么赚钱吗?