2017-07-15 4 views
0

私はオンラインチュートリアルを使ってチャットボットを作った。問題は音声認識ボタンを押しても機能しないことです。私はさまざまな方法を使った問題は何か分かりません。編集テキストフィールドからテキストを送信している間、ttsはうまく動作します。ここには、主な活動における2つのコードのサンプルがあります。最初のコードは送信ボタンを介してテキストを送信するためのもので、正常に動作します。 2番目のコードは私がチャットにsttを使用していて、ttsは動作しません。問題を解決するためには助けが必要です。前もって感謝します。アンドロイドのチャットボットでテキストを入力したときにスピーチをしても動かない

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

      } 
     }); 

と音声認識を使用するためのコード、ここでTTSは

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

答えて

0

はちょうどこのメソッドを呼び出すと、この方法では、あなたのテキストを渡す動作しません、私は解決しているオーケー

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

おかげ以下

'コード。まあ、私は話すためにチャットボットの応答が必要です。私は声からのインプットを与えており、うまくいきます。 onActivityResultメソッドで自動的にロボットの応答を取得します。これはチャット画面上に直接ロボットの返信を表示しますが、それは話しません。最初のコードは私がタイプするのに使うもので、返信はttsが完全に機能しています。 2番目のコードは、ボタンを使用して直接insead応答を取るときには動作していません。 – Shahriar

0

問題は、onPauseの代わりに、単にonDestryをttsの後に使用しました。 と追加されたtts.stop();そのボタンが押されたときにttsを停止させるbuSpeakボタンメソッド。

ます。public void buSpeak(ビュービュー){

tts.stop(); 

    startVoiceRecognitionActivity(); 

} 

//after all other steps 

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

} 
関連する問題