stt(mic): возврат на 16 кГц (48 кГц молчит на ARGT78); VAD на сыром + gain ×5 остаются

This commit is contained in:
2026-08-25 02:59:00 +03:00
parent 1009713a28
commit 19fe1b34bc
@@ -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<ShortArray>, 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).