2013-03-03 103 views
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())取决于用户设备的配置。

(而SpeechRecognizer被记录,反之亦然不能启动AudioRecord

+0

我知道,问题是,它不是guaranted被称为...(其实我想和它不是叫)。我正在考虑用AudioRecord捕获音频,然后以某种方式将其发送给SpeechRecognizer,但似乎不可行。 – nsL 2013-03-04 09:46:53

+1

是的,同时使用'AudioRecord' +'SpeechRecognizer'不适用于当前版本的Android。关于RMS回调和Google的语音识别器,它停止与Jelly Bean一起工​​作。这是我在测试Babble时的印象(https://github.com/Kaljurand/babble)。我不知道这是谷歌识别器中的一个错误还是他们通过API提供更少的政治决定。 – Kaarel 2013-03-04 10:19:52