如何建立BufferReceived()使用RecognizerIntent捕捉的声音吗?(how

2019-09-01 18:23发布

我正在使用RecognizerIntent.ACTION_RECOGNIZE_SPEECH Android应用程序,,,我的问题是,我不知道如何创建将捕获的声音,用户输入缓冲区。 我读了很多关于堆栈溢出,但我就是不明白我怎么会包括缓冲区和识别服务回调到我的代码。 将如何我做回PLAY对于那些被保存到缓冲区中的内容。

这是我的代码:

       public class Voice extends Activity implements OnClickListener {
   byte[] sig = new byte[500000] ;
   int sigPos = 0 ;
       ListView lv;
   static final int check =0;
   protected static final String TAG = null;

@Override
protected void onCreate(Bundle savedInstanceState) {



    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);


    setContentView(R.layout.voice);

    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,
            "com.domain.app");

    SpeechRecognizer recognizer = SpeechRecognizer
            .createSpeechRecognizer(this.getApplicationContext());

    RecognitionListener listener = new RecognitionListener() {

        @Override
        public void onResults(Bundle results) {
            ArrayList<String> voiceResults = results
                    .getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if (voiceResults == null) {
                Log.e(TAG, "No voice results");
            } else {
                Log.d(TAG, "Printing matches: ");
                for (String match : voiceResults) {
                    Log.d(TAG, match);
                }
            }
        }

        @Override
        public void onReadyForSpeech(Bundle params) {
            Log.d(TAG, "Ready for speech");
        }

        @Override
        public void onError(int error) {
            Log.d(TAG,
                    "Error listening for speech: " + error);
        }

        @Override
        public void onBeginningOfSpeech() {
            Log.d(TAG, "Speech starting");
        }

        @Override
        public void onBufferReceived(byte[] buffer) {
            // TODO Auto-generated method stub
            TextView display=(TextView)findViewById (R.id.Text1);
                    display.setText("True");


              System.arraycopy(buffer, 0, sig, sigPos, buffer.length) ;
              sigPos += buffer.length ;

        }

        @Override
        public void onEndOfSpeech() {
            // TODO Auto-generated method stub

        }

        @Override
        public void onEvent(int eventType, Bundle params) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPartialResults(Bundle partialResults) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onRmsChanged(float rmsdB) {
            // TODO Auto-generated method stub

        }
    };
    recognizer.setRecognitionListener(listener);
    recognizer.startListening(intent);




    startActivityForResult(intent,check);

}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub

}



}

Answer 1:

Android的语音识别API(如API级别17)不能提供可靠的方法来捕捉音频。

您可以使用“缓冲区接收的”回调,但请注意,

RecognitionListener说,大约onBufferReceived

更多的声音已收到。 该功能的目的是允许给予反馈给用户关于捕获音频。 谁也不能保证,这种方法将被调用。

缓冲液 :包含表示单个信道音频流大端16位整数的序列的缓冲器。 采样率是依赖于实现。

和RecognitionService.Callback说,大约bufferReceived

在已接收的声音服务应该调用此方法。 该功能的目的是允许给予反馈给用户关于捕获音频。

缓冲液 :包含表示单个信道音频流大端16位整数的序列的缓冲器。 采样率是依赖于实现。

所以这个回调是关于捕获音频,而不一定是捕获的音频本身的反馈 ,即也许它用于可视化目的的简化版本。 此外,“没有保证,这种方法将被称为”,即谷歌语音搜索可以提供它在V1,最终决定在v2中删除它。

还需要注意的是这种方法可以在识别过程中被多次调用。 它如果缓冲区表示自上次调用完整的录音或只是片段不但是记录。 (我认为是后者,但你需要与你的语音识别器进行测试。)

所以,在你实现你应该缓冲区复制到一旦识别完成后要保存如成WAV文件的全局变量。



文章来源: how to build BufferReceived() to capture voice using RecognizerIntent?