android上使用蓝牙设备进行语音输入

主要实现步骤如下:
1.确保已经和蓝牙耳机配对连接上。
2.开启蓝牙信道
AudioManager mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setBluetoothScoOn(true);
mAudioManager.startBluetoothSco();
3.开启语音识别
4.退出时关闭蓝牙信道
mAudioManager.setBluetoothScoOn(false);
mAudioManager.stopBluetoothSco();
5.额外需要添加的权限:
<uses-permission android:name="android.permission.BROADCAST_STICKY" />  注:部分手机如无此权限会报错
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

以上方法到android5.0以上可能无用

提供另外一种方法

  1. package com.example.dkdh.testrecord;
  2. import android.app.Activity;
  3. import android.bluetooth.BluetoothAdapter;
  4. import android.bluetooth.BluetoothDevice;
  5. import android.bluetooth.BluetoothHeadset;
  6. import android.bluetooth.BluetoothProfile;
  7. import android.content.BroadcastReceiver;
  8. import android.content.Context;
  9. import android.content.Intent;
  10. import android.content.IntentFilter;
  11. import android.media.AudioManager;
  12. import android.media.MediaPlayer;
  13. import android.media.MediaRecorder;
  14. import android.os.Bundle;
  15. import android.os.Environment;
  16. import android.util.Log;
  17. import android.view.View;
  18. import android.widget.Button;
  19. import android.widget.TextView;
  20. import android.widget.Toast;
  21. import com.example.dkdh.testrecord.util.FucUtil;
  22. import com.example.dkdh.testrecord.util.JsonParser;
  23. import com.iflytek.cloud.InitListener;
  24. import com.iflytek.cloud.RecognizerListener;
  25. import com.iflytek.cloud.RecognizerResult;
  26. import com.iflytek.cloud.SpeechConstant;
  27. import com.iflytek.cloud.SpeechError;
  28. import com.iflytek.cloud.SpeechRecognizer;
  29. import com.iflytek.cloud.SpeechUtility;
  30. import com.iflytek.cloud.ErrorCode;
  31. import java.io.IOException;
  32. import java.util.HashMap;
  33. import java.util.LinkedHashMap;
  34. import java.util.List;
  35. public class MainActivity extends Activity implements View.OnClickListener{
  36. private final String TAG = MainActivity.class.getSimpleName();
  37. private final String XF_APP_ID = "xxxxxx";
  38. BluetoothHeadset headset;
  39. private Button start,stop;
  40. private TextView result;
  41. private AudioManager mAudioManager = null;
  42. private BluetoothHeadset mBluetoothHeadset;
  43. private BluetoothAdapter mBluetoothAdapter;
  44. private BluetoothDevice mBluetoothDevice;
  45. private SpeechRecognizer mIat;
  46. //    // 语音听写UI
  47. //    private RecognizerDialog mIatDialog;
  48. //    // 用HashMap存储听写结果
  49. private HashMap<String, String> mIatResults = new LinkedHashMap<String, String>();
  50. @Override
  51. protected void onCreate(Bundle savedInstanceState) {
  52. super.onCreate(savedInstanceState);
  53. setContentView(R.layout.activity_main);
  54. SpeechUtility.createUtility(this, SpeechConstant.APPID + "=" + XF_APP_ID);
  55. result = (TextView)findViewById(R.id.result);
  56. start = (Button)findViewById(R.id.startRec);
  57. stop = (Button)findViewById(R.id.stopRec);
  58. start.setOnClickListener(this);
  59. stop.setOnClickListener(this);
  60. mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
  61. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
  62. mBluetoothAdapter.getProfileProxy(this, mProfileListener, BluetoothProfile.HEADSET);
  63. //        // 初始化识别无UI识别对象
  64. //        // 使用SpeechRecognizer对象,可根据回调消息自定义界面;第二个参数:本地识别时传mInitListener
  65. mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
  66. }
  67. private BluetoothProfile.ServiceListener mProfileListener = new BluetoothProfile.ServiceListener(){
  68. @Override
  69. public void onServiceConnected(int profile, BluetoothProfile proxy) {
  70. if (profile == BluetoothProfile.HEADSET){
  71. mBluetoothHeadset = (BluetoothHeadset) proxy;
  72. List<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
  73. if (devices.size()>0){
  74. mBluetoothDevice = devices.get(0);
  75. int state = mBluetoothHeadset.getConnectionState(mBluetoothDevice);
  76. Log.e("==============","headset state:"+state);
  77. if (state==BluetoothHeadset.STATE_CONNECTED){
  78. Log.e("=================","bluetooth headset connected");
  79. }
  80. }
  81. }
  82. }
  83. @Override
  84. public void onServiceDisconnected(int profile) {
  85. if (profile == BluetoothProfile.HEADSET){
  86. mBluetoothHeadset = null;
  87. }
  88. }
  89. };
  90. @Override
  91. public void onClick(View v) {
  92. switch (v.getId()){
  93. case R.id.startRec:
  94. startRecordWav();
  95. break;
  96. case R.id.stopRec:
  97. stopRecordWav();
  98. break;
  99. default:
  100. break;
  101. }
  102. }
  103. /**
  104. * 识别实时语音
  105. */
  106. private void recog(){
  107. mIatResults.clear();
  108. // 设置参数
  109. setParam();
  110. int ret = 0;
  111. // 不显示听写对话框
  112. ret = mIat.startListening(mRecognizerListener);
  113. if (ret != ErrorCode.SUCCESS) {
  114. showTip("听写失败,错误码:" + ret);
  115. } else {
  116. //                showTip("");
  117. }
  118. }
  119. /**
  120. * 初始化监听器。
  121. */
  122. private InitListener mInitListener = new InitListener() {
  123. @Override
  124. public void onInit(int code) {
  125. Log.i(TAG, "SpeechRecognizer init() code = " + code);
  126. if (code != ErrorCode.SUCCESS) {
  127. showTip("初始化失败,错误码:" + code);
  128. }
  129. }
  130. };
  131. /**
  132. * 听写监听器。
  133. */
  134. private RecognizerListener mRecognizerListener = new RecognizerListener() {
  135. @Override
  136. public void onBeginOfSpeech() {
  137. // 此回调表示:sdk内部录音机已经准备好了,用户可以开始语音输入
  138. showTip("开始说话");
  139. }
  140. @Override
  141. public void onError(SpeechError error) {
  142. // Tips:
  143. // 错误码:10118(您没有说话),可能是录音机权限被禁,需要提示用户打开应用的录音权限。
  144. showTip(error.getPlainDescription(true));
  145. //            showTip("错误码:10118(您没有说话),可能是录音机权限被禁,请打开应用的录音权限。");
  146. }
  147. @Override
  148. public void onEndOfSpeech() {
  149. // 此回调表示:检测到了语音的尾端点,已经进入识别过程,不再接受语音输入
  150. showTip("结束说话");
  151. }
  152. @Override
  153. public void onResult(RecognizerResult results, boolean isLast) {
  154. String text = JsonParser.parseIatResult(results.getResultString());
  155. Log.i(TAG, text);
  156. showTip(text);
  157. if(isLast) {
  158. //TODO 最后的结果
  159. result.append(text);
  160. }
  161. }
  162. @Override
  163. public void onVolumeChanged(int volume, byte[] data) {
  164. //            showTip("当前正在说话,音量大小:" + volume);
  165. Log.i(TAG,"当前正在说话,音量大小:" + volume);
  166. Log.i(TAG, "返回音频数据:" + data.length);
  167. }
  168. @Override
  169. public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
  170. // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
  171. // 若使用本地能力,会话id为null
  172. //        if (SpeechEvent.EVENT_SESSION_ID == eventType) {
  173. //                String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
  174. //                Log.d(TAG, "session id =" + sid);
  175. //        }
  176. }
  177. };
  178. /**
  179. * Toast显示提示
  180. */
  181. private void showTip(String str){
  182. Toast.makeText(this,str,Toast.LENGTH_SHORT).show();
  183. }
  184. /**
  185. * 参数设置
  186. * @return
  187. */
  188. public void setParam(){
  189. // 清空参数
  190. mIat.setParameter(SpeechConstant.PARAMS, null);
  191. // 设置引擎
  192. mIat.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
  193. // 设置返回结果格式
  194. mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
  195. // 设置语言
  196. mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
  197. // 设置语言区域
  198. mIat.setParameter(SpeechConstant.ACCENT,"mandarin");
  199. // 设置语音前端点:静音超时时间,即用户多长时间不说话则当做超时处理
  200. mIat.setParameter(SpeechConstant.VAD_BOS, "8000");
  201. // 设置语音后端点:后端点静音检测时间,即用户停止说话多长时间内即认为不再输入, 自动停止录音
  202. mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
  203. // 设置标点符号,设置为"0"返回结果无标点,设置为"1"返回结果有标点
  204. mIat.setParameter(SpeechConstant.ASR_PTT, "0");
  205. // 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
  206. // 注:AUDIO_FORMAT参数语记需要更新版本才能生效
  207. mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
  208. mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
  209. //       设置录音时长,单位ms
  210. mIat.setParameter(SpeechConstant.KEY_SPEECH_TIMEOUT,"60000");
  211. //设置音频源,MIC、VOICE_RECOGNITION、VOICE_COMMUNICATION可用,但与不同android系统有关
  212. mIat.setParameter(SpeechConstant.AUDIO_SOURCE, MediaRecorder.AudioSource.VOICE_COMMUNICATION+"");
  213. }
  214. /**
  215. * 停止录音
  216. */
  217. private void stopRecordWav(){
  218. Log.e(TAG, "停止录音");
  219. mBluetoothHeadset.stopVoiceRecognition(mBluetoothDevice);
  220. }
  221. /**
  222. * 录音,自主控制录音格式、速率等
  223. */
  224. private void startRecordWav(final int source){
  225. if (!mAudioManager.isBluetoothScoAvailableOffCall()) {
  226. Log.d(TAG, "系统不支持蓝牙录音");
  227. return;
  228. }
  229. if (mBluetoothHeadset == null){
  230. Toast.makeText(this, "蓝牙耳机对象null",Toast.LENGTH_SHORT).show();
  231. return;
  232. }
  233. if (mBluetoothDevice!=null){
  234. mBluetoothHeadset.startVoiceRecognition(mBluetoothDevice);
  235. }
  236. IntentFilter audioStateFilter = new IntentFilter();
  237. audioStateFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
  238. audioStateFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
  239. registerReceiver(new BroadcastReceiver() {
  240. @Override
  241. public void onReceive(Context context, Intent intent) {
  242. String action = intent.getAction();
  243. if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)){
  244. int state = intent.getIntExtra(BluetoothProfile.EXTRA_STATE,-1);
  245. if (state==BluetoothHeadset.STATE_AUDIO_CONNECTED){
  246. Log.e("==============","开始蓝牙语音识别");
  247. recog();
  248. unregisterReceiver(this); // 别遗漏
  249. }
  250. }
  251. }
  252. },audioStateFilter);
  253. }
  254. @Override
  255. protected void onResume(){
  256. super.onResume();
  257. }
  258. }

原文地址:https://www.cnblogs.com/dongweiq/p/8288336.html

时间: 2024-11-05 18:54:48

android上使用蓝牙设备进行语音输入的相关文章

android 输入法,里面还集成语音输入

<?xml version="1.0" encoding="utf-8"?> <com.example.android.softkeyboard.LatinKeyboardView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/keyboard" android:layout_alignParentBot

通过输入方式在Android上进行微博OAuth登录

在微博认证方式里,基本的OAuth认证是必须要调整到跳转到第三方页面上进行授权的,例如下面的例子: 1.从http://open.weibo.com/wiki/index.php/SDK#Android下载SDK包. 2.在AndroidExample/src/weibo4android/Weibo.java中填入App key和App Secret. public class Weibo extends WeiboSupport implements java.io.Serializable

Android 上千实例源码分析以及开源分析

Android 上千实例源码分析以及开源分析(百度云分享) 要下载的直接翻到最后吧,项目实例有点多. 首先 介绍几本书籍(下载包中)吧. 01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 06_Android的GUI系统 07_Android的Audio系统 08_Android的Video 输入输出系统 09_Android的多媒体系统 10_

speex编解码在android上实现

以前在应用中使用到了Speex编解码,近来总结了一下Speex在android上的实现.Speex是一套主要针对语音的开源免费,无专利保护的音频压缩格式.Speex工程着力于通过提供一个可以替代高性能语音编解码来降低语音应用输入门槛 .另外,相对于其它编解码,Speex也很适合网络应用,在网络应用上有着自己独特的优势.同时,Speex还是GNU工程的一部分,在改版的BSD协议中得到了很好的支持.Speex是基于CELP并且专门为码率在2-44kbps的语音压缩而设计的.Speex源码是基于c语音

使用Olami SDK实现一个语音输入数字进行24点计算的iOS程序

前言 在目前的软件应用中,输入方式还是以文字输入方式为主,但是语音输入的方式目前应用的越来越广泛.这是一个利用 Olami SDK 编写的一个24点iOS程序,是通过语音进行输入. Olami SDK的介绍在下面这个网址 https://cn.olami.ai/wiki/?mp=sdk&content=sdk/ios/reference.html 在这个网址中详细的介绍了Olami SDK包含了那些函数和定义的委托. App实现 下面就通过24点这个程序来介绍一下如何使用这个SDK. 这个APP

android上进行c/C++开发测试(转)

Android C编程技巧 运行模拟器 emulator -console * 将文件写入到模拟器的userdata.img文件中 adb push *将一个目录拷贝到模拟器中,包括子目录 adb push * 将一个目录从模拟器中拷出来 adb pull * 使得模拟器可以运行arm代码. 使用GNU/ARM Linux编译器编译你的应用程序就可以了 * 在模拟器里面运行shell,需要先运行模拟器 adb shell *运行模拟器中的一个控制台程序 adb shell *连接模拟器的控制台

如何调试 Android 上 HTTP(S) 流量

转自: http://greenrobot.me/devpost/how-to-debug-http-and-https-traffic-on-android/ 如何调试 Android 上 HTTP(S) 流量 前面的话 在Android开发中我们常常会和API 打交道,可能你不想,但是这是避不开的.大部分情况下,调试发送网络请求和接收响应的过程都是十分痛苦的. 有多少次我们经过调试发现API的调用失败仅仅是因为我们的编码错了或者丢失了一个HTTP头部参数?在调试的过程中,我们发现出现错误的原

HoloLens开发手记 - Unity之语音输入

对于HoloLens,语音输入是三大基本输入方式之一,广泛地运用在各种交互中.HoloLens上语音输入有三种形式,分别是: 语音命令 Voice Command 听写 Diction 语法识别 Grammar Recognition 语音命令 Voice Command 对于做过Windows Phone或许Windows Store应用开发的人来说,语音命令是经常使用到的特性.开发者可以通过为应用设定关键词,和对应的行为,来为用户提供语音命令体验.当用户说出关键词时,预设的动作就会被调用.在

创建 Android 上使用的自签名证书(Creating self-signed certificates for use on Android)

创建 Android 上使用的自签名证书 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 创建 Android 上使用的自签名证书 Creating self-signed certificat