1

我正在使用 TTS 编写应用程序,我可以使用 UtteranceProgressListener(不要担心有关此主题的旧版本)从音乐播放器获得音频焦点,并在演讲完成后将焦点返回给音乐播放器。但是应用程序 TTS 仍然与谷歌地图(导航器)的声音重叠。

无论如何,我是否可以分辨出 Map 何时在说话,并且我的声音可以排队,甚至可以冲洗(因为现在,当他们两个都在说话时,我无法辨别/理解他们中的任何一个)。

或者有人可以向我指出谷歌地图的来源(或我可以使用的隐藏 API),我知道谷歌地图不是 Android 开源的一部分。

以下是我的代码片段:

@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
private class utteranceListener extends UtteranceProgressListener {
    private OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
        public void onAudioFocusChange(int focusChange) {
           if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
             // Pause playback
             audioManager.abandonAudioFocus(afChangeListener);
           } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
             //  we don't duck, just abandon focus
             audioManager.abandonAudioFocus(afChangeListener);
           } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
            // Resume playback 
           } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
             audioManager.abandonAudioFocus(afChangeListener);
           }
        }
    };

    @Override
    public void onDone(String utteranceId)
    {
        audioManager.abandonAudioFocus(afChangeListener);
    }
    @Override
    public synchronized void onError(String utteranceId)
    {
        audioManager.abandonAudioFocus(afChangeListener);
    }
    @Override
    public void onStart(String utteranceId)
    {
        int result = audioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

    }
}

顺便说一句,在音乐和 TTS 方面,我更喜欢老式的 AUDIOFOCUS_LOSS_TRANSIENT,而不是 AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK,“躲避”的音乐仍然使(TTS)语音难以听,尤其是在播放说唱音乐时,有时只是“演讲/谈话” .

4

1 回答 1

1

我已经基本解决了,除了一个例外,当谷歌地图说话时,我的代码(下面)仍然返回 AUDIOFOCUS_REQUEST_GRANTED,所以我在这里仍然有重叠。

audioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, 
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

在起作用的事情上,两个不同的概念,UtterancePrograssListener用于由您自己的应用程序触发的事件,例如每当您的演讲完成或您的演讲即将开始时;OnAudioFocusChangeListener用于其他应用程序触发的事件,例如谷歌地图从您那里获取音频焦点。

因此,如果我想让我自己的应用程序在 Google 地图即将宣布行车路线时停止说话,下面的代码将停止我的说话:

public void onAudioFocusChange(int focusChange) {
   if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
        // Someone else has taken over the audio focus, 
        // abandonAudioFocus() would not do anything.
        // you can only stop(), or lower your voice.
        tts.stop();
        audioManager.abandonAudioFocus(afChangeListener);
   } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
        //  this is what Google Map actually triggers
        tts.stop();
        audioManager.abandonAudioFocus(afChangeListener);
   } 
.....
于 2013-08-22T02:27:08.557 回答