【问题标题】:Android Text to Speech is broken while phone ringing手机响铃时Android Text to Speech中断
【发布时间】:2012-06-16 20:16:27
【问题描述】:

在我的 android 应用程序中,我使用文本到语音引擎来朗读一段文本。语音代码在电话响铃时运行。语音中断,我在 logcat 中看到以下警告。 请注意,在 SDK 15(冰淇淋三明治)上会出现此问题,尤其是仅在电话响铃时调用语音代码时,否则即使在 ICE 上,在电话不响铃的任何其他时间调用语音代码时都可以正常工作。该代码在 SDK 8 和 10 上运行良好。

我得到的警告是:

com.svox.pico W/AudioTrack(549): obtainBuffer() track 0x177dd8 disabled, restarting
com.svox.pico W/AudioTrack(549): obtainBuffer() track 0x177dd8 disabled, restarting
com.svox.pico D/dalvikvm(549):   GC_CONCURRENT freed 441K, 8% free 6552K/7111K, paused 3ms+107ms
com.svox.pico W/AudioTrack(549): obtainBuffer() track 0x156058 disabled, restarting
com.svox.pico D/dalvikvm(162):   GC_CONCURRENT freed 532K, 11% free 8391K/9415K, paused 5ms+6ms

相关代码段在 Service 的线程中运行,服务在接到电话时在广播接收器中启动。

// The constructor of speaker class
public Speaker(final Context context, final Settings settings) 
{   
    this.settings = settings;
    params = new HashMap<String, String>();      
    params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM));
    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "myapp");

    this.context = context;      

    synchronized (synch) 
    {   
        talker = new TextToSpeech(context, this);
    }

    Utils.log(TAG, "Created TextToSpeech..");
}

@Override
public void onInit(final int status) 
{
    synchronized (synch) 
    {   
        Utils.log(TAG, "TTS onInit..");

        if(talker == null)
        {
            throw new RuntimeException(Utils.collectPlatformInfo(context));
        }

        if(TextToSpeech.ERROR == talker.setOnUtteranceCompletedListener(new SpeechFinishedListener()))
        {
            Utils.log(TAG, "Error tts setUt");
            return ; 
        }

        int code = talker.setLanguage(Locale.getDefault());

        if(code == TextToSpeech.LANG_NOT_SUPPORTED || code ==TextToSpeech.LANG_MISSING_DATA)
        {
            Utils.log(TAG, String.format("Error settingLang on TTS code %d", code));            
        }

        if(TextToSpeech.ERROR == talker.setSpeechRate(settings.getSpeed()))
        {
            //this error is not a fatal, we can continue
            Utils.log(TAG, "Error tts setSPeechrate");                      
        }

        if(TextToSpeech.ERROR == talker.setPitch(settings.getPitch()))
        {   
            //this error is not a fatal, we can continue
            Utils.log(TAG, "Error tts setPitch");           
        }

        ready = true;
    }
}

    // The function used to provide text to be spoken..
public void speak(final String text) throws InterruptedException
{
    if(bEngineFailure)
        return;

    if(!ready)
    {
        Utils.log(TAG, "engine not initialized");
        bEngineFailure = true;
        return;
    }

    bSpeechComplete = false;

    talker.speak(text, TextToSpeech.QUEUE_ADD, params);

    while(!bSpeechComplete)
    {
           Thread.sleep(100);           
    }   

}

【问题讨论】:

  • 很难猜,请贴相关代码示例。
  • @Sam 我已经更新了帖子并添加了相关代码。

标签: android text-to-speech


【解决方案1】:

这只是一个猜测,因为这里没有太多可做的事情,但我看到了类似的情况,如果电话音量响起(不振动)到来电时铃声会播放的地方,或者某种正在播放其他音频(即:TTS/音乐/视频)其中一个音频流变得断断续续/中断,因为它试图同时播放两者。如果这是您希望同时播放两者的效果,那么您可以做的一项工作是扩展 PhoneStateListener 并每隔一段时间暂停音频,然后播放 TTS

扩展PhoneStateListener的例子可以在here找到

【讨论】:

  • 在电话响铃状态下尝试播放语音一直有效,直到姜饼和早期版本。我试过静音铃声,但无济于事。但是我已经看到一些应用程序在 ICS 中同时播放语音​​和铃声没有问题..
  • 你知道他们手头有哪些应用吗?
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多