2017-07-15 7 views
0

J'ai fait un chatbot en utilisant le tutoriel en ligne, Maintenant, en dehors de l'écriture en texte d'édition en entrée, j'utilise la reconnaissance vocale aussi. mais le problème est que les tts ne fonctionnent pas quand j'appuie sur le bouton de reconnaissance vocale. Je ne sais pas quel est le problème que j'ai utilisé diverses méthodes. tts fonctionne bien lors de l'envoi de texte à partir du champ de texte d'édition. Voici l'exemple de deux codes de l'activité principale. Le premier code est pour l'envoi de texte via le bouton d'envoi et fonctionne bien. Le deuxième code est le wone que j'utilise stt pour discuter et les tts ne fonctionnent pas. Besoin d'aide pour résoudre le problème. Merci d'avance.Mon texte à la parole ne fonctionne pas, quand je donne le discours au texte comme entrée dans Android chatbot

public class MainActivity extends AppCompatActivity { 

    private ListView mListView; 
    private FloatingActionButton mButtonSend; 
    private EditText mEditTextMessage; 
    private ImageView mImageView; 
    public Bot bot; 
    public static Chat chat; 
    private ChatMessage.ChatMessageAdapter mAdapter; 
    public Button buSpeak; 
    public TextToSpeech tts; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
      @Override 
      public void onInit(int status) { 

       if (status != TextToSpeech.ERROR){ 
        tts.setLanguage(Locale.US); 

       } 

      } 
     }); 

     mListView = (ListView) findViewById(R.id.listView); 
     mButtonSend = (FloatingActionButton) findViewById(R.id.btn_send); 
     mEditTextMessage = (EditText) findViewById(R.id.et_message); 
     mImageView = (ImageView) findViewById(R.id.iv_image); 
     mAdapter = new ChatMessage.ChatMessageAdapter(this, new ArrayList<ChatMessage>()); 
     mListView.setAdapter(mAdapter); 
     buSpeak = (Button)findViewById(R.id.buSpeak); 

     CheckUserPermsions(); 

     //chat button 

     mButtonSend.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       String message = mEditTextMessage.getText().toString(); 
       //bot 
       String response = chat.multisentenceRespond(mEditTextMessage.getText().toString()); 
       if (TextUtils.isEmpty(message)) { 
        return; 
       } 
       sendMessage(message); 
       mimicOtherMessage(response); 
       mEditTextMessage.setText(""); 
       mListView.setSelection(mAdapter.getCount() - 1); 

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 

        tts.speak(response, TextToSpeech.QUEUE_FLUSH,null,null); 

       }else{ 
        tts.speak(response, TextToSpeech.QUEUE_FLUSH,null); 
       } 

      } 
     }); 

et le code pour l'utilisation de reconnaissance vocale, ici les tts ne fonctionnent pas

public void buSpeak(View view) { 

     startVoiceRecognitionActivity(); 

    } 


    private void startVoiceRecognitionActivity() { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 

     intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); 


     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     //since you only want one, only request 1 
     intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); 

     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "en-US"); 

     startActivityForResult(intent, 1234); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (resultCode == Activity.RESULT_OK){ 

      tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() { 
       @Override 
       public void onInit(int status) { 

        if (status != TextToSpeech.ERROR){ 
         tts.setLanguage(Locale.US); 
        } 
       } 
      }); 

      //pull all of the matches 
      ArrayList<String> matches = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); 

      String topResult = matches.get(0); 

      EditText AutoText = (EditText) findViewById(R.id.et_message); 
      AutoText.setText(topResult); 

      String message = AutoText.getText().toString(); 
      //bot 
      String response = chat.multisentenceRespond(AutoText.getText().toString()); 
      if (TextUtils.isEmpty(response)) { 
       return; 
      } 
      sendMessage(message); 
      mimicOtherMessage(response); 

      AutoText.setText(""); 
      mListView.setSelection(mAdapter.getCount() - 1); 

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ 

       tts.speak(response, TextToSpeech.QUEUE_FLUSH,null,null); 
      }else{ 
       tts.speak(response, TextToSpeech.QUEUE_FLUSH,null); 
      } 
     } 
    } 

    public void CheckUserPermsions(){ 
     if (Build.VERSION.SDK_INT >= 23){ 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != 
        PackageManager.PERMISSION_GRANTED ){ 
       requestPermissions(new String[]{ 
           android.Manifest.permission.READ_EXTERNAL_STORAGE}, 
         REQUEST_CODE_ASK_PERMISSIONS); 
       return ; 
      } 
     } 

    } 

    //get acces to location permsion 
    final private int REQUEST_CODE_ASK_PERMISSIONS = 123; 



    @Override 
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { 
     switch (requestCode) { 
      case REQUEST_CODE_ASK_PERMISSIONS: 
       if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show(); 

       } else { 

        // Permission Denied 
        Toast.makeText(this,"denail" , Toast.LENGTH_SHORT) 
          .show(); 
       } 
       break; 
      default: 
       super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
     } 
    } 

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

Répondre

0

simplement appeler cette méthode et passer votre texte dans cette méthode

public void textToSpeech(String message){ 
      if (result==TextToSpeech.LANG_NOT_SUPPORTED ||result==TextToSpeech.LANG_MISSING_DATA){ 
       Toast.makeText(Activity.this, "Language is Not Supported", Toast.LENGTH_SHORT).show(); 
      }else { 
       String text=message; 
       if (text==null||text.equals("")){ 
        text="Text is Empty"; 
       } 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
        textToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH,null,null); 
       } else { 
        textToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH,null); 
       } 
      } 

     } 
+0

Merci. bien mais j'ai seulement besoin de la réponse du chatbot pour parler. Je donne la contribution de la voix et ça fonctionne bien. et en prenant la réponse des robots automatiquement sur la méthode onActivityResult. qui montre la réponse du robot directement sur l'écran de chat mais il ne parle pas. le premier code est celui que j'utilise pour taper et la réponse est tts fonctionne parfaitement. Le deuxième code le tts ne fonctionne pas en prenant la réponse directement au lieu d'utiliser le bouton. – Shahriar

0

D'accord, je l'ai résolu le problème, Au lieu de onPause juste utilisé onDestry après tts. et ajouté tts.stop(); dans la méthode du bouton buSpeak pour arrêter tts lorsque ce bouton est enfoncé.

`code ci-dessous

buSpeak public void (Voir vue) {

tts.stop(); 

    startVoiceRecognitionActivity(); 

} 

//after all other steps 

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

}