Как получить прошлую информацию при преобразовании речи в текст в Android?

Поскольку я разрабатываю приложение для Android и хочу преобразовать речь в текст, я использую встроенную функцию ввода речи Google для преобразования голоса в текст. Мне нужна предыдущая информация, но она постоянно очищается, я получаю только текущий ответ. Как нужно обращаться с голосовой клавиатурой Google. Пока я говорю, он включен в текущую строку перед очисткой.

MainActivity.java

public class MainActivity extends AppCompatActivity
  {
     private EditText txtSpeechInput;
     private ImageButton btnSpeak;
     private final int REQ_CODE_SPEECH_INPUT = 100;

 @Override
  protected void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      txtSpeechInput =  findViewById(R.id.txtSpeechInput);
      btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
    btnSpeak.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            promptSpeechInput();
        }
    });
   private void promptSpeechInput()
      {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
            getString(R.string.speech_prompt));
    intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 20000000);

  try
    {
        startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
    }
    catch (ActivityNotFoundException a)
    {
        Toast.makeText(getApplicationContext(),
                getString(R.string.speech_not_supported),
                Toast.LENGTH_SHORT).show();
    }
}
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode)
    {
        case REQ_CODE_SPEECH_INPUT:
        {
            if (resultCode == RESULT_OK && null != data)
            {

              final ArrayList<String> result= data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);


                txtSpeechInput.setText(result.get(0));
            }
            break;
        }

    }
}

person Anjali Patel    schedule 21.02.2018    source источник
comment
что вы имеете в виду под прошлой информацией? Как я понимаю из вашего вопроса, вы также хотите получить ранее установленную строку?   -  person Abdul Waheed    schedule 21.02.2018
comment
да, именно @AbdulWaheed   -  person Anjali Patel    schedule 21.02.2018
comment
вы хотите сохранить только предыдущую строку или всю строку подряд?   -  person Abdul Waheed    schedule 21.02.2018
comment
хочу всю строку подряд. Когда он начал говорить, предыдущая строка не должна очищаться   -  person Anjali Patel    schedule 21.02.2018
comment
хм, хорошо, я обновляю свой ответ.   -  person Abdul Waheed    schedule 21.02.2018
comment
Я пробовал. Но не работает, он всегда очищается   -  person Anjali Patel    schedule 21.02.2018
comment
В этом случае поделитесь кодом, который вы пробовали... скажите мне еще одну вещь, которую вы хотите сохранить, даже если активность будет уничтожена? Я имею в виду, что вы переходите к другой деятельности и возвращаетесь, а список пуст? это тот случай, с которым вы столкнулись?   -  person Abdul Waheed    schedule 21.02.2018
comment
если вы хотите хранить данные на протяжении всей жизни приложения, вы можете сделать эту переменную списка статической.   -  person Abdul Waheed    schedule 21.02.2018


Ответы (3)


Если вы хотите сохранить только одну ранее обнаруженную строку, для этого вам нужно создать глобальную строковую переменную и сохранить значение в этой переменной из списка результатов (сохраните ту же строку, которую вы устанавливаете в текстовом представлении). Но если вы хотите сохранить все строки, вам нужно создать глобальный String Arraylist и добавить все эти строки в этот список массивов. Ниже приведен код для этого.

private EditText txtSpeechInput;
private ImageButton btnSpeak;
private final int REQ_CODE_SPEECH_INPUT = 100;
private List<String> previousStringList;

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

    previousStringList = new ArrayList<>();

    txtSpeechInput = findViewById(R.id.txtSpeechInput);
    btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
    btnSpeak.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            promptSpeechInput();
        }
    });
}

private void promptSpeechInput() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
    intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
            getString(R.string.speech_prompt));
    intent.putExtra(RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 20000000);

    try {
        startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
    } catch (ActivityNotFoundException a) {
        Toast.makeText(getApplicationContext(),
                getString(R.string.speech_not_supported),
                Toast.LENGTH_SHORT).show();
    }
}

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                final ArrayList<String> result = data
                        .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);


                txtSpeechInput.setText(result.get(0));
                if (result.get(0) != null) {
                    previousStringList.add(result.get(0));
                }
            }
            break;
        }

    }
}

Надеюсь, это поможет вам. Если вы ничего не понимаете, не стесняйтесь спрашивать. Если вы не хотите сохранять одну и ту же строку дважды (уже сохраненную строку), просто замените ниже условную строку кода.

if (result.get(0) != null && !previousStringList.contains(result.get(0))) {
    previousStringList.add(result.get(0));
   }
person Abdul Waheed    schedule 21.02.2018

Слова сохраняются в списках массивов.

Вы можете увидеть пример реализации здесь, он отлично работает. Приложение сохраняет слова, а затем также выполняет запрошенное действие.

https://github.com/saumyabahu/Travel-Safe/blob/master/MainActivity.java

person Palak Bansal    schedule 22.02.2018

открытый класс MainActivity расширяет AppCompatActivity {

private SpeechRecognizer speechRecognizer;
private Intent intentRecognizer;
private EditText txtSpeechInput;

private ImageButton btnSpeak;

// это строка, в которой слова сохраняются и проходят строки с помощью курсора слева направо. Предыдущая строка = ;

// Результат ArrayList = null;

private final int REQ_CODE_SPEECH_INPUT = 100;


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

    // ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.RECORD_AUDIO}, PackageManager.PERMISSION_GRANTED );


    txtSpeechInput = findViewById( R.id.ed );


    btnSpeak = (ImageButton) findViewById( R.id.iButton );



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


            promptSpeechInput();


        }
    } );

}

private void promptSpeechInput() {
    Intent intent = new Intent( RecognizerIntent.ACTION_RECOGNIZE_SPEECH );
    intent.putExtra( RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM );
    intent.putExtra( RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault() );
    intent.putExtra( RecognizerIntent.EXTRA_PROMPT,
            getString( R.string.speech_prompt ) );

    intent.putExtra( RecognizerIntent.EXTRA_SPEECH_INPUT_MINIMUM_LENGTH_MILLIS, 20000000 );



    try {
        startActivityForResult( intent, REQ_CODE_SPEECH_INPUT );
    } catch (ActivityNotFoundException a) {
        Toast.makeText( getApplicationContext(),
                getString( R.string.speech_not_supported ),
                Toast.LENGTH_SHORT ).show();
    }

}


protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult( requestCode, resultCode, data );

    switch (requestCode) {
        case REQ_CODE_SPEECH_INPUT: {
            if (resultCode == RESULT_OK && null != data) {

                final ArrayList<String> result = data
                        .getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS );

// это настоящая проблема. txtSpeechInput.setText (предыдущий + + результат. получить (0));

                previous = txtSpeechInput.getText().toString();

                txtSpeechInput.setText( previous );




            }
            break;
        }

    }
}

}

person user14322221    schedule 22.09.2020