2012-02-15 27 views
6

Trong một trong các ứng dụng của tôi, tôi có một hoạt động mà tổng hợp các chuỗi tham chiếu bằng chữ và số, chữ cái/số theo chữ cái/số, ví dụ "ABC123" có âm "Ay, bee, sea, one two three" . Vì đây là một tập hợp âm thanh hạn chế nên tôi nghĩ sẽ tốt khi cho phép động cơ TTS hoạt động mà không cần kết nối internet bằng cách phát các tệp .wav được ghi lại trước tiên của các số và chữ cái bằng phương thức playEarcon.Các tập tin TextToSpeech, playEarcon và .wav

Tôi đã đặt tất cả 36 tệp wav trong thư mục res/raw và ánh xạ các id tài nguyên vào các chữ cái khi khởi tạo công cụ TTS. Điều này hoạt động tốt, tuy nhiên các .apk bây giờ là lớn hơn nhiều như các tập tin wav được lưu trữ không nén trong apk. Tôi muốn làm cho kích thước của gói ứng dụng nhỏ hơn.

Trong the answer to another question, nó cho biết tệp wav bị loại trừ khỏi nén. (Tôi không hiểu tại sao, vì chúng thường nén xuống khoảng 40% bản gốc) Một kiểm tra nội bộ của gói ứng dụng, điều này có vẻ đúng.

Vì phần mở rộng của các tệp tài nguyên không được nhắc đến trong mã, tôi đã thử đổi tên các tệp wav, thành nhiều dạng khác nhau .waw, .abc, .spc. Tất cả những điều này được nén nhưng tiếc là phương thức playEarcon không tạo ra âm thanh khi được gọi trừ khi phần mở rộng là .wav.

Tóm lại, tôi muốn ép buộc công cụ TTS phát các tệp không có phần mở rộng wav hoặc thuyết phục nó nén các tệp .wav.

Tất cả các đề xuất sẽ được nhận biết ơn. Đối với những gì nó có giá trị tôi gửi mẫu mã chứng minh nhỏ nhất dưới đây. Các tệp đang hoạt động của tôi có tên gb_a.wav, gb_b.wav v.v. Nếu phần mở rộng được thay đổi, chúng sẽ ngừng phát âm.

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

. .

Trả lời

1
  1. Tại sao tệp wav không bị nén: according wikipedia tệp wav là vùng chứa dữ liệu. Thường xuyên nhất nó được sử dụng cho âm thanh PCM không nén, nhưng cũng có thể được sử dụng để lưu trữ dữ liệu được nén bằng các codec khác nhau (bạn có thể tìm các giá trị có thể cho wFormatTags (loại dữ liệu được lưu trữ) ví dụ here).
  2. Bạn có thể lưu tài nguyên của mình vào hệ thống tệp cục bộ và sử dụng addEarcon(String earcon, String filename) thay vì addEarcon(String earcon, String packagename, int resourceId).
  3. Bạn có thể sử dụng aapt với công cụ chuyển đổi dòng -0 wav cmd để tạo gói ứng dụng với các tệp wav bị loại trừ khỏi các loại đã nén.
+0

Hãy để lại điểm của bạn (1) - đó là quy trình tạo Android không bao gồm chúng từ nén (xem liên kết tôi đã trích dẫn), tôi muốn tìm cách ghi đè điều này. (2) Tôi muốn gói các wav trong apk của tôi (3) Tại sao tôi muốn loại trừ chúng khỏi nén? Họ đã bị loại trừ, đó là điểm của câu hỏi này - tôi muốn nén chúng! – NickT

+0

về (3), xin lỗi lỗi của tôi. Vâng, tôi nghĩ rằng, bạn có thể tải về các nguồn công cụ aapt, loại bỏ wav từ các loại không nén theo mặc định, xây dựng lại nó và làm cho apt của bạn với công cụ mới này. Nhưng tôi đã không cố gắng này - vì vậy nó có thể là AssetManager hơn từ chối tải tài nguyên như vậy. –

0

Bạn nên cố gắng chuyển đổi tệp wav thành tệp ogg, sau đó bạn sẽ nhận được tỷ lệ nén tốt nhất cho tệp âm thanh.

Các vấn đề liên quan