以下是一个示例代码,演示如何使用 SpeechRecognizer 传递 PCM 数据进行语音识别:

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_RECORD_AUDIO_PERMISSION = 200;
    private static final String TAG = "MainActivity";

    private boolean permissionToRecordAccepted = false;
    private String [] permissions = {Manifest.permission.RECORD_AUDIO};

    private AudioRecord audioRecord;
    private int bufferSize;
    private byte[] buffer;

    private SpeechRecognizer speechRecognizer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Check for record audio permission
        ActivityCompat.requestPermissions(this, permissions, REQUEST_RECORD_AUDIO_PERMISSION);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST_RECORD_AUDIO_PERMISSION:
                permissionToRecordAccepted  = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                if (permissionToRecordAccepted) {
                    startSpeechRecognition();
                }
                break;
        }
        if (!permissionToRecordAccepted) {
            finish();
        }
    }

    private void startSpeechRecognition() {
        bufferSize = AudioRecord.getMinBufferSize(16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 16000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize);
        buffer = new byte[bufferSize];

        speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
        speechRecognizer.setRecognitionListener(new RecognitionListener() {
            @Override
            public void onReadyForSpeech(Bundle params) {
                Log.d(TAG, 'onReadyForSpeech');
            }

            @Override
            public void onBeginningOfSpeech() {
                Log.d(TAG, 'onBeginningOfSpeech');
            }

            @Override
            public void onRmsChanged(float rmsdB) {
                Log.d(TAG, 'onRmsChanged');
            }

            @Override
            public void onBufferReceived(byte[] buffer) {
                Log.d(TAG, 'onBufferReceived');
            }

            @Override
            public void onEndOfSpeech() {
                Log.d(TAG, 'onEndOfSpeech');
            }

            @Override
            public void onError(int error) {
                Log.d(TAG, 'onError ' + error);
            }

            @Override
            public void onResults(Bundle results) {
                Log.d(TAG, 'onResults');
                ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
                if (matches != null) {
                    for (String result : matches) {
                        Log.d(TAG, 'Result: ' + result);
                    }
                }
            }

            @Override
            public void onPartialResults(Bundle partialResults) {
                Log.d(TAG, 'onPartialResults');
            }

            @Override
            public void onEvent(int eventType, Bundle params) {
                Log.d(TAG, 'onEvent');
            }
        });

        speechRecognizer.startListening(new Intent());

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    int read = audioRecord.read(buffer, 0, bufferSize);

                    ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, 0, read);

                    ShortBuffer shortBuffer = byteBuffer.asShortBuffer();

                    short[] audioData = new short[read / 2];

                    shortBuffer.get(audioData, 0, read / 2);

                    speechRecognizer.writeAudio(audioData, 0, audioData.length);
                }
            }
        }).start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (speechRecognizer != null) {
            speechRecognizer.stopListening();
            speechRecognizer.cancel();
            speechRecognizer.destroy();
        }
        if (audioRecord != null) {
            audioRecord.stop();
            audioRecord.release();
        }
    }
}

在这个示例中,我们首先检查是否有录制音频的权限。如果有权限,我们就开始语音识别过程。我们使用 AudioRecord 从麦克风读取 PCM 音频数据,并将这些数据传递给 SpeechRecognizer 进行语音识别。

我们在 SpeechRecognizer 的 RecognitionListener 回调中处理识别结果。注意,我们在单独的线程中读取 PCM 音频数据并将其传递给 SpeechRecognizer,以避免阻塞 UI 线程。

在 onDestroy 方法中,我们停止语音识别并释放所有资源。

请注意,这只是一个示例代码,您可能需要根据您的需要进行修改。

Android SpeechRecognizer 传递 PCM 数据进行语音识别的示例代码

原文地址: https://www.cveoy.top/t/topic/n03O 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录