去除多余的模型
This commit is contained in:
parent
05aad755b8
commit
6e811b99b7
@ -196,14 +196,31 @@ class VoiceController(
|
|||||||
val audio = audioBuffer.toFloatArray()
|
val audio = audioBuffer.toFloatArray()
|
||||||
val vadRatio = vadManager.activeSpeechRatio()
|
val vadRatio = vadManager.activeSpeechRatio()
|
||||||
val avgEnergy = if (speechFrameCount > 0) speechEnergySum / speechFrameCount else 0f
|
val avgEnergy = if (speechFrameCount > 0) speechEnergySum / speechFrameCount else 0f
|
||||||
|
val peakRms = calcPeakRms(audio)
|
||||||
|
|
||||||
// ⭐ 多人说话检测:短时峰值方差
|
|
||||||
if (shortTermPeakVariance(audio) > 0.015f) {
|
val peakAvgRatio = if (avgEnergy > 0f) peakRms / avgEnergy else 0f
|
||||||
Log.d(TAG, "❌ Short-term peak variance too high → likely multi-speaker")
|
|
||||||
|
if (avgEnergy < MIN_AVG_ENERGY) {
|
||||||
|
Log.d(TAG, "❌ Avg energy too low: $avgEnergy → rejected")
|
||||||
resetToWaitSpeech()
|
resetToWaitSpeech()
|
||||||
return
|
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
|
var score = 0
|
||||||
when {
|
when {
|
||||||
duration >= 4000 -> score += 3
|
duration >= 4000 -> score += 3
|
||||||
@ -220,7 +237,7 @@ class VoiceController(
|
|||||||
vadRatio >= 0.40f -> score += 1
|
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 {
|
val pass = when {
|
||||||
score >= 6 -> true
|
score >= 6 -> true
|
||||||
@ -234,25 +251,15 @@ class VoiceController(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ✅ 通过 → 上传
|
||||||
waitSpeechFailStartMs = 0L
|
waitSpeechFailStartMs = 0L
|
||||||
audioBuffer.clear()
|
audioBuffer.clear()
|
||||||
state = VoiceState.UPLOADING
|
state = VoiceState.UPLOADING
|
||||||
onFinalAudio(audio)
|
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 {
|
private fun calcPeakRms(audio: FloatArray): Float {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user