2012-02-26 6 views
9

Tôi đang phát triển một ứng dụng rất đơn giản tại đây. Nó dành cho con gái của tôi. Nó chỉ là một nút YES và NO lớn, vì vậy cô ấy có thể nhấn chúng khi được yêu cầu.Android không thừa nhận TTS Engine

Vâng ... Tôi đang sử dụng Engine SVTS Classic TTS.

Mọi thứ đều chạy trơn tru cho đến khi máy tính bảng của tôi nâng cấp lên ICS. Bây giờ, mỗi khi tôi chạy ứng dụng, nó sẽ mở ra thị trường yêu cầu tôi cài đặt TTS. Tôi nhấn "trở lại" và sau đó, ứng dụng của tôi nói. Đây là RẤT gây phiền nhiễu.

Đây là những gì Google API nói:

* Một tấm séc thành công sẽ được đánh dấu bằng một mã kết quả CHECK_VOICE_DATA_PASS, cho thấy thiết bị này đã sẵn sàng để nói chuyện, sau khi tạo đối tượng TextToSpeech của chúng tôi. Nếu không, chúng tôi cần cho người dùng biết để cài đặt dữ liệu cần thiết cho thiết bị để trở thành một máy nói chuyện đa ngôn ngữ! Việc tải xuống và cài đặt dữ liệu được thực hiện bằng cách kích hoạt ý định ACTION_INSTALL_TTS_DATA, sẽ đưa người dùng đến Android Market và sẽ cho phép cô ấy bắt đầu tải xuống. Việc cài đặt dữ liệu sẽ tự động diễn ra khi quá trình tải xuống hoàn tất. Dưới đây là một ví dụ về những gì thực hiện của bạn của onActivityResult() sẽ trông như thế: *

đây là mã của tôi:

public class yesOunoActivity extends Activity implements OnInitListener{ 
ImageView yes; 
ImageView no; 
public TextToSpeech tts; 
private int MY_DATA_CHECK_CODE = 0; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    Intent checkIntent = new Intent(); 
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE); 

    tts = new TextToSpeech(this, this); 

    setContentView(R.layout.yesorno); 

    yes = (ImageView) findViewById(R.id.yes); 
    no = (ImageView) findViewById(R.id.no); 


    yes.setClickable(true); 
    yes.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent arg1) { 

      if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {        
       tts.speak("yes!", TextToSpeech.QUEUE_ADD, null); 
      } 
      return true; 
     } 
    }); 


    no.setClickable(true); 
    no.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent arg1) { 

      if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {        

       //Intent myIntent = new Intent(v.getContext(), ParametrosActivity.class); 
       tts.speak("no!", TextToSpeech.QUEUE_ADD, null); 
      } 
      return true; 
    } 

    }); 


} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
      // success, create the TTS instance 
      tts = new TextToSpeech(this, this); 
     } else { 
      // missing data, install it 
      //ATTENTION: BELOW THIS GIVES ME PROBLEMS SINCE IT OPENS MARKET 
      //AND I HAVE TO HIT THE BACK BUTTON, THEN, IT SPEAKS! 
      //BTW TTS ENGINE "IS" INSTALLED!! 
      Intent installIntent = new Intent(); 
      installIntent 
        .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
     } 
    } 

} 

@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 
    } else if (status == TextToSpeech.ERROR) { 
    } 
} 

@Override 
public void onDestroy() { 
    if (tts != null) { 
     tts.stop(); 
     tts.shutdown(); 
    } 
    super.onDestroy(); 
    System.gc(); 
} 

    } 

Nếu tôi loại bỏ khu vực này với "Chú ý" ở trên (kể từ khi tôi chắc chắn tôi có TTS cài đặt), nó hoạt động lần đầu tiên tôi chạy ứng dụng, nếu tôi rời khỏi ứng dụng và tôi mở lại nó, nó nói "nói không thành công: không bị ràng buộc với tts động cơ"

Nó giống như nó không tạo ra đối tượng TTS vì ứng dụng vẫn còn trong bộ nhớ.

Vì vậy, các bạn ... các bạn nghĩ sao tôi nên làm gì ??

Điều này khiến tôi phát điên và tôi thực sự cần giao tiếp với con gái của mình thông qua máy tính bảng!

Bất kỳ trợ giúp nào được đánh giá cao !!

+0

@Carols Pereira - Bạn có thể giải quyết vấn đề này không.một người dùng đã báo cáo rằng họ đang gặp phải vấn đề tương tự mà bạn gặp phải, nhưng khi chúng tôi thử nghiệm nó trong trình mô phỏng, nó hoạt động tốt cho chúng tôi. Bạn có thể xác định nguyên nhân gốc rễ của vấn đề này không? Đó có phải là một lỗi trong svox? – aquero

Trả lời

0

Đây là những gì tôi có trong onActivityResult(...)

@Override 
protected void onActivityResult(
     int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_DATA_CHECK_CODE) { 
/* 
     if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
      // success, create the TTS instance 
      mTts = new TextToSpeech(this, this); 
     } else { 
      // missing data, install it 
      Intent installIntent = new Intent(); 
      installIntent.setAction(
       TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent); 
     } 
*/ 
     if (mTts==null) { 
      Intent installIntent = new Intent(); 
      installIntent.setAction(
       TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
      startActivity(installIntent);       
     } 
     mTts = new TextToSpeech(this, this);     
    } 
} 

Thay vì sử dụng if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {...}, tôi kiểm tra nếu mTts đã được khởi tạo. Bạn cũng sẽ phải đặt mTtsstatic, như đã được đề cập bởi jlquant và Rakesh trong một bài đăng trước đó, vì vậy bạn sẽ chỉ có một trường hợp duy nhất của nó. Ví dụ: private static TextToSpeech mTts. Vì vậy, trừ khi bạn "Buộc dừng" ứng dụng hoặc nó ngừng hoạt động do lỗi, nó sẽ không còn gọi số startActivity(installIntent); - thủ phạm gây phiền nhiễu yêu cầu bạn cài đặt TTS mỗi lần.

0

trong ứng dụng của mình, tôi cũng đã sử dụng checkintent.setAction(...) để kiểm tra xem các tệp tts cần thiết đã được cài đặt (hoạt động như một nét duyên dáng trước khi nâng cấp lên ICS). Trong ICS, nó luôn trả về các tệp bị thiếu. Vì vậy, bây giờ tôi chỉ bỏ qua kiểm tra này: tôi đang tạo đối tượng và nó khởi tạo tốt. Hơn nữa tôi đã sử dụng hai trường hợp cho hai ngôn ngữ khác nhau. Điều này cũng có vẻ không hoạt động nữa. Bây giờ khi tôi đặt ngôn ngữ cho một trong các cá thể, cá thể khác của đối tượng được đặt thành cùng một ngôn ngữ (hoạt động giống như một cá thể).

0

tôi cố định này bằng cách cài đặt IVONA có cả động cơ TTS chữa khỏi tất cả các vấn đề, mặc dù tôi đang tìm kiếm các vấn đề khác như không tts mặc định được cài đặt bằng cách sử dụng hai cùng làm một công việc không phải là một sửa chữa lớn nhưng s sửa chữa nó,

Ngoài ra tôi không thể tìm thấy tùy chọn cho phép điện thoại cài đặt các ứng dụng phi thị trường tức là apk từ thẻ SD của tôi

+1

Bạn nên kết nối điện thoại với PC qua cáp gỡ lỗi USB và sau đó trên loại dòng lệnh: adb install Erol

0

Tôi đã gặp vấn đề tương tự và được giải quyết. Có lẽ đó là một vấn đề thời gian trong giới hạn, không chắc chắn, nhưng một hành động đơn giản trước khi nói giúp tôi. Dù sao tôi đã làm điều này:

mTts = new TextToSpeech(this, this);

String engine = mTts.getDefaultEngine();

mTts = new TextToSpeech(this, this,engine);

Log.d("","...something here...");

Sau đó, khi tôi nhấn nút speak của tôi, nó nói. Bạn nên xem trạng thái biến của mình trên phương thức OnInit. Có thể một separate thread có thể giúp nói chuyện trong ứng dụng.

Nhân tiện, nếu bạn chắc chắn TTS đã được cài đặt, bạn có thể xóa khối Intent checkIntent = new Intent(); để kiểm tra.

Tôi chắc chắn hy vọng điều này sẽ giúp bạn.

1

Tôi cũng gặp sự cố này trên ứng dụng của mình: TTS hoạt động trong 2.3, nhưng khi tôi thử 4.0, nó có cùng các triệu chứng như sự cố của bạn (mà tôi vừa tìm thấy trong khi tìm kiếm giải pháp). Động cơ sẽ hoạt động nếu bạn buộc đóng ứng dụng thông qua Cài đặt và khởi động lại nhưng chỉ "sao lưu" và quay lại làm cho công cụ TTS trong ICS không bị ràng buộc.

Tôi đã thử đặt đối tượng TTS (mTts) thành không sau khi chạy mTts.shutdown(). Khi tôi khởi động lại ứng dụng sau khi sao lưu, tôi gặp lỗi null trên đường dây mTts.speak() của mình.

Ít nhất cho ICS, một cái gì đó không cho phép tắt động cơ TTS. Giải pháp của tôi (bây giờ) là tôi đã làm TTS của tôi đối tượng tĩnh:

// in Activity 
private static TextToSpeech mTts; 
. 
. 
. 
// in onCreate() 
mTts = new TextToSpeech(this, this); 
. 
. 
. 
// in onDestroy() 
if (mTts != null) { 
    mTts.stop(); 
    mTts.shutdown(); 
    mTts = null; 
} 

tôi đã được chỉ sử dụng một đối tượng TTS cho ứng dụng vì vậy tôi không nghĩ rằng có quá nhiều nhược điểm để cách tiếp cận này.

-1

gingerbread phép thiết lập của tts mặc định trong đầu vào giọng & đầu ra/default tts

gingerbread cho phép tts chỉ 'ưa thích' trong ngôn ngữ và đầu vào/đầu ra văn bản để nói.

vì vậy tts được ưu tiên thay vì mặc định, điều này có nghĩa là nó không rõ ràng như được sử dụng.

Giá trị mặc định với ghi đè ứng dụng khi được nêu là tùy chọn tốt hơn tôi nghĩ.