2011-06-19 7 views
5

मुझे isSpeaking() विधि के साथ समस्या हो रही है। QUEUE_FLUSH को speak() विधि पर गुजरते समय, isSpeaking() ठीक काम करता है। हालांकि, जब मैं एकाधिक शब्दों को कतारबद्ध करता हूं (QUEUE_ADD पास करके), isSpeaking() विधि एक से अधिक उच्चारण कतारबद्ध होने के तुरंत बाद false लौटने लगती है।एंड्रॉइड पर टेक्स्ट-टू-स्पीच का उपयोग करते समय isSpeaking() के साथ समस्या

तब मैं the source code of the TtsService class भर में ठोकर खाई है और इस कोड को देखा:

public boolean isSpeaking() { 
    return (mSelf.mIsSpeaking && (mSpeechQueue.size() < 1)); 
} 

किसी को भी किसी भी विचार है, क्यों इस विधि इस तरह से लागू किया गया था है?

उत्तर

8

मैं भी इस पर ठोकर खाई।

यह बिल्कुल एक वर्ष के हो चुके हैं तो आप इस प्रश्न पूछा और कोई जवाब नहीं क्षितिज में है ...

तो मैं केवल कि जो कोई भी लिखा कोड के इस टुकड़े का इरादा अनुमान लगा सकते हैं तो इसका मतलब यह करने के लिए

"केवल बोलने पर अंतिम उच्चारण"।

क्या यह समझ में आता है?

  1. isSpeaking() हमेशा वापस आ जाएगी झूठी अगर onUtteranceCompleted() में कहा जाता है:

    केवल समस्या यह है कि, QUEUE_ADD या QUEUE_FLUSH कि क्या में मोड की परवाह किए बिना, अनुभवजन्य टिप्पणियों का सुझाव गंभीर समय दौड़ की स्थिति शामिल देखते हैं कि है।

  2. isSpeaking() हमेशा एक onUtteranceCompleted() के बाद सच अगर पहलेtts.speak() के तुरंत बाद कहा जाता है वापस आ जाएगी।
  3. isSpeaking() हमेशा झूठी अगर तुरंत बुलाया वापस आ जाएगी एक tts.speak() है कि पिछले onUtteranceCompleted() और खुद के बीच अलग करने में कम से कम एक और tts.speak() रों के बाद।

एक तरह से, यह वास्तव में "इरादा" के विपरीत व्यवहार करती है:

"केवल तभी पहले कथन बोल" (एक onUtteranceCompleted के बाद())

यह पसंद क्यों करता है यह मेरे बाहर है, लेकिन कम से कम LogCat क्या दिखाता है।

इसके अलावा official documentation के लिए निम्न अलावा ध्यान दें:।

"ध्यान दें कि एक भाषण आइटम पूरा माना जाता है एक बार यह ऑडियो डेटा ऑडियो मिक्सर के लिए भेज दिया गया है, या लिखित एक फाइल करने के लिए वहाँ हो सकता है एक परिमित अंतराल इस बिंदु के बीच हो सकता है, और ऑडियो हार्डवेयर पूरा करता है जब प्लेबैक। "

अन्य संगठनों में एर शब्द, यह विधि पूरी तरह बेकार है।

3

कतार पूर्ण होने पर प्रसारण का एक इरादा है: ACTION_TTS_QUEUE_PROCESSING_COMPLETED।

ब्रॉडकास्ट रिसीवर पंजीकृत करने के लिए यहां एक उदाहरण वर्ग है और यह स्पीकिंग स्थिति निर्धारित करने के लिए इसका उपयोग करें।

कॉल Init और अपनी गतिविधि में प्रासंगिक स्थानों से शटडाउन और बोलते हैं और isSpeaking कार्यों इस वर्ग में प्रदान की जाती का उपयोग करें:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.speech.tts.TextToSpeech; 
import android.speech.tts.TextToSpeech.OnInitListener; 

public class SpeechWrapper { 

private static TextToSpeech mTts = null;   
private static boolean isSpeaking = false; 
private static BroadcastReceiver receiver = new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getAction().equals(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED) && mTts != null) 
     { 
      isSpeaking = false; 
     } 
    } 
}; 

private static void Speak(String sMessage, int intQueueType, int delay) { 
    if (mTts == null || sMessage == null) return; 
    sMessage = sMessage.trim(); 
    isSpeaking = true; 
    if (delay > 0) { 
     mTts.playSilence(delay, intQueueType, null); 
     intQueueType = TextToSpeech.QUEUE_ADD; 
    } 
    mTts.speak(sMessage, intQueueType, null); 
} 

public static void Init(Context context) { 
    mTts = new TextToSpeech(context, (OnInitListener) context); 
    IntentFilter filter = new IntentFilter(TextToSpeech.ACTION_TTS_QUEUE_PROCESSING_COMPLETED); 
    context.registerReceiver(receiver, filter); 
} 

public static void Shutdown() { 
    if (mTts != null) { 
     mTts.stop(); 
     mTts.shutdown(); 
    } 
} 

public static boolean isSpeaking() { 
    return isSpeaking; 
} 

} 
संबंधित मुद्दे

 संबंधित मुद्दे