diff --git a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/stt/SttMicStream.kt b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/stt/SttMicStream.kt index d046f2a..b99d08b 100644 --- a/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/stt/SttMicStream.kt +++ b/app-glasses/src/main/kotlin/pw/binom/viewmate/glasses/stt/SttMicStream.kt @@ -87,9 +87,14 @@ class SttMicStream( val n = recorder.read(frame, 0, VAD_FRAME_SIZE) // кадры if (n <= 0) continue val data = if (n == VAD_FRAME_SIZE) frame else frame.copyOf(n) + // СЫРОЙ дамп: весь поток микрофона (до усиления/VAD) — что реально слышат очки. + if (dumpWriter != null) { + runCatching { dumpWriter.write(shortsToPcm16(listOf(data))) } + .onFailure { log("stt", "dump микрофона: ${it.message}") } + } // VAD на СЫРОМ фрейме: WebRTC VAD рассчитан на нормальный уровень // (-21 dBFS у ARGT78 — ок), усиление ×10 клиппует и ломает детекцию. - // Усиленный фрейм — только в сегмент (для whisper и дампа). + // Усиленный фрейм — только в сегмент (для whisper). val boosted = gainShort(data) if (vad.isSpeech(data)) { if (!speeching) { @@ -138,10 +143,6 @@ class SttMicStream( private suspend fun closeSegment(segment: List, dumpWriter: WavWriter?) { if (segment.isEmpty()) return val pcm = shortsToPcm16(segment) - if (dumpWriter != null) { - runCatching { dumpWriter.write(pcm) } - .onFailure { log("stt", "dump микрофона: ${it.message}") } - } log("stt", "🔇 сегмент речи: ${segment.size * VAD_FRAME_SIZE / 16} мс → на телефон") onChunk(pcm) }