【问题标题】:Android TTS volume controlAndroid TTS 音量控制
【发布时间】:2010-12-28 12:02:05
【问题描述】:

向 TTS 引擎发送请求时,有什么方法可以控制 TTS 引擎的音量?我可以在这里使用 AudioManager 吗?

谢谢。

【问题讨论】:

    标签: android text-to-speech


    【解决方案1】:

    您可以在 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);
    }   
    

    【讨论】:

      【解决方案2】:

      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() 方法。

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

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

        【讨论】:

        • setStreamVolume() 方法更改系统范围的音量,而不是您的应用音量。这个答案应该标记为不正确,下面有更好的解决方案
        【解决方案4】:

        试试这个来控制设置:

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

        【讨论】:

          【解决方案5】:

          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看系统ctrl

          【讨论】:

            【解决方案6】:

            在我添加了对 setLegacyStreamType() 的调用之前,上面没有任何东西对我有用,如下所示(在 Kotlin 中):

            // 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)
            

            【讨论】:

              猜你喜欢
              • 2015-04-07
              • 1970-01-01
              • 1970-01-01
              • 2011-03-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多