मेरे अनुप्रयोगों में से एक में मेरी एक गतिविधि है जिसमें भाषण अल्फान्यूमेरिक संदर्भ तारों को संश्लेषित करता है, अक्षर/संख्या द्वारा पत्र/संख्या जैसे "एबीसी 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) - यह एंड्रॉइड बिल्ड प्रक्रिया है जो उन्हें संपीड़न से बाहर रखती है (मुझे उद्धृत लिंक देखें), मैं इसे ओवरराइड करने का एक तरीका ढूंढना चाहता था। (2) मैं अपने एपीके में wavs को पैकेज करना चाहता हूं (3) मैं उन्हें संपीड़न से क्यों बाहर करना चाहता हूं? वे पहले से ही बाहर रखा गया है, यह इस सवाल का मुद्दा है - मैं उन्हें संपीड़ित करना चाहता हूं! – NickT
के बारे में (3), मेरी गलती क्षमा करें। खैर, मुझे लगता है कि आप एपैप टूल स्रोत डाउनलोड कर सकते हैं, डिफ़ॉल्ट रूप से संपीड़ित नहीं किए गए प्रकारों से WAV को बाहर कर सकते हैं, इसे पुनर्निर्माण कर सकते हैं और इस नए टूल के साथ अपना अनुकूल बना सकते हैं। लेकिन मैंने यह कोशिश नहीं की - इसलिए यह संभव है कि इस तरह के संसाधन को लोड करने से इनकार करने से एसेट मैनेजर। –