Android SpeechRecognizer 传递 PCM 数据进行语音识别的示例代码
以下是一个示例代码,演示如何使用 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 方法中,我们停止语音识别并释放所有资源。
请注意,这只是一个示例代码,您可能需要根据您的需要进行修改。
原文地址: https://www.cveoy.top/t/topic/n03O 著作权归作者所有。请勿转载和采集!