我使用以下代码在Android中启动语音识别:
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if (activities.size() == 0) {
displayWarning("This device does not support speech recognition");
return;
}
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
这很好用 . 但是,它似乎不接受来自使用“电话音频”配置文件配对和连接的蓝牙耳机的语音输入 .
我可以使用名为SoundAbout的应用程序强制"Media Audio"到"Bluetooth (mono) (SCO)" . 有了这个应用程序集,我的语音识别现在可以从我的耳机输入语音输入 .
如何使用RecognizerIntent并从蓝牙耳机获取语音输入?
我在API级别16中看到有一个新的意图动作ACTION_VOICE_SEARCH_HANDS_FREE . 这对我来说太新了,但这会解决我的问题吗?
我是否必须使用setBluetoothScoOn()或startBluetoothSco()在AudioManager中进行捣乱(就像我假设SoundAbout正在做的那样)来路由音频输入?
5 回答
显示许可
在
Activity
或Service
中创建内部类BluetoothHelper extends BluetoothHeadSetUtils
. 声明一个类成员mBluetoothHelper
并在onCreate()
中实例化它要将蓝牙耳机与文本转语音一起使用,您需要在调用speak之前将AudioManager设置为STREAM_VOICE_CALL . 或者使用下面的代码
将BluetoothHeadsetUtils类复制到您的项目中 .
(2013年4月30日)编辑以在必要时更改为@TargetApi(Build.VERSION_CODES.HONEYCOMB) . 如果您对API 8或9的java.lang.NoClassDefFoundError有问题,只需删除所有API> = 11代码 . startBluetoothSco()适用于所有API版本 .
我认为您所要做的就是更改应用程序的音频设置 .
当您想通过蓝牙接收和发送耳机声音时,您应该输入以下代码 .
当您不使用蓝牙时,请不要忘记以下列方式恢复手机上的正常设置 .
所需的权限如下:
这很简单!
即使蓝牙耳机已配对并连接到电话音频配置文件(HF / HS),实际音频连接(SCO)仅在呼叫进入和接受时 Build .
为了让您的VR应用程序接受来自蓝牙耳机的语音输入,您的应用程序必须在某些VR输入触发器上为耳机 Build SCO,您需要使用以下内容 - isBluetoothScoAvailableOffCall来检查平台是否支持此功能,然后使用startBluetoothSco和stopBluetoothSco启动SCO到耳机 .
startBluetoothSco需要很长时间才能 Build ,如果你需要将它用于语音控制,那就是问题 .
有没有一种快速的方法来使用蓝牙麦克风听,然后听完后将其关闭?
如果连接始终是连接,则无法通过A2DP传输音频 .
那么,理想的世界:
通过A2DP音频输出 . 当它开始收听时,它使用SCO蓝牙麦克风 . 任何回复都是A2DP .
事实上,如果它已经连接 - 您可以通过将媒体流更改为呼叫流来实时切换吗?如果是这样,有没有明显的延迟?
Hoan Nguyen做得很好!
测试他的代码我注意到在某些情况下没有调用stopBluetoothSco() .
我建议在CountDownTimer中做一点改动: