Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在通话过程中运行SpeechRecognitor_Java_Android - Fatal编程技术网

Java 在通话过程中运行SpeechRecognitor

Java 在通话过程中运行SpeechRecognitor,java,android,Java,Android,有没有办法在通话时运行SpeechRecognitor?我是这样做的: BroadcastReceiver处理手机状态的变化(例如摘机) SpeechRecognizer在当前(主)线程中启动,因为它只能在主线程中启动。应用程序上下文用于识别器(无法使用提供给广播接收器的当前上下文) 但不幸的是,另一边的人听不见我说话(尽管语音识别效果很好)。在away中,识别器已经“消耗”了我的声音,没有发送过来 我知道在调用期间在主线程中执行操作是危险的,但是有没有办法在调用期间以某种方式运行识别器 更

有没有办法在通话时运行SpeechRecognitor?我是这样做的:

  • BroadcastReceiver
    处理手机状态的变化(例如摘机)
  • SpeechRecognizer
    在当前(主)线程中启动,因为它只能在主线程中启动。应用程序上下文用于识别器(无法使用提供给广播接收器的当前上下文)
但不幸的是,另一边的人听不见我说话(尽管语音识别效果很好)。在away中,识别器已经“消耗”了我的声音,没有发送过来

我知道在调用期间在主线程中执行操作是危险的,但是有没有办法在调用期间以某种方式运行识别器


更新:我尝试使用
TelephonyManager
监听器,而不是
BroadcastReceiver
,但是一些内部服务会因为NPE而崩溃。

AFAIK语音呼叫从未从安卓端处理过。应用处理器或通信处理器在任何给定时间都可以控制流,而不是两者都可以。通常,一旦语音呼叫启动,麦克风和耳机的流控制就会发送给通信处理器。奇怪的是,在您的情况下,应用程序处理器正在获得控制权。这看起来是个bug


音频流由通信处理器直接处理(这是有意义的,因为在应用处理器和最终将处理呼叫的通信处理器中分别进行两次处理是浪费处理)。所以我认为这是不可能的

根据手机型号,如果语音识别器在服务中实现,则是可能的。我对使用安卓v4的HTC Rezound没有问题,但是使用安卓v2.3的摩托罗拉仿生系统在音频管理器崩溃时无法工作。即使使用HTC,识别器也听不到另一部手机上的人。当扬声器打开时,它会保持报告错误不匹配。

有一些应用程序可以记录您的通话(您只听到自己的话),因此我认为应该可以以某种方式同时进行通话和对语音执行某些操作。也许这些处理器可以链接起来?你能指向谷歌play上的应用页面吗?因为我一直找不到任何一个。我曾经有一个应用程序记录我的通话,甚至是另一个参与者的非常安静的版本(可能是一个可以从扬声器中听到并进入麦克风的应用程序)。我不再拥有它(刷新了我的手机),我也不记得它是众多“录制”应用中的哪一个,但我确实录制了一些。不过我可能错了,在谷歌上,一些手机似乎支持它。我记得很久以前做过一些搜索,但通话数据似乎从未通过alsa lib。@Bozho:“所以我认为应该可以在某种程度上同时进行通话和对语音执行操作”——只有一个麦克风总成。它要么属于呼叫,要么属于
语音识别器
。它不是双方都拥有的。麦克风没有传递的概念,它既向一个应用程序提供数据,又将数据传递给另一个应用程序。拥有这样的能力并不是一个不合理的概念,但事实并非如此。出于南迪什指出的原因,可能根本无法接通电话。