当前位置: 首页 > 知识库问答 >
问题:

如何构建缓冲区接收()以使用识别意图捕获语音?

张宝
2023-03-14

我正在使用RecogenerIntent开发一个android应用程序。ACTION\u RECOGNIZE\u 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

}



}

共有1个答案

芮宇航
2023-03-14

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

您可以使用“buffer received”回调,但请注意

RecognitionListener谈到onBufferReceived:

收到更多声音。此功能的目的是允许向用户提供有关捕获音频的反馈。无法保证将调用此方法。

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

和认可服务。回调表示关于bufferReceived:

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

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

因此,此回调用于有关捕获的音频的反馈,而不一定是捕获的音频本身,也就是说,出于可视化目的,可能是它的简化版本。此外,“无法保证会调用此方法”,即Google Voice Search可能会在v1中提供此方法,但随后决定在v2中删除它。

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

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

 类似资料:
  • 问题内容: 在编写用于OpenGL库的Matrix类时,我遇到了一个问题,即使用Java数组还是使用Buffer策略存储数据(JOGL为Matrix操作提供直接缓冲区复制)。为了对此进行分析,我编写了一个小型性能测试程序,该程序比较了Arrays vs Buffers和Direct Buffers上循环和批量操作的相对速度。 我想在这里与您分享我的结果(因为我发现它们很有趣)。请随时发表评论和/或

  • 我正在尝试构建一个同时使用Google协议缓冲区和使用Gradle的Kotlin的项目。我希望将proto文件编译成Java源代码,然后从我的Kotlin代码中调用它。 我的源文件是这样排列的: 这是我的构建。gradle文件: 当我运行时,我在期间收到一堆“未解决的引用”错误。之后,我可以看到没有生成Java源文件,因此似乎根本没有调用原始编译器。 如果我删除了apply插件:“kotlin”行

  • 问题内容: 我有一个内存泄漏,我已经将其隔离到错误配置的直接字节缓冲区。 GC收集包含这些缓冲区但不处理缓冲区本身的对象。如果实例化包含缓冲区的瞬态对象足够多,则会得到以下令人鼓舞的消息: 我一直在寻找这个问题,显然 和 不工作。 问题答案: 我怀疑您的应用程序某处有对ByteBuffer实例的引用,这阻止了它被垃圾回收。 直接ByteBuffer的缓冲内存是在普通堆之外分​​配的(以便GC不会移

  • 如何将语言模型集成到tensorflow语音识别体系结构中? 在Tensorflow中建立字符级语音识别有很多例子(例如。https://github.com/nervanasystems/neon, https://github.com/buriburisuri/speech-to-text-wavenet),这很有趣,但实际上毫无用处,除非集成了语言模型。我找不到使用语言模型的示例。 如何集成

  • 给定一个Geopandas GeoDataFrame,我想提取GeoDataFrame的总边界,由单元缓冲。 通过,我可以访问整个DataFrame中组合几何的非缓冲边界。我想到的一种方法是取这些边界,将它们转换为Shapely多边形,然后缓冲它。

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?