【问题标题】:fade in and out music while speaking a text朗读文本时淡入淡出音乐
【发布时间】:2011-03-03 21:12:22
【问题描述】:

我有一个使用 TTS(文本到语音)API 的 Android 应用程序。一切都运行良好,但现在我想淡入/淡出甚至停止音乐(如果用户正在使用预建的音乐播放器播放音乐),当应用程序说出文本时。现在,我认为音乐和 TTS 消息都在同一个流 (MUSIC) 上播放,并且很难理解语音消息。

我尝试在不同的流上播放文本,例如 AudioManager.STREAM_NOTIFICATIONS。它确实停止了音乐,但在说出文字时不会回来,所以我没有达到目标。还没有找到任何东西,所以我希望有人可以在这里提供帮助。谢谢!

【问题讨论】:

    标签: android text-to-speech background-music


    【解决方案1】:

    我终于得到了一些有用的东西。虽然不完美。一个相当肮脏的把戏。以防万一它对某人有帮助:

    这在 API 8 上已通过 AudioManager 的 requestAudioFocus 和 abandomAudioFocus 方法得到修复。

    但是对于以前的版本,你可以试试这个。通过不同的流频道播放 TTS,比如说 STREAM_NOTIFICATIONS。然后您只需将音频焦点返回到 STREAM_MUSIC。你怎么能做到这一点?向 TTS 发送静音字符串 (" "),但这次是通过 STREAM_MUSIC。效果将是:音乐停止,您的 TTS 消息被说出,最后您的音乐在语音警报后恢复。不好,也不值得骄傲,但是...如果有人知道不同的方式,我会很感激的

    【讨论】:

    【解决方案2】:

    您可以使用TextToSpeech.OnUtteranceCompletedListenerAudioManager.setStreamVolume 来实现此目的吗?

    【讨论】:

    • 如果你通过 STREAM_MUSIC 播放你的 TTS 消息,这与背景音乐相同,请不要认为这行得通。如果你通过另一个流播放它,比如 STREAM_NOTIFICATION,你仍然需要处理焦点返回。而且我只找到了一种方法来解决它,这就是我在上一篇文章中解释的肮脏黑客
    • 我明白了。我现在意识到这更多是关于在“话语”之后返回焦点,你是对的 - 如果没有 requestAudioFocus,这似乎是不可能的。
    【解决方案3】:

    这是在 2021 年 12 月执行此操作的方法

    TexToSpeech 需要初始化并赋值给tts,然后才能调用该方法

    方法一(推荐):

    private void speak(String textToSay) {
        AudioAttributes mPlaybackAttributes = new AudioAttributes.Builder()
              .setUsage(AudioAttributes.USAGE_ASSISTANT)
              .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
              //add this below flag if you need the TTS to speak in a louder volume or TTS volume be heard for sure at any cost
              //.setFlags(FLAG_AUDIBILITY_ENFORCED)
              .build();
        tts.setAudioAttributes(mPlaybackAttributes);
        AudioFocusRequest mFocusRequest =
              new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)
                .setAudioAttributes(mPlaybackAttributes)
                .setAcceptsDelayedFocusGain(false)
                .setWillPauseWhenDucked(false)
                .build();
        AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        am.requestAudioFocus(mFocusRequest);
        tts.speak(textToSay, TextToSpeech.QUEUE_FLUSH, null, textToSay);
        Handler ttsSpeak = new Handler();
        Runnable checkTTSRunning = new Runnable() {
            @Override
            public void run() {
                if (tts.isSpeaking()) {
                    ttsSpeak.postDelayed(this, 1000);
                } else am.abandonAudioFocusRequest(mFocusRequest);
            }
        };
        ttsSpeak.postDelayed(checkTTSRunning, 3000);
    }
    

    方法 2: 仅当您需要 TTS 以更大的音量讲话和/或需要不惜一切代价确保听到 TTS 音量时才使用此方法 p>

    private void speak(String textToSay) {
        AudioAttributes mPlaybackAttributes = new AudioAttributes.Builder()
              .setUsage(AudioAttributes.USAGE_ASSISTANT)
              .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
              .setFlags(FLAG_AUDIBILITY_ENFORCED) //VERY IMPORTANT
              .build();
        tts.setAudioAttributes(mPlaybackAttributes);
        tts.speak(textToSay, TextToSpeech.QUEUE_FLUSH, null, textToSay);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多