android – 如何使用RecognizerIntent构建BufferReceived()来捕获语音?

android – 如何使用RecognizerIntent构建BufferReceived()来捕获语音?,第1张

概述我正在使用 Android应用程序  RecognizerIntent.ACTION_RECOGNIZE_SPEECH ,,,我的问题是,我不知道如何  创建将捕获用户输入的语音的缓冲区.一世  在堆栈溢出上读了很多,但我只是不明白如何  我将缓冲区和识别服务调用包含在我的代码中.以及我将如何回放保存到缓冲区的内容. 这是我的代码: public class Voice extends Activ 我正在使用 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;@OverrIDeprotected 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,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);}@OverrIDepublic voID onClick(VIEw arg0) {    // Todo auto-generated method stub}}
解决方法 AndroID语音识别API(从API级别17开始)不提供捕获音频的可靠方法.

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

RecognitionListener说关于onBufferReceived:

More sound has been received. The purpose of this function is to allow
giving Feedback to the user regarding the captured audio. There is no
guarantee that this method will be called.

buffer: a buffer containing a sequence of big-endian 16-bit
integers representing a single channel audio stream. The sample rate
is implementation dependent.

和RecognitionService.Callback说关于bufferReceived:

The service should call this method when sound has been received. The
purpose of this function is to allow giving Feedback to the user
regarding the captured audio.

buffer: a buffer containing a sequence of big-endian 16-bit
integers representing a single channel audio stream. The sample rate
is implementation dependent.

因此,该回调用于关于捕获的音频的反馈,并且不一定是捕获的音频本身,即可能是用于可视化目的的缩小版本.此外,“无法保证将调用此方法”,即Google语音搜索可能会在v1中提供此方法,但随后决定在v2中将其删除.

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

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

总结

以上是内存溢出为你收集整理的android – 如何使用RecognizerIntent构建BufferReceived()来捕获语音?全部内容,希望文章能够帮你解决android – 如何使用RecognizerIntent构建BufferReceived()来捕获语音?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1140978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存