去除多余的模型
This commit is contained in:
parent
05aad755b8
commit
6e811b99b7
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user