安卓手机来电时文字转语音功能失效

3
在我的安卓应用中,我使用了文本转语音引擎,让一段文本可以被朗读出来。当手机响铃时,语音代码会运行。但是,日志中出现了以下警告,导致语音断断续续。 请注意,这个问题只在 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中的一个线程中运行,当接到电话时,该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
@Sam 我已经更新了帖子并添加了相关代码。 - Ahmed
1个回答

2
这只是一个猜测,因为这里没有太多线索,但我曾经遇到过类似的情况:如果手机音量设置为响铃(而不是振动),当来电时铃声响起并且同时有其他音频在播放(例如TTS / 音乐/ 视频),其中一个音频流会变得很杂乱/ 断断续续,因为它试图同时播放两个音频。如果您希望实现同时播放两个音频的效果,则可以通过扩展PhoneStateListener并定期暂停音频,然后播放TTS来解决此问题。
扩展PhoneStateListener的示例可以在此处找到。

尝试在电话响铃状态下播放语音在Gingerbread及早期版本中是有效的。我已经尝试了无声铃声,但没有效果。然而,我已经看到一些应用程序在ICS中同时播放语音和铃声而没有问题。 - Ahmed
你知道它们是什么应用程序吗? - tyczj

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