2012-07-10 33 views
7

Tôi đang phát triển ứng dụng Android, trong đó tôi đang sử dụng chuyển đổi văn bản thành giọng nói. Tôi cần gì khi mở ứng dụng chạy văn bản sang chuyển đổi giọng nói. Sau khi hoàn thành điều này, tôi muốn làm một số điều. Mã của tôi trông giống nhưKhông thể phát hiện hoàn thành TTS (gọi lại) android.

public class Mainactivity extends Activity implements OnInitListener, OnUtteranceCompletedListener{ 
    private static int REQ_CODE = 1; 
    private TextToSpeech tts = null; 
    private boolean ttsIsInit = false; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    startTextToSpeech(); 
    } 

    private void startTextToSpeech() { 
     Intent intent = new Intent(Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(intent, REQ_CODE); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQ_CODE) { 
      if (resultCode == Engine.CHECK_VOICE_DATA_PASS) { 
       tts = new TextToSpeech(this, this); 
      } 
      else { 
       Intent installVoice = new Intent(Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installVoice); 
      } 
     } 
    } 

     public void onInit(int status) { 
      if (status == TextToSpeech.SUCCESS) { 
       ttsIsInit = true; 
       int result = tts.setOnUtteranceCompletedListener(this); 
       if (tts.isLanguageAvailable(Locale.ENGLISH) >= 0) 
        tts.setLanguage(Locale.ENGLISH); 
       tts.setPitch(5.0f); 
       tts.setSpeechRate(1.0f); 

       HashMap<String, String> myHashAlarm = new HashMap<String, String>(); 
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
        myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "SOME MESSAGE"); 
        tts.speak("hi how are you?", TextToSpeech.QUEUE_FLUSH, myHashAlarm); 
      } 
     } 

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

    @Override 
    public void onUtteranceCompleted(String uttId) { 
     Toast.makeText(Mainactivity.this,"done", Toast.LENGTH_LONG).show(); 
     if (uttId.equalsIgnoreCase("done")) { 
      Toast.makeText(Mainactivity.this,"inside done", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

Khi tôi mở văn bản ứng dụng thành lời nói hoạt động tốt. Nhưng làm thế nào để phát hiện liệu văn bản để nói hoàn thành hay không.Need giúp ..... Cảm ơn bạn .....

Trả lời

7

Nếu bạn đang sử dụng API cấp 15 hoặc mới hơn, bạn có thể đặt trình nghe tiến trình trên tham chiếu TextToSpeech của mình bằng cách sử dụng

setOnUtteranceProgressListener(UtteranceProgressListener listener) 

Bạn sẽ nhận được cuộc gọi lại báo cáo tiến độ của TTS, bao gồm gọi lại khi hoàn tất. Xem http://developer.android.com/reference/android/speech/tts/TextToSpeech.htmlhttp://developer.android.com/reference/android/speech/tts/UtteranceProgressListener.html

Tuy nhiên, tôi nhận thấy rằng bạn đã sử dụng không dùng nữa OnUtteranceCompletedListener. Bạn có nhận được cuộc gọi lại trên onUtteranceCompleted() không? Điều đó cũng sẽ hoạt động.

+0

Hi david tôi đã cố gắng cho bạn giải pháp nhưng nó mang lại cho tôi lỗi cho setOnUtteranceProgressListener.And cho onUtteranceCompleted nó thực hiện mà không có lỗi nhưng không đưa ra thông báo trong onUtteranceCompleted để có cách giải quyết vấn đề này. Cho dù tôi đang làm bất cứ điều gì sai.Need Trợ giúp ... – nilkash

+1

Bạn gọi 'int result = tts.setOnUtteranceCompletedListener (thi s);' để thiết lập người nghe. Kiểm tra giá trị của biến 'result'. THÀNH CÔNG (0) hoặc ERROR (-1) sẽ trở lại. Ngoài ra, thêm một số đăng nhập vào 'onUtteranceCompleted()' để xem liệu nó có thực sự ở đó hay không. Ngoài ra kiểm tra logcat của bạn cho bất kỳ lỗi lạ khác. –

+0

Cảm ơn bạn đã cảm ơn vì đã trả lời. Làm việc của nó fine.I sử dụng đăng nhập thay vì bánh mì nướng và làm việc tốt của nó. Cảm ơn bạn... – nilkash

3

Dưới đây là một số mã từ here giúp bạn tương thích ngược, do đó bạn không cần phải nhắm mục tiêu 15.

private void setTtsListener() 
    { 
     final SpeechRecognizingAndSpeakingActivity callWithResult = this; 
     if (Build.VERSION.SDK_INT >= 15) 
     { 
      int listenerResult = tts.setOnUtteranceProgressListener(new UtteranceProgressListener() 
      { 
       @Override 
       public void onDone(String utteranceId) 
       { 
        callWithResult.onDone(utteranceId); 
       } 

       @Override 
       public void onError(String utteranceId) 
       { 
        callWithResult.onError(utteranceId); 
       } 

       @Override 
       public void onStart(String utteranceId) 
       { 
        callWithResult.onStart(utteranceId); 
       } 
      }); 
      if (listenerResult != TextToSpeech.SUCCESS) 
      { 
       Log.e(TAG, "failed to add utterance progress listener"); 
      } 
     } 
     else 
     { 
      int listenerResult = tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() 
      { 
       @Override 
       public void onUtteranceCompleted(String utteranceId) 
       { 
        callWithResult.onDone(utteranceId); 
       } 
      }); 
      if (listenerResult != TextToSpeech.SUCCESS) 
      { 
       Log.e(TAG, "failed to add utterance completed listener"); 
      } 
     } 
    } 
7

Gọi setOnUtteranceCompletedListener bên trong hàm OnInit của đối tượng tts.

Nếu bạn muốn thực hiện bất kỳ thay đổi nào đối với giao diện người dùng trên cuộc gọi của hàm onUtteranceCompleted, hãy thêm mã bên trong phương thức runOnUIThread.

Và đừng nhớ để thêm giá trị HashMap param trong khi gọi hàm speak()

Ví dụ:

TextToSpeech tts= new TextToSpeech(context, new OnInitListener() { 

@Override 
public void onInit(int status) { 

    mTts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener() { 

     @Override 
     public void onUtteranceCompleted(String utteranceId) { 

      runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
       //UI changes 
       } 
      }); 
     } 
    }); 

} 
}); 


HashMap<String, String> params = new HashMap<String, String>(); 

params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId"); 

tts.speak("Text to Speak",TextToSpeech.QUEUE_FLUSH, params); 
Các vấn đề liên quan