2012-02-15 13 views
6

मेरे अनुप्रयोगों में से एक में मेरी एक गतिविधि है जिसमें भाषण अल्फान्यूमेरिक संदर्भ तारों को संश्लेषित करता है, अक्षर/संख्या द्वारा पत्र/संख्या जैसे "एबीसी 123" "आय, मधुमक्खी, समुद्र, एक दो तीन" । चूंकि यह ध्वनियों का एक सीमित सेट है, मैंने सोचा था कि टीटीएस इंजन प्लेएरकॉन विधि का उपयोग कर संख्याओं और अक्षरों की पूर्ववर्ती .wav फ़ाइलों को चलाकर इंटरनेट कनेक्शन के बिना काम करने में सक्षम होना अच्छा होगा।TextToSpeech, playEarcon और .wav फ़ाइलें

मैंने सभी 36 WAV फ़ाइलों को res/raw फ़ोल्डर में रखा है और टीटीएस इंजन को प्रारंभ करते समय संसाधन आईडी को अक्षरों में मैप किया है। यह अच्छी तरह से काम करता है, हालांकि .apk अब बहुत बड़ा है क्योंकि WAV फ़ाइलों को एपीके में असंपीड़ित किया जाता है। मैं एपीके का आकार छोटा बनाना चाहता हूं।

the answer to another question में यह बताता है कि WAV फ़ाइलों को संपीड़न से बाहर रखा गया है। (मुझे नहीं लगता कि क्यों, वे आम तौर पर मूल के लगभग 40% तक ज़िप करते हैं) एपीके के इंटर्नल्स का निरीक्षण करते हुए, यह सच साबित होता है।

चूंकि संसाधन फ़ाइलों के विस्तार को कोड में संदर्भित नहीं किया गया है, इसलिए मैंने wavs का नाम बदलने की कोशिश की, विभिन्न प्रकार के .waw, .abc, .spc। ये सभी संपीड़ित हो जाते हैं लेकिन दुर्भाग्य से playEarcon विधि तब तक उत्पन्न नहीं होती जब तक कि एक्सटेंशन नहीं है। Wav।

संक्षेप में मैं टीटीएस इंजन को WAV एक्सटेंशन के बिना फ़ाइलों को चलाने में मजबूर करना चाहता हूं, या इसे .wav फ़ाइलों को संपीड़ित करने के लिए राजी करना चाहता हूं।

सभी सुझावों को आभारी रूप से प्राप्त किया जाएगा। इसके लायक होने के लिए मैं नीचे सबसे छोटा प्रदर्शन कोड नमूना पोस्ट कर रहा हूं। मेरी काम करने वाली फाइलों का नाम gb_a.wav, gb_b.wav आदि रखा गया है। यदि एक्सटेंशन बदल दिया गया है, तो वे ध्वनि रोकना बंद कर देते हैं।

public class WavSpeakerActivity extends Activity implements 
     RadioGroup.OnCheckedChangeListener, TextToSpeech.OnInitListener { 

    static final int mGBLetterResIds[] = { R.raw.gb_a, R.raw.gb_b, R.raw.gb_c, 
      R.raw.gb_d, R.raw.gb_e, R.raw.gb_f, R.raw.gb_g, R.raw.gb_h, 
      R.raw.gb_i, R.raw.gb_j, R.raw.gb_k, R.raw.gb_l, R.raw.gb_m, 
      R.raw.gb_n, R.raw.gb_o, R.raw.gb_p, R.raw.gb_q, R.raw.gb_r, 
      R.raw.gb_s, R.raw.gb_t, R.raw.gb_u, R.raw.gb_v, R.raw.gb_w, 
      R.raw.gb_x, R.raw.gb_y, R.raw.gb_z }; 
    static final int mGBNumberResIds[] = { R.raw.gb_zero, R.raw.gb_one, 
      R.raw.gb_two, R.raw.gb_three, R.raw.gb_four, R.raw.gb_five, 
      R.raw.gb_six, R.raw.gb_seven, R.raw.gb_eight, R.raw.gb_nine }; 

    static final String mGbStr = "GB"; 
    static final String mAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    static final String mNumbers = ""; 
    private String mPpackageName = null; 
    private String mTextToSpeak = null; 
    private RadioGroup mRadioGroup = null;// two buttons one sets letters, the other numbers 
    private TextToSpeech mTts = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     mTts = new TextToSpeech(this, this); 
     mRadioGroup = (RadioGroup) findViewById(R.id.radioGroup1); 
     mRadioGroup.setOnCheckedChangeListener(this); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     RadioGroup rg = (RadioGroup) findViewById(R.id.radioGroup1); 
     switchText(rg); 
     mPpackageName = getPackageName(); 
    } 

    @Override 
    public void onDestroy() { 
     // Don't forget to shutdown speech engine 
     if (mTts != null) { 
      mTts.stop(); 
      mTts.shutdown(); 
     } 
     super.onDestroy(); 
    } 

    private void switchText(RadioGroup rg) { 
     // select letters or digits as the String to speak 
     int checkedButton = rg.getCheckedRadioButtonId(); 
     switch (checkedButton) { 
      case R.id.alphabet: 
       mTextToSpeak = mAlphabet; 
       break; 
      case R.id.numbers: 
       mTextToSpeak = mNumbers; 
       break; 
     } 
    } 

    public void myClickHandler(View target) { 
     // Just the one button has been clicked - the 'Speak' one 
     String earconKey; 
     String lang = Locale.UK.getCountry(); // will be "GB", just have UK in this small example 
     mTts.setLanguage(Locale.UK); // skip error checking for brevity's sake 
     String text = mTextToSpeak.replaceAll("\\s", "");// remove spaces (if any) 
     char c; 
     for (int i = 0; i < text.length(); i++) { 
      c = text.charAt(i); 
      if (Character.isLetter(c) || Character.isDigit(c)) { 
       earconKey = lang + Character.toString(c); // GBA, GBB..GBZ, GB0.. GB9 
       mTts.playEarcon(earconKey, TextToSpeech.QUEUE_ADD, null); 
      } 
     } 
    } 

    @Override 
    public void onInit(int status) { 
     // doesn't seem we need to check status or setLanguage if we're just playing earcons 
     mapEarCons(); // map letter/digit sounds to resource ids 
    } 

    private void mapEarCons() { 
     String key; 
     for (char c = 'A'; c <= 'Z' ; c++){ 
      key = mGbStr + Character.toString(c); // GBA, GBB .. GBZ 
      mTts.addEarcon(key, mPpackageName, mGBLetterResIds[c - 'A']);// add it 
     } 
     for (int i = 0 ; i <= 9; i++){ 
      key = mGbStr + Integer.toString(i); // GB0, GB1 .. GB9 
      mTts.addEarcon(key, mPpackageName, mGBNumberResIds[i]); 
     } 
    } 

    @Override 
    public void onCheckedChanged(RadioGroup rg, int arg1) { switchText(rg); } 
} 

। ।

उत्तर

1
  1. क्यों wav फ़ाइलों को संपीड़ित करने की कोशिश नहीं की जाती है: according wikipedia Wav फ़ाइल डेटा के लिए एक कंटेनर है। अक्सर इसे असम्पीडित पीसीएम ध्वनि के लिए उपयोग किया जाता है, लेकिन विभिन्न कोडेक्स से संपीड़ित डेटा को स्टोर करने के लिए भी इसका उपयोग किया जा सकता है (उदाहरण के लिए wFormatTags (संग्रहीत डेटा के लिए टाइप करें) के लिए संभावित मान पा सकते हैं उदाहरण के लिए here)।
  2. आप अपने संसाधन को स्थानीय फाइल सिस्टम में सहेज सकते हैं और addEarcon(String earcon, String packagename, int resourceId) के बजाय addEarcon(String earcon, String filename) का उपयोग कर सकते हैं।
  3. आप संपीड़ित प्रकारों से बाहर की गई WAV फ़ाइलों के साथ एपीके बनाने के लिए -0 wav cmd लाइन स्विच के साथ एपेट का उपयोग कर सकते हैं।
+0

अपने अंक (1) - यह एंड्रॉइड बिल्ड प्रक्रिया है जो उन्हें संपीड़न से बाहर रखती है (मुझे उद्धृत लिंक देखें), मैं इसे ओवरराइड करने का एक तरीका ढूंढना चाहता था। (2) मैं अपने एपीके में wavs को पैकेज करना चाहता हूं (3) मैं उन्हें संपीड़न से क्यों बाहर करना चाहता हूं? वे पहले से ही बाहर रखा गया है, यह इस सवाल का मुद्दा है - मैं उन्हें संपीड़ित करना चाहता हूं! – NickT

+0

के बारे में (3), मेरी गलती क्षमा करें। खैर, मुझे लगता है कि आप एपैप टूल स्रोत डाउनलोड कर सकते हैं, डिफ़ॉल्ट रूप से संपीड़ित नहीं किए गए प्रकारों से WAV को बाहर कर सकते हैं, इसे पुनर्निर्माण कर सकते हैं और इस नए टूल के साथ अपना अनुकूल बना सकते हैं। लेकिन मैंने यह कोशिश नहीं की - इसलिए यह संभव है कि इस तरह के संसाधन को लोड करने से इनकार करने से एसेट मैनेजर। –

0

आपको wav फ़ाइल को ogg फ़ाइल में कनवर्ट करने का प्रयास करना चाहिए, तो आपको ध्वनि फ़ाइल के लिए सबसे अच्छी संपीड़न दर मिल जाएगी।

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