it-swarm-ru.tech

Есть ли способ использовать SpeechRecognizer API напрямую для речевого ввода?

На веб-сайте Android Dev приведен пример выполнения речевого ввода с использованием встроенной функции ввода речи Google. Упражнение отображает предварительно настроенное всплывающее окно с микрофоном и передает результаты с помощью onActivityResult()

Мой вопрос: Есть ли способ использовать класс SpeechRecognizer напрямую для речевого ввода без отображения готовых действий? Это позволило бы мне создать свою собственную активность для голосового ввода. 

18
vladimir.vivien

Вот код, использующий класс SpeechRecognizer (полученный из здесь и здесь ):

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.speech.RecognitionListener;
import Android.speech.RecognizerIntent;
import Android.speech.SpeechRecognizer;
import Android.widget.Button;
import Android.widget.TextView;
import Java.util.ArrayList;
import Android.util.Log;



public class VoiceRecognitionTest extends Activity implements OnClickListener 
{

   private TextView mText;
   private SpeechRecognizer sr;
   private static final String TAG = "MyStt3Activity";
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button speakButton = (Button) findViewById(R.id.btn_speak);     
            mText = (TextView) findViewById(R.id.textView1);     
            speakButton.setOnClickListener(this);
            sr = SpeechRecognizer.createSpeechRecognizer(this);       
            sr.setRecognitionListener(new listener());        
   }

   class listener implements RecognitionListener          
   {
            public void onReadyForSpeech(Bundle params)
            {
                     Log.d(TAG, "onReadyForSpeech");
            }
            public void onBeginningOfSpeech()
            {
                     Log.d(TAG, "onBeginningOfSpeech");
            }
            public void onRmsChanged(float rmsdB)
            {
                     Log.d(TAG, "onRmsChanged");
            }
            public void onBufferReceived(byte[] buffer)
            {
                     Log.d(TAG, "onBufferReceived");
            }
            public void onEndOfSpeech()
            {
                     Log.d(TAG, "onEndofSpeech");
            }
            public void onError(int error)
            {
                     Log.d(TAG,  "error " +  error);
                     mText.setText("error " + error);
            }
            public void onResults(Bundle results)                   
            {
                     String str = new String();
                     Log.d(TAG, "onResults " + results);
                     ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                     for (int i = 0; i < data.size(); i++)
                     {
                               Log.d(TAG, "result " + data.get(i));
                               str += data.get(i);
                     }
                     mText.setText("results: "+String.valueOf(data.size()));        
            }
            public void onPartialResults(Bundle partialResults)
            {
                     Log.d(TAG, "onPartialResults");
            }
            public void onEvent(int eventType, Bundle params)
            {
                     Log.d(TAG, "onEvent " + eventType);
            }
   }
   public void onClick(View v) {
            if (v.getId() == R.id.btn_speak) 
            {
                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);        
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test");

                intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5); 
                     sr.startListening(intent);
                     Log.i("111111","11111111");
            }
   }
}

Определите main.xml с помощью кнопки и дайте разрешение RECORD_AUDIO в манифесте

50
png

Вы можете использовать SpeechRecognizer, хотя я не знаю ни одного примера кода для него, кроме этот предыдущий вопрос SO . Тем не менее, это является новым для API уровня 8 (Android 2.2), и, следовательно, не широко используется на момент написания этой статьи.

1
CommonsWare

Также не забудьте запросить соответствующие разрешения у пользователя. Я застрял с возвращаемым значением ошибки 9: INSUFFICIENT_PERMISSIONS, хотя у меня были правильные разрешения RECORD_AUDIO, перечисленные в манифесте. 

Следуя примеру кода здесь я смог получить разрешения от пользователя, а затем распознаватель речи дал хорошие ответы. 

Например. Этот блок я поместил в свой onCreate () для действия, хотя он мог пойти куда-нибудь еще в потоке пользовательского интерфейса до вызова методов SpeechRecognizer:

    protected void onCreate(Bundle savedInstanceState) {
        ...
        if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.RECORD_AUDIO)) {

            // Show an explanation to the user *asynchronously* -- don't block
            // this thread waiting for the user's response! After the user
            // sees the explanation, try again to request the permission.

        } else {

            // No explanation needed, we can request the permission.

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

            // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
            // app-defined int constant. The callback method gets the
            // result of the request. (In this example I just punched in
            // the value 527)
        }
        ...
    }

Затем предоставьте метод обратного вызова в действии для запроса разрешений:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 527: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    }
}

Еще одна вещь, которую я должен изменить в приведенном выше примере кода preetha, где полученный текст извлекается в методе onResults (). Чтобы получить фактический текст переведенной речи (а не размер при печати исходного кода), либо выведите значение построенной строки str, либо получите одно из возвращаемых значений в ArrayList (data). Например:

.setText(data.get(0));
1
FlannelTuba