gpt4 book ai didi

Android Text to Speech 在手机响铃时被破坏

转载 作者:太空狗 更新时间:2023-10-29 13:35:32 24 4
gpt4 key购买 nike

在我的 android 应用程序中,我使用文本到语音引擎来朗读一段文本。语音代码在电话响铃时运行。演讲中断了,我在 logcat 中看到以下警告。请注意,此问题出现在 SDK 15( Ice Cream Sandwich )上,特别是仅当电话响铃时调用语音代码时才会出现此问题,否则即使在 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

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

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

}

最佳答案

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

可以找到扩展 PhoneStateListener 的示例 here

关于Android Text to Speech 在手机响铃时被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11066716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com