【问题标题】:TTS output always going to A2DPTTS 输出总是去 A2DP
【发布时间】:2011-08-05 22:56:58
【问题描述】:

我的 Android 教程指出我可以明确告诉 TTS 引擎使用哪个流:

对于音乐播放:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));

对于电话:

params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_VOICE_CALL));

我的理解是,到蓝牙耳机的音频路由的工作原理是,STREAM_MUSIC 转到 A2DP(Android 蓝牙设置中的“媒体音频”),STREAM_VOICE_CALL 转到 HSP(又名“电话音频”)在 Android 蓝牙设置中)。

但无论我在我的小应用程序中使用STREAM_MUSIC 还是STREAM_VOICE_CALL音频总是出于某种原因转到A2DP

我做错了什么?有没有办法将 TTS 输出路由到耳机的 HSP 配置文件?

【问题讨论】:

    标签: android bluetooth text-to-speech


    【解决方案1】:

    我在大多数设备上大部分时间都可以正常工作。这是使用蓝牙 SCO 而不是 A2DP 在语音呼叫流上启动 TTS 的部分。

    if (mTtsReady) {
        myHash = new HashMap<String, String>();
    
        myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "A2DP_Vol");
    
        OLD_AUDIO_MODE = am2.getMode();
        if(SMSstream == 1){
            if (am2.isBluetoothScoAvailableOffCall()) {
                am2.startBluetoothSco();
            }
            if(!am2.isSpeakerphoneOn()){
                speakerPhoneWasOn = false;
                am2.setSpeakerphoneOn(true);
            }
            myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
                    String.valueOf(AudioManager.STREAM_VOICE_CALL));
            am2.requestAudioFocus(null, AudioManager.STREAM_VOICE_CALL,
                    AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
    
        }
        else{
            am2.requestAudioFocus(null, AudioManager.STREAM_MUSIC,
            AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
            myHash.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
                    String.valueOf(AudioManager.STREAM_MUSIC));
        }
    
        new CountDownTimer(SMS_DELAY, SMS_DELAY/2) {
    
            @Override
            public void onFinish() {
                try {
                    mTts.speak(str, TextToSpeech.QUEUE_ADD,
                            myHash);
                } catch (Exception e) {
                    Toast.makeText(application,
                            R.string.TTSNotReady,
                            Toast.LENGTH_LONG).show();
                    e.printStackTrace();
                }
    
            }
    
            @Override
            public void onTick(long arg0) {
    
            }
    
        }.start();
    }
    

    现在我只是有一个问题,让流在完成后恢复。阅读 TTS 一切正常。它将暂停任何音乐,播放 TTS,然后恢复正常播放音乐。但是,当我稍后退出应用程序时,媒体流现在会通过手机耳机播放,直到我重新启动。我在这里发布了这个问题:Audio stream stays on earpiece after using AudioManager

    你可以在这里看到我的整个项目:http://code.google.com/p/a2dpvolume/

    【讨论】:

    • 这太不可思议了。迟来的感谢您发布此信息。接受,虽然我还没有在我的应用程序中测试过这段代码。
    【解决方案2】:

    如果您的耳机与 a2dp 配置文件兼容,那么使用 AudioManager.STREAM_MUSIC 并因此通过流播放音频应该可以完成工作。

    我还要补充一点,如果您当前正在通话中,并且您通过语音流播放音频,那么任何耳机(a2dp 或其他)都可以听到音频。不幸的是,您需要接听电话。 不幸的是,我发现将模式设置为 MODE_IN_CALL 没有任何作用。

    总结一下: 如果您只想播放音乐(不在通话时),请使用AudioManager.STREAM_MUSIC,如果耳机兼容 A2DP,那么它将听到音乐。

    另外,查看AudioManager.isBluetoothA2dpOn(),确保系统认为您的耳机已插入。

    【讨论】:

    • 谢谢,但我可能没有很好地解释我想要做什么:我想通过 A2DP 耳机播放 TTS(文本到语音)输出。也就是说,我希望能够使用较便宜的耳机进行文字转语音。毕竟只是语音,不是高保真音乐……这可能吗?为尝试 +1。
    • 好吧,我实际上不认为这是可能的,因为你必须改变系统的工作方式,可能是公司之间的事情(你挠我的背......)......但我不确定
    【解决方案3】:

    是的,可以通过非 A2DP 耳机播放 TTS(文本到语音)输出,如 jroal 所说,使用 SCO。

    使用 AudioManager startBluetoothSco 启用 SCO。然后监听 AudioManager.ACTION_SCO_AUDIO_STATE_CHANGED 广播,并将 EXTRA_SCO_AUDIO_STATE 设置为 SCO_AUDIO_STATE_CONNECTED。

    如果您现在对 STREAM_VOICE_CALL 流执行 TextToSpeech,它将最终出现在耳机中(即使是廉价的非 A2DP 设备)。

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 2011-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多