2017-07-15 2 views
0

Ich machte einen Chatbot mit Online-Tutorial, Jetzt abgesehen von Schreiben in Text bearbeiten als Eingabe ich Spracherkennung auch verwenden. aber das Problem ist, dass die TTS nicht funktionieren, wenn ich die Spracherkennungstaste drücke. Ich weiß nicht, was das Problem ist, das ich verschiedene Methoden verwendete. tts funktioniert gut, während Sie Text aus dem Bearbeitungsfeld senden. Hier ist das Beispiel für zwei Codes in der Hauptaktivität. Erster Code ist zum Senden von Text per Senden-Taste und funktioniert gut. Zweiter Code ist der Wone, den ich zum Chatten stt benutze und tts funktionieren nicht. Brauchen Sie Hilfe, um das Problem zu beheben. Danke im Voraus.Mein Text zu Rede funktioniert nicht, wenn ich Rede geben, um Text als Eingabe in 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); 
       } 

      } 
     }); 

und den Code für die Spracherkennung verwenden, hier die tts funktionieren nicht

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

Antwort

0

rufen Sie diese Methode und Ihren Text in diese Methode übergeben

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

Dank. naja aber ich brauche nur die antwort vom Chatbot zu sprechen. Ich gebe den Input von der Stimme und es funktioniert gut. und die Robotereaktion automatisch auf der Methode onActivityResult ausführen. Das zeigt die Antwort des Roboters direkt auf dem Chat-Bildschirm, aber es spricht nicht. der erste Code ist der, den ich benutze, um zu tippen und die Antwort ist tts funktioniert perfekt. Der zweite Code der TTS funktioniert nicht, wenn die Antwort direkt mit der Verwendung der Schaltfläche beantwortet wird. – Shahriar

0

Okay, ich gelöst haben Das Problem, anstatt OnPause nur onDestry nach TTS verwendet. und hinzugefügt tts.stop(); in buSpeak button Methode, um TTS zu stoppen, wenn diese Taste gedrückt wird.

`Code unten

public void buSpeak (Ansicht Ansicht) {

tts.stop(); 

    startVoiceRecognitionActivity(); 

} 

//after all other steps 

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

}