stt(mic): AudioRecord.read возвращает КАДРЫ, а не байты — не терять вторую половину каждого 100-мс чанка (впечатление 'пропускает через один')

This commit is contained in:
2026-08-24 11:08:27 +03:00
parent 22eb83fd17
commit c940a7e0eb
@@ -60,9 +60,13 @@ class SttMicStream(
log("stt", "микрофон запущен (16 кГц, s16, mono)") log("stt", "микрофон запущен (16 кГц, s16, mono)")
val buf = ByteArray(3_200) val buf = ByteArray(3_200)
while (isActive && shouldRun()) { while (isActive && shouldRun()) {
val n = recorder.read(buf, 0, buf.size) // read(byte[], int, int) в лимите БАЙТОВ, но ВОЗВРАЩАЕТ ЧИСЛО КАДРОВ (frames).
if (n > 0) { // 16-бит моно: кадр = 2 байта. Если брать n как байты — уйдёт только
val chunk = if (n == buf.size) buf else buf.copyOf(n) // первая половина каждого куска (50 из 100 мс) → «рваное»/пропущенное аудио.
val frames = recorder.read(buf, 0, buf.size)
if (frames > 0) {
val bytes = frames * 2
val chunk = if (bytes == buf.size) buf else buf.copyOf(bytes)
if (dumpWriter != null) { if (dumpWriter != null) {
runCatching { dumpWriter.write(chunk) } runCatching { dumpWriter.write(chunk) }
.onFailure { log("stt", "dump микрофона: ${it.message}") } .onFailure { log("stt", "dump микрофона: ${it.message}") }