TTS输出始终为A2DP

时间:2011-08-05 22:56:58

标签: android bluetooth text-to-speech

我的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转到{{1} (在Android蓝牙设置中也称为“手机音频”)。

但无论我在我的小应用程序中使用HSP还是STREAM_MUSIC音频总是由于某种原因导致STREAM_VOICE_CALL

我做错了什么?有没有办法将TTS输出路由到耳机的A2DP个人资料?

3 个答案:

答案 0 :(得分:2)

在大多数设备上,我大部分时间都在使用它。以下是使用蓝牙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/

答案 1 :(得分:1)

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

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

总结一下: 如果您要尝试的只是播放音乐(不在通话中),请使用AudioManager.STREAM_MUSIC,如果耳机与A2DP兼容,则会听到音乐。

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

答案 2 :(得分:1)

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

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

如果您现在将TextToSpeech发送到STREAM_VOICE_CALL流,它将最终进入耳机(即使是廉价的非A2DP设备)。