2012-06-16 2 views
3

내 안드로이드 응용 프로그램에서 Text to Speech 엔진을 사용하여 Text를 말합니다. 전화가 울릴 때 음성 코드가 실행됩니다. 연설이 망가졌고 logcat에 다음 경고가 표시됩니다. 이 문제는 SDK 15 (아이스크림 샌드위치)에서 특히 특히 전화가 울릴 때 음성 코드가 호출 될 때만 나타납니다. 그렇지 않으면 ICE에서도 전화가 울리지 않을 때 음성 코드가 완벽하게 작동합니다. 코드는 SDK (8) 및 (10)전화벨이 울리는 동안 Android 음성이 끊어졌습니다.

경고에 잘 작동 I 수 있습니다

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

} 
+0

추측하기 어렵습니다. 관련 코드 샘플을 게시하십시오. – Sam

+0

@ Sam 나는 게시물을 업데이트하고 관련 코드를 추가했습니다. – Ahmed

답변

2

이것은 단지 추측입니다 다른 종류의 오디오가 재생되고 있습니다 (예 : TTS/음악/비디오). 오디오 스트림 중 하나가 동시에 재생하려고하기 때문에 모든 고르지/깨지기가 발생합니다. 이 원하는 효과는 두 가지를 동시에 재생되는 경우에 당신이 할 수있는 주위에 하나의 작업은 다음 PhoneStateListener을 확장하는 TTS

예를 재생 PhoneStateListener를 확장하고 모든 너무 자주 오디오를 일시 정지 찾을 수 있습니다 here

+0

진저 브레드와 이전 버전까지 전화 벨소리가 울리는 동안 음성을 재생하려고했습니다. 나는 조용한 벨소리를 시도했지만 아무 소용이 없습니다. 그러나 나는 문제없이 ICS에서 스피치와 벨소리를 동시에 재생하는 몇 가지 앱을 가지고있다. – Ahmed

+0

그들이 어떤 애플리케이션을 사용했는지 알고 있는가? – tyczj

관련 문제