MusaedMusaedSadeqMusaedAl-Fareh225739
backend folder
10fba92
"""MrrrMe Backend - Emotion Fusion Logic"""
import numpy as np
from ..config import EMOTION_MAP, FUSION_WEIGHTS
def adjust_fusion_weights(face_quality: float, voice_active: bool, text_length: int) -> dict:
"""
Adjust fusion weights based on quality metrics
Returns:
Dict with adjusted weights and adjustment log
"""
adjusted_weights = FUSION_WEIGHTS.copy()
adjustments = []
# Reduce face weight if quality is poor
if face_quality < 0.5:
adjusted_weights['face'] *= 0.7
adjustments.append(f"Face weight reduced (low quality: {face_quality:.3f})")
# Reduce voice weight if not active
if not voice_active:
adjusted_weights['voice'] *= 0.5
adjustments.append("Voice weight reduced (no recent speech)")
# Reduce text weight if very short
if text_length < 10:
adjusted_weights['text'] *= 0.7
adjustments.append(f"Text weight reduced (short input: {text_length} chars)")
# Normalize to sum to 1.0
total = sum(adjusted_weights.values())
final_weights = {k: v/total for k, v in adjusted_weights.items()}
return {
'weights': final_weights,
'adjustments': adjustments
}
def calculate_fusion(face_probs, voice_probs, text_probs, weights: dict):
"""Calculate weighted fusion of emotion probabilities"""
fused_probs = (
weights['face'] * face_probs +
weights['voice'] * voice_probs +
weights['text'] * text_probs
)
fused_probs = fused_probs / (np.sum(fused_probs) + 1e-8)
fused_idx = int(np.argmax(fused_probs))
emotions = ['Neutral', 'Happy', 'Sad', 'Angry']
fused_emotion = emotions[fused_idx]
intensity = float(np.max(fused_probs))
return fused_emotion, intensity, fused_probs