去除多余的模型

This commit is contained in:
林若思 2026-01-03 16:47:29 +08:00
parent 05aad755b8
commit 6e811b99b7

View File

@ -196,14 +196,31 @@ class VoiceController(
val audio = audioBuffer.toFloatArray()
val vadRatio = vadManager.activeSpeechRatio()
val avgEnergy = if (speechFrameCount > 0) speechEnergySum / speechFrameCount else 0f
val peakRms = calcPeakRms(audio)
// ⭐ 多人说话检测:短时峰值方差
if (shortTermPeakVariance(audio) > 0.015f) {
Log.d(TAG, "❌ Short-term peak variance too high → likely multi-speaker")
val peakAvgRatio = if (avgEnergy > 0f) peakRms / avgEnergy else 0f
if (avgEnergy < MIN_AVG_ENERGY) {
Log.d(TAG, "❌ Avg energy too low: $avgEnergy → rejected")
resetToWaitSpeech()
return
}
if (peakAvgRatio < 1.2f) {
Log.d(TAG, "❌ Peak/Avg ratio too low: $peakAvgRatio → rejected")
resetToWaitSpeech()
return
}
if (vadRatio < 0.40f) {
Log.d(TAG, "❌ VAD ratio too low: $vadRatio → rejected")
resetToWaitSpeech()
return
}
// 原评分逻辑
var score = 0
when {
duration >= 4000 -> score += 3
@ -220,7 +237,7 @@ class VoiceController(
vadRatio >= 0.40f -> score += 1
}
Log.d(TAG, "📊 duration=$duration ms, vadRatio=$vadRatio, avgEnergy=$avgEnergy, score=$score")
Log.d(TAG, "📊 duration=$duration ms, vadRatio=$vadRatio, avgEnergy=$avgEnergy, peakRms=$peakRms, score=$score")
val pass = when {
score >= 6 -> true
@ -234,25 +251,15 @@ class VoiceController(
return
}
// ✅ 通过 → 上传
waitSpeechFailStartMs = 0L
audioBuffer.clear()
state = VoiceState.UPLOADING
onFinalAudio(audio)
}
/** 计算短时峰值方差,用于多人说话检测 */
private fun shortTermPeakVariance(audio: FloatArray): Float {
val frameSize = 160 // 10ms @16kHz
val peaks = mutableListOf<Float>()
var i = 0
while (i + frameSize <= audio.size) {
val frame = audio.sliceArray(i until i + frameSize)
peaks.add(calcPeakRms(frame))
i += frameSize
}
val mean = peaks.average().toFloat()
return peaks.map { (it - mean) * (it - mean) }.average().toFloat()
}
/** 计算音频帧峰值 */
private fun calcPeakRms(audio: FloatArray): Float {