通话期间运行语音识别器

5
有没有办法在通话时运行SpeechRecognizer?我是这样做的:
- BroadcastReceiver处理电话状态的变化(例如:offhook)。 - SpeechRecognizer在当前(主)线程中启动,因为它只能在主线程中启动。应用程序上下文用于识别器(不能使用给广播接收器的当前上下文)。
但不幸的是,另一边的人听不到我说话(语音识别却可以正常工作)。在某种程度上,识别器“消耗”了我的声音并且没有发送出去。
我知道在通话期间在主线程中执行操作是很危险的,但是否有办法在通话期间以某种方式运行识别器呢?
更新:我正在尝试使用TelephonyManager侦听器而不是BroadcastReceiver,但一些内部服务会抛出空指针异常。
2个回答

2
据我所知,Android手机中的语音通话从未由Android系统处理。在任何给定时间,应用处理器或通信处理器都有对流的控制权,而不是两者同时拥有。通常,一旦语音通话开始,麦克风和耳机流控制就会交给通信处理器。但在您的情况下,应用处理器却获得了控制权。这似乎是一个错误。
音频流直接由通信处理器处理(这是有道理的,因为在应用处理器和最终处理通话的通信处理器中进行两次处理是浪费处理资源的)。因此,我认为这是不可能的。

有一些应用程序可以记录您的通话(只听到自己的话),所以我认为应该有可能在进行通话的同时对语音进行处理。也许这些处理器可以串联起来? - Bozho
你能指出谷歌应用商店的页面吗?因为我一直找不到任何应用。 - nandeesh
我曾经有一个应用程序可以记录我的通话,甚至可以记录另一方非常微弱的声音(可能是从扬声器中听到并进入麦克风的声音)。我不再拥有它(刷了手机),也不记得其中的许多“录音”应用程序中哪一个是它,但我确实做了一些录音。 - Bozho
我可能错了,但是在谷歌上搜索一些手机似乎支持它。我记得很久以前做过一些搜索,通话数据似乎从未通过alsa-lib传输。 - nandeesh
是的,可能有些手机支持它。但是你无法访问通话数据的一般想法有点愚蠢。好吧,不允许录音通话,但是你可以用自己的话做很多事情。 - Bozho
2
@Bozho:“所以我认为应该有一种方法既进行通话又对语音执行某些操作”——有一个麦克风组件。它要么归通话所有,要么归SpeechRecognizer所有。它不会同时归两者所有。麦克风没有“直通”的概念,即它既向一个应用程序提供数据,又将数据传递给其他应用程序。拥有这样的能力并不是一个不合理的概念,但它不存在,并且出于nandeesh指出的原因,可能无法通过电话呼叫进行传递。 - CommonsWare

0

根据手机型号,如果语音识别器实现在服务中,则可能会出现问题。我使用安卓v4的HTC Rezound没有问题,但是使用安卓v2.3的Motorola Bionic无法工作,因为音频管理器崩溃了。即使使用HTC,识别器也无法听到另一端的人说话。开启扬声器后,它仍然报告错误,没有匹配项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接