【问题标题】:how to build BufferReceived() to capture voice using RecognizerIntent?如何构建 BufferReceived() 以使用 RecognizerIntent 捕获语音?
【发布时间】:2013-05-02 13:37:53
【问题描述】:

我正在使用一个 android 应用程序 RecognizerIntent.ACTION_RECOGNIZE_SPEECH,,, 我的问题是我不知道怎么做 创建将捕获用户输入的语音的缓冲区。一世 阅读了很多关于堆栈溢出的内容,但我只是不明白如何 我会将缓冲区和识别服务回调包含在我的代码中。以及我将如何回放保存到缓冲区中的内容。

这是我的代码:

       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

}



}

【问题讨论】:

  • 使用SpeechRecognizer时不需要startActivityForResult + onActivityResult...
  • 自 ICS 以来,不再调用 onBufferReceived。您不能同时使用语音识别器和获取音频。

标签: android speech-recognition voice-recognition


【解决方案1】:

Android 语音识别 API(从 API 级别 17 开始)不提供捕获音频的可靠方法。

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

RecognitionListeneronBufferReceived

已收到更多声音。这个函数的目的是允许 向用户提供有关捕获的音频的反馈。没有 保证这个方法会被调用。

buffer:包含大端 16 位序列的缓冲区 表示单声道音频流的整数。采样率 依赖于实现。

RecognitionService.CallbackbufferReceived

服务应在收到声音后调用此方法。这 此功能的目的是允许向用户提供反馈 关于捕获的音频。

buffer:包含大端 16 位序列的缓冲区 表示单声道音频流的整数。采样率 依赖于实现。

所以这个回调是为了反馈捕获的音频,而不一定是捕获的音频本身,即可能是它的简化版本,用于可视化目的。此外,“不能保证会调用此方法”,即 Google 语音搜索可能会在 v1 中提供它,但随后决定在 v2 中将其删除。

还要注意,在识别过程中可以多次调用此方法。但是,如果缓冲区表示完整的录制音频或仅表示自上次调用以来的 sn-p,则没有记录。 (我假设是后者,但您需要使用语音识别器对其进行测试。)

因此,在您的实现中,您应该将缓冲区复制到要保存的全局变量中,例如识别完成后进入 wav 文件。

【讨论】:

  • 好的,,但是我在哪里把 void bufferReceived(byte[] buffer) 放在我的代码中? @Kaarel
  • @HaneenBassam 查看我的答案中的第二个链接,其中包含如何实现监听器的示例。在bufferReceived 的正文中,您可以以任何您喜欢的方式处理字节缓冲区。
  • 请@kaarel,,,,如果你能看到我编辑的代码......我像你说的那样添加了缓冲区
  • @HaneenBassam 我已经更新了答案,希望它能带来更多的清晰度
  • 我想确保缓冲区正常工作,所以我在缓冲区主体中添加了一个 display.setText("True"),所以如果缓冲区正常工作,它应该给出一个文本视图输出"True" ,但它没有给出任何输出。这意味着它不工作。所以有什么问题?为什么任何 RecognitionListener 方法都不起作用???? @Kaarel,再次感谢您!很抱歉打扰您! ):
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多