禁用谷歌语音识别的哔声

13

我有一个测试应用程序,连续使用Google语音,并且每次调用Google识别服务时都会播放嘟嘟声。我想要摆脱这个嘟嘟声。我已经阅读了静音音乐流的线程,但对我没有用。

我正在尝试找到嘟嘟声文件的位置,以便可以直接从系统中删除它。我按照线程操作,但在5.0系统文件中找不到该文件。


可能是如何静音SpeechRecognizer的蜂鸣声?的重复问题。 - OneCricketeer
嘿,我之前已经检查过了,正如我在问题中提到的,静音音乐流对我来说不是解决方案 :/ - con_9
嗯,我记得曾经有一次阅读过关于静音语音激活的问题,因为如果设备在未经用户批准或通知的情况下始终保持监听状态,那么这可能会侵犯隐私权。我确实看到了很多关于这个问题的重复内容,但如果那些方法不起作用,那我就不知道该告诉你什么了。 - OneCricketeer
我理解用户隐私部分,我会注意这个问题。 - con_9
你的应用程序是系统应用程序和/或具有根访问权限吗? - brandall
4个回答

6
假设您不想静音所有流,因为您对播放自己的声音感兴趣,那么这可能是适合您的解决方案:使用Audio Focus API

因此,您可以像这样:

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                             // Use the music stream.
                             AudioManager.STREAM_MUSIC,
                             // Request permanent focus.
                             AudioManager.AUDIOFOCUS_GAIN);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
// Play your own sound (or play silence)
}
am.abandonAudioFocus(afChangeListener);

我并没有测试过谷歌应用程序是否遵循此请求(播放提示音),但通常情况下它应该可行,值得一试。另一个选择是直接将来自谷歌应用程序的所有声音静音(包括谷歌语音识别提示音)。这种方法的优点是不会干扰任何其他流媒体音频。以下是详细链接,但请注意,这需要 root 访问权限: https://android.stackexchange.com/questions/128588/how-do-i-disable-the-google-voice-typing-voice-search-ding-sound

感谢您的回复。我之前已经阅读过关于这个 API 的资料了,这是一个不错的想法,但是"我需要特别摆脱这个蜂鸣声文件!"这样我就不必处理这些问题,因为即使您提议的方法能够生效,它也会干扰其他方面的功能,比如在播放音乐时的导航朗读。您觉得呢? - con_9
那个链接应该可以用,我得从那里开始。我会更新我最终的做法。你能否编辑你的回答并包含这个链接! - con_9
@con_9 根据您的要求,我已经包含了链接。很高兴它能够进一步帮助到您。 - REG1
@con_9 以防万一:这是另一个使用根访问的相同方法的线程:http://forum.joaoapps.com/index.php?threads/turn-off-avc-beep-solved.2626/ - REG1
音频焦点无法工作:https://stackoverflow.com/questions/45380043/stop-speechrecognizer-from-requesting-audio-focus - user25
显示剩余3条评论

5
我找到的唯一消除蜂鸣声识别的解决方案是:
audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audio.setStreamVolume(AudioManager.STREAM_MUSIC, 0, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

在保存音量之前,例如:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
current_volume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

如需返回恢复音量级别,可执行以下操作:

audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audio.setStreamVolume(AudioManager.STREAM_MUSIC, audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
            AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

我希望这对你有所帮助。

谢谢您的回复,但我知道这个解决方案,并且我不需要它。我不想切换到静音并恢复音量级别,只需移除蜂鸣声,使其他流保持正常音量。 - con_9
@con_9 我知道,但我找到的唯一解决方案就是这个。这个方案只能让你静音音乐,而其他人还可以听到他们的声音。如果您找到了只静音语音识别器的蜂鸣声的解决方案,请告诉我。 - Sergio Antonio Snchez Camarero
有关于静音只有蜂鸣声而不是静音音乐流的任何消息吗? - user25

2
您可以使用音频管理器来控制声音。
  AudioManager audioManager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);

在开始识别呼叫之前

 audioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);

识别完成后,调用

audioManager.setStreamMute(AudioManager.STREAM_MUSIC, false);

.setStreamMute 已经被弃用,有什么替代选项吗? - Hasan A Yousef
使用{@link #adjustStreamVolume(int, int, int)}。 - Lasitha Lakmal

0

我找到了另一种适合我的解决方案。我将媒体播放器的音频流设置为另一个流,这样我就可以静音音乐流。希望这也能帮助其他人。

afd = context.getResources().openRawResourceFd(R.raw.duduuudududu2);

mp.reset();
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
myAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC,0,0);

try 
{
   mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
   mp.prepare();
} 
catch (IOException e) 
{
   e.printStackTrace();
}

mp.start();

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