val minBufferBytes = AudioRecord.getMinBufferSize(
SAMPLE_RATE_HZ,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT
)
require(minBufferBytes > 0)
val record = AudioRecord(
MediaRecorder.AudioSource.MIC,
SAMPLE_RATE_HZ,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
maxOf(minBufferBytes, SAMPLE_RATE_HZ * 200 / 1000 * 2)
)
check(record.state == AudioRecord.STATE_INITIALIZED)
record.startRecording()
check(record.recordingState == AudioRecord.RECORDSTATE_RECORDING)
Process.setThreadPriority(Process.THREAD_PRIORITY_AUDIO)
val buffer = ShortArray(SAMPLE_RATE_HZ * 50 / 1000)
while (!stopRequested) {
val readCount = record.read(buffer, 0, buffer.size)
if (readCount < 0) {
reportAudioReadFailure(readCount)
return
}
if (readCount == 0) continue
if (recognizer.acceptWaveForm(buffer, readCount)) {
publishPartial("")
dispatchResult(recognizer.getResult())
} else {
publishPartial(partialText(recognizer.getPartialResult()))
}
}
if (!stopRequested) {
publishPartial("")
dispatchResult(recognizer.getFinalResult())
}