2

Я пытаюсь создать собственный диалог, в то время как распознавание речи вместо использования официальной. Я получил эту часть, но когда я решил показать амплитуду звука, узнав, чтобы сделать его более привлекательным, например, панель поиска Google Now (кружка вокруг микрофона, которая растет, если голос ее громче):Как получить амплитуду звука с распознаванием речи?

googlenow http://img600.imageshack.us/img600/3459/gnow.png

Тогда я начал кодировать как получить амплитуду звука, и, наконец, я получил его с AudioRecord класса.

Проблема возникает, когда я пытаюсь смешать оба (SpeechRecognizer и AudioRecord), потому что кажется, что они не в состоянии разделить микрофон, или что-то в этом роде ...

В LogCat У меня есть эта ошибка:

03-03 21:16:07.461: E/ListenerAdapter(23359): onError 
03-03 21:16:07.461: E/ListenerAdapter(23359): com.google.android.speech.embedded.Greco3RecognitionEngine$EmbeddedRecognizerUnavailableException: Embedded recognizer unavailable 
03-03 21:16:07.461: E/ListenerAdapter(23359): at com.google.android.speech.embedded.Greco3RecognitionEngine.startRecognition(Greco3RecognitionEngine.java:108) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.lang.reflect.Method.invoke(Method.java:511) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at com.google.android.searchcommon.utils.ThreadChanger$1$1.run(ThreadChanger.java:77) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:390) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:153) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:267) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
03-03 21:16:07.461: E/ListenerAdapter(23359): at com.google.android.searchcommon.utils.ConcurrentUtils$2$1.run(ConcurrentUtils.java:112) 

и некоторые другие времена, у меня есть это:

03-03 21:47:13.344: E/ListenerAdapter(23359): onError 
03-03 21:47:13.344: E/ListenerAdapter(23359): com.google.android.speech.exception.AudioRecognizeException: Audio error 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.embedded.Greco3Recognizer.read(Greco3Recognizer.java:107) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at dalvik.system.NativeStart.run(Native Method) 
03-03 21:47:13.344: E/ListenerAdapter(23359): Caused by: java.io.IOException: couldn't start recording, state is:1 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.audio.MicrophoneInputStream.ensureStartedLocked(MicrophoneInputStream.java:119) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.audio.MicrophoneInputStream.read(MicrophoneInputStream.java:159) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.common.io.ByteStreams.read(ByteStreams.java:806) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.audio.Tee.readFromDelegate(Tee.java:374) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.audio.Tee.readLeader(Tee.java:267) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.audio.Tee$TeeLeaderInputStream.read(Tee.java:464) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at java.io.InputStream.read(InputStream.java:163) 
03-03 21:47:13.344: E/ListenerAdapter(23359): at com.google.android.speech.audio.AudioSource$CaptureThread.run(AudioSource.java:193) 

и это, как я запустить как:

//previously in constructor 
speechrec = SpeechRecognizer.createSpeechRecognizer(getActivity()); 
speechrec.setRecognitionListener(this); 
// 

public void launchListening() 
{  
    if (speechrec.isRecognitionAvailable(getActivity())) 
    { 
     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
     speechrec.startListening(intent);  
    } 

    bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);// * bufferSizeFactor; 
    audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
    audio.startRecording(); 

    captureThread = new Thread(new Runnable() 
    { 
     public void run() 
     { 
      //calculate amplitude here 
     } 
    }); 
    captureThread.start(); 
} 

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

ответ

3

Способ сделать это, чтобы зарегистрировать слушателя с помощью SpeechRecognizer и визуализировать вывод onRmsChanged. Обратите внимание, однако, что:

There is no guarantee that this method will be called.

Так что распознаватель речи, который вы используете, должен поддерживать этот метод. Обратите внимание, что возвращаемое значение SpeechRecognizer.createSpeechRecognizer(getActivity()) зависит от конфигурации устройства пользователя.

(Вы не можете начать AudioRecord в то время как SpeechRecognizer записывает и наоборот.)

+0

Я знаю, проблема в том, что его не гарантировано, чтобы назвать ... (на самом деле я пытался и оно не было называется). Я думал об захвате аудио с помощью AudioRecord, а затем как-то отправлял его в SpeechRecognizer, но кажется невероятным. – nsL

+1

Да, с использованием 'AudioRecord' +' SpeechRecognizer' в то же время не работает в текущих версиях Android. Что касается обратного вызова RMS и распознавателя речи Google, он прекратил работу с Jelly Bean. Это было мое впечатление во время тестирования Babble (https://github.com/Kaljurand/babble). Я не знаю, является ли это ошибкой в ​​распознавателе Google или их политическом решении меньше предлагать через API. – Kaarel

Смежные вопросы