安卓 TTS 音量控制

5

在向TTS引擎发送请求时,是否有一种方式可以控制TTS引擎的音量?我能否在这里使用AudioManager?

谢谢。

6个回答

16

您可以在TTS speak()方法中获取此内容,但仅从API级别11开始。

为了保持向后兼容性,您可以针对更高的API级别(使用较低的min sdk)并使用“@TargetApi(api_level)”装饰器以及SDK版本检查。

/**  speak the single word, at a lower volume if possible */
protected void speakOneWord(String text) {
    int apiVer = android.os.Build.VERSION.SDK_INT;
    if (apiVer >= 11){
        speakApi13(text);
    } else {
        // compatibility mode
        HashMap<String, String> params = new HashMap<String, String>();
        mTts.speak(text, TextToSpeech.QUEUE_ADD, params);
    }
}   

/**  speak at a lower volume, for platform >= 13 */
@TargetApi(13)
protected void speakApi13(String text) {
    HashMap<String, String> params = new HashMap<String, String>();
    params.put(TextToSpeech.Engine.KEY_PARAM_VOLUME, "0.1");
    mTts.speak(text, TextToSpeech.QUEUE_ADD, params);
}   

6

speak()方法现在可以控制TTS音量

API级别21中添加

int speak (CharSequence text, 
                int queueMode, 
                Bundle: KEY_PARAM_VOLUME;..., 
                String utteranceId)

参数KEY_PARAM_VOLUME,指定当前流类型音量相对于文本朗读时使用的音量。
音量是一个范围在0到1之间的浮点数,其中0表示静音,1表示最大音量(默认行为)。


3

是的,根据您的问题,您可以使用AudioManager来进行TTS音频控制。

如果您想在代码中设置音量,您需要使用getStreamVolume()setStreamVolume()方法。

如果您想让用户控制音量(这可能取决于您的程序何时如何设置音量),此问题指出您必须在OnCreate()期间调用setVolumeControlStream()

编辑:不,您不能在TTS引擎的方法(即Speak()方法)中控制音量。


3
setStreamVolume()方法更改的是系统整体音量,而不是您应用程序的音量。这个答案应该标记为错误,下面有更好的解决方案。 - PVoLan

1
尝试使用以下内容来控制设置:

Try this to control the settings:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
sb2value =am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
am.setStreamVolume(AudioManager.STREAM_MUSIC, sb2value, 0);

1

int iAlertVolume 是一个0%到100%的值,用户可以设置为期望的音量。

setVolumeControlStream(AudioManager.STREAM_MUSIC);
AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int amStreamMusicMaxVol = am.getStreamMaxVolume(am.STREAM_MUSIC);
am.getStreamVolume(am.STREAM_MUSIC);

实际音量设置:

am.setStreamVolume(am.STREAM_MUSIC, (iAlertVolume*amStreamMusicMaxVol)/100,0 );

末尾的0表示不显示系统音量控制,设置为1可查看系统控制。


0

在我加入以下代码(Kotlin)中的setLegacyStreamType()调用之前,以上所有方法都对我无效:

// Requires Lollipop or above
var ttobj: TextToSpeech? = null

val attrs = AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION)
                .setLegacyStreamType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build()
ttobj?.setAudioAttributes(attrs)

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