stt(mic): возврат на 16 кГц (48 кГц молчит на ARGT78); VAD на сыром + gain ×5 остаются
This commit is contained in:
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user