Преобразование речи в текст Android

Я имел в виду Android Speech Recognition as a service on Android 4.1 & 4.2 опубликуйте, чтобы попытаться внедрить распознавание речи в службу.

Я думаю, я понял это правильно. При запуске на моем устройстве я получаю всплывающее сообщение «Готово к речи», которое я объявил внутри функции onReadyForSpeech().

По словам Hoan Nguyen человека, который дал ответы на вышеуказанный пост, мы можем начать говорить, как только onReadyForSpeech( ) вызывается функция.

Моя проблема в том, что я не знаю, как получить речь, о которой мы говорим, и преобразовать ее в текст и где это сделать.

Кто нибудь знает как это сделать? Я знаю, что это очень глупый вопрос, но я впервые работаю с распознаванием речи. Так что, пожалуйста, потерпите меня.

Любая помощь в этом очень ценится. Заранее спасибо :)

    public class MyService extends Service
    {
      protected AudioManager mAudioManager; 
      protected SpeechRecognizer mSpeechRecognizer;
      protected Intent mSpeechRecognizerIntent;
      protected final Messenger mServerMessenger = new Messenger(new IncomingHandler(this));

      protected boolean mIsListening;
      protected volatile boolean mIsCountDownOn;

      static final int MSG_RECOGNIZER_START_LISTENING = 1;
      static final int MSG_RECOGNIZER_CANCEL = 2;

    @Override
    public void onCreate()
    {
        super.onCreate();
        mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
        mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
        mSpeechRecognizer.setRecognitionListener(new SpeechRecognitionListener());
        mSpeechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                                         RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
                                         this.getPackageName());

       mSpeechRecognizer.startListening(mSpeechRecognizerIntent);
        //Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
        Log.d("onCreate","Entered");
    }


    protected static class IncomingHandler extends Handler
    {
        private WeakReference<MyService> mtarget;

        IncomingHandler(MyService target)
        {
            mtarget = new WeakReference<MyService>(target);

            Log.d("IncomingHandler","Entered");
        }


        @Override
        public void handleMessage(Message msg)
        {
            Log.d("handleMessage","Entered");

            final MyService target = mtarget.get();

            switch (msg.what)
            {
                case MSG_RECOGNIZER_START_LISTENING:

                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
                    {
                        // turn off beep sound  
                        target.mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, true);
                    }
                     if (!target.mIsListening)
                     {
                         target.mSpeechRecognizer.startListening(target.mSpeechRecognizerIntent);
                         target.mIsListening = true;
                         Log.d("TAG", "message start listening"); 
                         //$NON-NLS-1$
                     }
                     break;

                 case MSG_RECOGNIZER_CANCEL:
                      target.mSpeechRecognizer.cancel();
                      target.mIsListening = false;
                      Log.d("TAG", "message canceled recognizer"); //$NON-NLS-1$
                      break;
             }
       } 
    } 

    // Count down timer for Jelly Bean work around
    protected CountDownTimer mNoSpeechCountDown = new CountDownTimer(5000, 5000)
    {

        @Override
        public void onTick(long millisUntilFinished)
        {
            // TODO Auto-generated method stub
            Log.d("onTick","Entered");
        }

        @Override
        public void onFinish()
        {
            Log.d("onFinish","Entered");

            mIsCountDownOn = false;
            Message message = Message.obtain(null, MSG_RECOGNIZER_CANCEL);
            try
            {
                mServerMessenger.send(message);
                message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
                mServerMessenger.send(message);
            }
            catch (RemoteException e)
            {

            }
        }
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        //mSpeechRecognizer.startListening(mSpeechRecognizerIntent);

        try
        {
            Message msg = new Message();
            msg.what = MSG_RECOGNIZER_START_LISTENING; 
            mServerMessenger.send(msg);
        }
        catch (RemoteException e)
        {
            Log.d("msg",""+e);
        }
        return  START_NOT_STICKY;
        //return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();

        if (mIsCountDownOn)
        {
            mNoSpeechCountDown.cancel();
        }
        if (mSpeechRecognizer != null)
        {
            mSpeechRecognizer.destroy();
        }

        Log.d("onDestroy","Entered");
    }

    protected class SpeechRecognitionListener implements RecognitionListener
    {

        private static final String TAG = "Sppech---->";

        @Override
        public void onBeginningOfSpeech()
        {
            // speech input will be processed, so there is no need for count down anymore
            if (mIsCountDownOn)
            {
                mIsCountDownOn = false;
                mNoSpeechCountDown.cancel();
            }               
            //Log.d(TAG, "onBeginingOfSpeech"); //$NON-NLS-1$
            Log.d("onBeginningOfSpeech","Entered");
        }

        @Override
        public void onBufferReceived(byte[] buffer)
        {
            String sTest = "";
            Log.d("onBufferReceived","Entered");
        }

        @Override
        public void onEndOfSpeech()
        {
            //Log.d(TAG, "onEndOfSpeech"); //$NON-NLS-1$
            Log.d("onEndOfSpeech","Entered");
         }

        @Override
        public void onError(int error)
        {
            if (mIsCountDownOn)
            {
                mIsCountDownOn = false;
                mNoSpeechCountDown.cancel();
            }
             mIsListening = false;
             Message message = Message.obtain(null, MSG_RECOGNIZER_START_LISTENING);
             try
             {
                    mServerMessenger.send(message);
             }
             catch (RemoteException e)
             {

             }
            //Log.d(TAG, "error = " + error); //$NON-NLS-1$
             Log.d("onError","Entered");
        }

        @Override
        public void onEvent(int eventType, Bundle params)
        {

        }

        @Override
        public void onPartialResults(Bundle partialResults)
        {

        }

        @Override
        public void onReadyForSpeech(Bundle params)
        {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN)
            {
                mIsCountDownOn = true;
                mNoSpeechCountDown.start();
                mAudioManager.setStreamMute(AudioManager.STREAM_SYSTEM, false);
            }
            //Log.d("TAG", "onReadyForSpeech"); 
            Toast.makeText(getApplicationContext(), "Ready for Speech", Toast.LENGTH_SHORT).show();
            Log.d("onReadyForSpeech","Entered");//$NON-NLS-1$
        }

        @Override
        public void onResults(Bundle results)
        {
            //Log.d(TAG, "onResults"); //$NON-NLS-1$

        }

        @Override
        public void onRmsChanged(float rmsdB)
        {

        }



    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }
}

person ik024    schedule 11.02.2014    source источник


Ответы (1)


Вы получаете это в onResult(Bundle result), из которого затем вы можете получить то, что говорит пользователь, в ArrayList

ArrayList<String> matches = result.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
person Hoan Nguyen    schedule 11.02.2014
comment
Это работает, и большое спасибо. Я просто знал, что ты будешь тем, кто ответит на этот вопрос. Хотя ты этого не видишь, сейчас на моем лице широкая улыбка :P - person ik024; 11.02.2014
comment
Прямо сейчас я только что скопировал ваш код, не понимая большую часть вещей, которые я действительно хотел бы понять во всем, что вы сделали. Пожалуйста, помогите мне здесь, предоставив несколько ссылок, чтобы я мог это понять. - person ik024; 11.02.2014
comment
Просто прочитайте RecognitionListener, RecognizerIntent и SpeechRecognizer по адресу developer.android.com/reference/ андроид/речь/ - person Hoan Nguyen; 11.02.2014
comment
Хорошо, теперь есть еще одна проблема, которую уже задавали другие. Я тестирую его в Android 4.4.2, и функция onReadyForSpeech() вызывается максимум 3 раза. Как мне решить эту проблему, и она останавливается после 3 попыток? (3 попытки - только если я что-то говорю, если нет, он продолжает вызывать onReadyForSpeech()) - person ik024; 11.02.2014
comment
Хорошо, это было просто. Сначала я возвращал START_NOT_STICKY в моем onStartCommand(). Я изменил его на START_STICKY, и он отлично работает :) - person ik024; 11.02.2014
comment
Я думаю, это было частичное решение - person ik024; 11.02.2014
comment
Я получу телефон 4.4 в ближайшее время и тогда, возможно, я смогу ответить на ваш комментарий. - person Hoan Nguyen; 12.02.2014
comment
спасибо за это :) Я попытаюсь решить это b4 dat. Если я это сделаю, я обновлю его здесь с помощью soln :) - person ik024; 12.02.2014
comment
эй, я знаю, что прошло довольно много времени с тех пор, как я задавал этот вопрос, но у меня есть сомнения, и я думаю, что ты тот человек, которому нужно задать вопрос. Могу ли я запустить распознавание речи в фоновом режиме, даже если мое приложение не работает как широковещательный приемник? так что когда произносится определенное слово, мое приложение начинает работать. - person ik024; 17.02.2014
comment
Да, просто убедитесь, что вы приобрели wakelock в своем сервисе. Вы можете запустить службу при загрузке устройства. - person Hoan Nguyen; 17.02.2014
comment
хорошо, как справиться с этой ситуацией - пользователь использует мое приложение в то время, когда служба работает нормально в фоновом режиме. Но когда пользователь выходит из моего приложения, даже служба умирает. Как поддерживать мой сервис в рабочем состоянии, даже если пользователь выходит из моего приложения? спасибо за ваш ответ, хотя :) - person ik024; 17.02.2014
comment
я думаю, что wakelocks в основном используются, когда устройство переходит в спящий режим - верно? например, частичный wakelock, чтобы ЦП работал в спящем режиме - person ik024; 17.02.2014
comment
Вы остановили свой сервис, когда пользователь выходит из вашего приложения? Вы должны запустить службу на переднем плане. Тогда ваш сервис не убивался бы так часто. Убедитесь, что в вашем коде, когда ваша служба перезапускается после того, как ее убила ОС, вы отправляете сообщение о прослушивании в соответствующем месте (я думаю, onStart). Да, частичный wakelock должен поддерживать работу процессора. Вы должны получить в onCreate и выпустить в onDestroy. - person Hoan Nguyen; 17.02.2014
comment
Что касается Android 4.4.2. Как только я скажу какое-то слово, служба распознает его, даст список возможных совпадений и остановится, но я заставлю свою службу работать непрерывно. В моем случае - когда произнесено определенное слово, будет создана новая активность, поэтому в моей новой активности onResume() я остановлю и снова запущу службу. Таким образом, у меня была служба, работающая на всех - person ik024; 18.02.2014
comment
Вместо остановки и запуска вы должны привязатьServive и unbindService - person Hoan Nguyen; 18.02.2014
comment
в чем разница между этими двумя, использующими остановку и запуск по сравнению с использованием bindService и unbindservice? - person ik024; 19.02.2014
comment
Вы запускаете службу в onCreate, а затем связываете службу в onStart и отвязываете службу в onStop, после чего, когда ваше приложение закрывается, служба все еще работает. - person Hoan Nguyen; 20.02.2014
comment
Просто быстрый вопрос: в вашей реализации вы использовали WeakReference, это просто ваша практика или это необходимо? - person ik024; 24.02.2014
comment
Это для сборки мусора, просто посмотрите WeakReference. - person Hoan Nguyen; 24.02.2014
comment
Да, я читал об этом, я не знал об этом раньше, это хорошая концепция ... Я просто хотел знать, является ли это вашей практикой или требуется в этой конкретной реализации. Например, если мы используем сильную ссылку, будет ли она по-прежнему работать? (Я думаю, что объекты, которые мы обычно определяем, имеют сильную ссылку, верно?) - person ik024; 25.02.2014
comment
А также можем ли мы использовать слабую ссылку для всех наших инициализаций obj? например, для создания объекта textview и т. д. и т. д.? - person ik024; 25.02.2014
comment
Я знаю, что задавал много вопросов, но, надеюсь, этот будет последним :P Можете ли вы ответить на этот мой вопрос. stackoverflow.com/questions/22037438/ Буду вам очень признателен :) Заранее спасибо :) - person ik024; 26.02.2014