File size: 5,072 Bytes
8ad2ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aef3b1e
8ad2ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aef3b1e
8ad2ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
aef3b1e
 
 
 
8ad2ab3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import numpy as np

def calc_ess(pitch_variation, vol_max_db, mean_volume_db, valence_scores):
    """
    Emotional Stability Score(ESS) : Measures the consistency of the speaker's emotional tone, reflecting their ability to regulate emotions during speech.
    
    Requires:
      Tonal Steadiness: The lack of extreme fluctuations in emotional tone.
      Absence of Sudden Loudness Spikes: Indicates controlled expression without abrupt emotional shifts.
      Valence Stability: Consistency in the overall positive or negative tone across the speech.
    """
    # calculate tonal steadiness
    tonal_steadiness = max(0, 100 - (pitch_variation * 10))
    
    # calculate loudness spikes
    spike = max(0, vol_max_db - mean_volume_db - 15)
    spike_ratio = min(spike / 30, 1.0)  # Normalize with typical loudness range
    stability = 1 - spike_ratio
    loudness_stability = stability * 100
    
    # calculate valence stability
    valence_stability = 100 - (np.std(valence_scores) * 20)
    
    ESS = (0.45 * float(tonal_steadiness)) + (0.35 * float(loudness_stability)) + (0.2 * float(valence_stability))
    #print(f" tonal_steadiness: {tonal_steadiness}, loudness_stability: {loudness_stability}, valence_stability: {valence_stability}")
    return ESS

def calc_lcs(volume_std, vol_max_db, mean_volume_db):
    """
    Loudness Control Score (LCS): Evaluates how well the speaker manages volume
    
    Requires:
        - Volume Stability: Consistency in speech amplitude.
        - Controlled Emphasis: The ability to modulate loudness smoothly for emphasis rather than abrupt changes.
    """
    vol_stability = max(0, 100 - (volume_std * 5))  # Scale std for speech (5 dB std = 75)
    
    # Controlled Emphasis (45%)
    emphasis_spike = max(0, vol_max_db - mean_volume_db - 3)  
    spike_ratio = min(emphasis_spike / 15, 1.0)  # Normalize to 15 dB range
    emphasis_control = (1 - spike_ratio) * 100
    
    # Combine scores
    lcs = 0.55 * vol_stability + 0.45 * emphasis_control
    print(f"vol_stability: {vol_stability}, emphasis_control: {emphasis_control}")
    return min(100, max(0, lcs))

def calc_srs(wpm, filler_count, long_pause_count, pitch_variation):
    """
    Speech Rate Stability (SRS): Reflects the consistency of the speaker's pace and rhythm.
    
    Requires:
        - Words per Minute Consistency: Regularity in speech speed.
        - Absence of Sudden Speed Shifts: Smooth transitions without erratic tempo changes.
    """
    ideal_wpm = 150
    wpm_deviation = min(30, abs(wpm - ideal_wpm))  # Cap at 30 WPM deviation
    wpm_consistency = max(0, 100 - (wpm_deviation * 1.67))  # 100-50 for max deviation

    # Sudden Speech Shift Penalty
    filler_penalty = min(filler_count / 10, 1.0)
    pause_penalty = min(long_pause_count / 5, 1.0)
    pitch_penalty = min(pitch_variation / 3.0, 1.0)  # High variation → unstable

    # Combine into absence of sudden shifts
    stability = (1 - ((filler_penalty + pause_penalty + pitch_penalty) / 3)) * 100

    # Final SRS Score
    SRS = (0.45 * wpm_consistency) + (0.55 * stability)
    #print(f"wpm_consistency: {wpm_consistency}, stability: {stability}")
    return min(100, max(0, SRS))

def calc_vers(filler_count, long_pause_count, pitch_variation, mean_volume_db, vol_max_db, wpm, volume_std, valence_scores):
    ESS = calc_ess(pitch_variation, vol_max_db, mean_volume_db, valence_scores)
    LCS = calc_lcs(volume_std, vol_max_db, mean_volume_db)
    SRS = calc_srs(wpm, filler_count, long_pause_count, pitch_variation)
    
    # Calculate the VERS score using the formula
    VERS = (0.5 * ESS) + (0.3 * LCS) + (0.2 * SRS)  # This would be value from 0 to 100 
    
    if VERS > 0 and VERS < 50:
        insight = """Poor regulation—noticeable swings in tone and uncontrolled
                     emotional expression. Feedback: Consider exercises and professional 
                     coaching to stabilize your emotional delivery."""
    elif VERS >= 50 and VERS < 80:
        insight = """Moderate regulation—occasional fluctuations or abrupt changes. 
                     Feedback: Work on smoothing out volume changes and maintaining a steady tone."""
    elif VERS >= 80 and VERS <= 100:
        insight = """Excellent regulation—steady tone and controlled volume dynamics. 
                     Feedback: Continue using techniques that maintain emotional balance."""
    else:
        insight = "Invalid score calculated"
    
    return {
        "VERS": int(VERS),
        # "ESS": round(ESS, 1),
        # "LCS": round(LCS, 1),
        # "SRS": round(SRS, 1),
        # "insight": insight
    }

# # Test input
# test_result = calc_vers(
#     filler_count=4,
#     long_pause_count=2,
#     pitch_variation=3.2,
#     mean_volume_db=65,
#     vol_max_db=82,
#     wpm=148,
#     volume_std=4.1,
#     valence_scores=[5.2, 5.5, 4.9]
# )

# print("VERS Score:", test_result["VERS"])
# print("ESS:", test_result["ESS"])
# print("LCS:", test_result["LCS"])
# print("SRS:", test_result["SRS"])
# print("Insight:", test_result["insight"])