From 19fe1b34bc84d657e148fa58fe1b8c6b611390a9 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Tue, 25 Aug 2026 02:59:00 +0300 Subject: [PATCH] =?UTF-8?q?stt(mic):=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80?= =?UTF-8?q?=D0=B0=D1=82=20=D0=BD=D0=B0=2016=20=D0=BA=D0=93=D1=86=20(48=20?= =?UTF-8?q?=D0=BA=D0=93=D1=86=20=D0=BC=D0=BE=D0=BB=D1=87=D0=B8=D1=82=20?= =?UTF-8?q?=D0=BD=D0=B0=20ARGT78);=20VAD=20=D0=BD=D0=B0=20=D1=81=D1=8B?= =?UTF-8?q?=D1=80=D0=BE=D0=BC=20+=20gain=20=C3=975=20=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=8E=D1=82=D1=81=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../viewmate/glasses/stt/SttMicStream.kt | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 b03608a..d046f2a 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 @@ -70,10 +70,10 @@ class SttMicStream( job = scope.launch(Dispatchers.IO) { try { recorder.startRecording() - log("stt", "микрофон запущен (48 кГц, s16, mono, WebRTC VAD на очках)") + log("stt", "микрофон запущен (16 кГц, s16, mono, WebRTC VAD на очках)") val vad = VadWebRTC( - SampleRate.SAMPLE_RATE_48K, - FrameSize.FRAME_SIZE_960, + SampleRate.SAMPLE_RATE_16K, + FrameSize.FRAME_SIZE_320, Mode.VERY_AGGRESSIVE, 600, // silenceDurationMs: тишина 600 мс = конец реплики 50, // speechDurationMs: минимум 50 мс речи @@ -134,15 +134,15 @@ class SttMicStream( .onFailure { log("stt", "dump микрофона: ${it.message}") } } - /** Закрытый речевой сегмент: склейка 48 кГц-фреймов → даунсэмпл 48→16 (с FIR) → на телефон. */ + /** Закрытый речевой сегмент: склейка 16 кГц-фреймов → s16le → на телефон. */ private suspend fun closeSegment(segment: List, dumpWriter: WavWriter?) { if (segment.isEmpty()) return - val pcm = shortsToPcm16(downsample48To16(segment)) + val pcm = shortsToPcm16(segment) if (dumpWriter != null) { runCatching { dumpWriter.write(pcm) } .onFailure { log("stt", "dump микрофона: ${it.message}") } } - log("stt", "🔇 сегмент речи: ${segment.size * VAD_FRAME_SIZE / 48} мс → на телефон") + log("stt", "🔇 сегмент речи: ${segment.size * VAD_FRAME_SIZE / 16} мс → на телефон") onChunk(pcm) } @@ -195,8 +195,8 @@ class SttMicStream( } } -/** Фрейм VAD: 20 мс при 48 кГц = 960 сэмплов (как AudioRecorder в pair-view). */ -internal const val VAD_FRAME_SIZE = 960 +/** Фрейм VAD: 20 мс при 16 кГц = 320 сэмплов (48 кГц на ARGT78 не отдаёт звук). */ +internal const val VAD_FRAME_SIZE = 320 /** Пре-ролл тишины перед речью: 200 мс = 10 фреймов. */ internal const val PRE_ROLL_FRAMES = 10 @@ -213,8 +213,8 @@ internal const val MIC_GAIN = 5f /** 100 мс при 16 кГц, s16, моно: 1600 кадров × 2 байта = 3200 байт. */ internal const val CHUNK_BYTES = 3_200 -/** Микрофон очков: 48 кГц — нативная частота, как у автора pair-view (16 кГц даёт рваные пачки у ARGT78). */ -internal const val MIC_SAMPLE_RATE = 48_000 +/** Микрофон очков: 16 кГц — единственная рабочая частота ARGT78 (48 кГц молчит). */ +internal const val MIC_SAMPLE_RATE = 16_000 /** * Цифровое усиление фрейма s16le mono с насыщением (для VAD и whisper).