stt(mic): возврат на 16 кГц (48 кГц молчит на ARGT78); VAD на сыром + gain ×5 остаются
This commit is contained in:
@@ -70,10 +70,10 @@ class SttMicStream(
|
|||||||
job = scope.launch(Dispatchers.IO) {
|
job = scope.launch(Dispatchers.IO) {
|
||||||
try {
|
try {
|
||||||
recorder.startRecording()
|
recorder.startRecording()
|
||||||
log("stt", "микрофон запущен (48 кГц, s16, mono, WebRTC VAD на очках)")
|
log("stt", "микрофон запущен (16 кГц, s16, mono, WebRTC VAD на очках)")
|
||||||
val vad = VadWebRTC(
|
val vad = VadWebRTC(
|
||||||
SampleRate.SAMPLE_RATE_48K,
|
SampleRate.SAMPLE_RATE_16K,
|
||||||
FrameSize.FRAME_SIZE_960,
|
FrameSize.FRAME_SIZE_320,
|
||||||
Mode.VERY_AGGRESSIVE,
|
Mode.VERY_AGGRESSIVE,
|
||||||
600, // silenceDurationMs: тишина 600 мс = конец реплики
|
600, // silenceDurationMs: тишина 600 мс = конец реплики
|
||||||
50, // speechDurationMs: минимум 50 мс речи
|
50, // speechDurationMs: минимум 50 мс речи
|
||||||
@@ -134,15 +134,15 @@ class SttMicStream(
|
|||||||
.onFailure { log("stt", "dump микрофона: ${it.message}") }
|
.onFailure { log("stt", "dump микрофона: ${it.message}") }
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Закрытый речевой сегмент: склейка 48 кГц-фреймов → даунсэмпл 48→16 (с FIR) → на телефон. */
|
/** Закрытый речевой сегмент: склейка 16 кГц-фреймов → s16le → на телефон. */
|
||||||
private suspend fun closeSegment(segment: List<ShortArray>, dumpWriter: WavWriter?) {
|
private suspend fun closeSegment(segment: List<ShortArray>, dumpWriter: WavWriter?) {
|
||||||
if (segment.isEmpty()) return
|
if (segment.isEmpty()) return
|
||||||
val pcm = shortsToPcm16(downsample48To16(segment))
|
val pcm = shortsToPcm16(segment)
|
||||||
if (dumpWriter != null) {
|
if (dumpWriter != null) {
|
||||||
runCatching { dumpWriter.write(pcm) }
|
runCatching { dumpWriter.write(pcm) }
|
||||||
.onFailure { log("stt", "dump микрофона: ${it.message}") }
|
.onFailure { log("stt", "dump микрофона: ${it.message}") }
|
||||||
}
|
}
|
||||||
log("stt", "🔇 сегмент речи: ${segment.size * VAD_FRAME_SIZE / 48} мс → на телефон")
|
log("stt", "🔇 сегмент речи: ${segment.size * VAD_FRAME_SIZE / 16} мс → на телефон")
|
||||||
onChunk(pcm)
|
onChunk(pcm)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -195,8 +195,8 @@ class SttMicStream(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Фрейм VAD: 20 мс при 48 кГц = 960 сэмплов (как AudioRecorder в pair-view). */
|
/** Фрейм VAD: 20 мс при 16 кГц = 320 сэмплов (48 кГц на ARGT78 не отдаёт звук). */
|
||||||
internal const val VAD_FRAME_SIZE = 960
|
internal const val VAD_FRAME_SIZE = 320
|
||||||
|
|
||||||
/** Пре-ролл тишины перед речью: 200 мс = 10 фреймов. */
|
/** Пре-ролл тишины перед речью: 200 мс = 10 фреймов. */
|
||||||
internal const val PRE_ROLL_FRAMES = 10
|
internal const val PRE_ROLL_FRAMES = 10
|
||||||
@@ -213,8 +213,8 @@ internal const val MIC_GAIN = 5f
|
|||||||
/** 100 мс при 16 кГц, s16, моно: 1600 кадров × 2 байта = 3200 байт. */
|
/** 100 мс при 16 кГц, s16, моно: 1600 кадров × 2 байта = 3200 байт. */
|
||||||
internal const val CHUNK_BYTES = 3_200
|
internal const val CHUNK_BYTES = 3_200
|
||||||
|
|
||||||
/** Микрофон очков: 48 кГц — нативная частота, как у автора pair-view (16 кГц даёт рваные пачки у ARGT78). */
|
/** Микрофон очков: 16 кГц — единственная рабочая частота ARGT78 (48 кГц молчит). */
|
||||||
internal const val MIC_SAMPLE_RATE = 48_000
|
internal const val MIC_SAMPLE_RATE = 16_000
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Цифровое усиление фрейма s16le mono с насыщением (для VAD и whisper).
|
* Цифровое усиление фрейма s16le mono с насыщением (для VAD и whisper).
|
||||||
|
|||||||
Reference in New Issue
Block a user