2

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

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

4

3 回答 3

5

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

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

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

于 2010-06-30T21:23:33.403 回答
0

你能用TextToSpeech.OnUtteranceCompletedListenerwithAudioManager.setStreamVolume来实现这个吗?

于 2010-06-30T21:36:03.970 回答
0

这是在 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 音量时才使用此选项

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);
}
于 2021-12-14T23:57:42.023 回答