File size: 7,818 Bytes
c8ef9ad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
import streamlit as st, librosa, joblib, numpy as np
import io
from st_audiorec import st_audiorec
from scipy.interpolate import interp1d
from pydub.silence import detect_nonsilent
from pydub import AudioSegment


st.set_page_config(page_title="Cobranza temprana demo")

# Design move app further up and remove top padding
st.markdown('''<style>.css-1egvi7u {margin-top: -3rem;}</style>''',
            unsafe_allow_html=True)
# Design change st.Audio to fixed height of 45 pixels
st.markdown('''<style>.stAudio {height: 45px;}</style>''',
            unsafe_allow_html=True)


def smart_resize(arr, target_size):
    current_size = arr.shape[1]

    current_idx = np.linspace(0, current_size - 1, current_size)
    target_idx = np.linspace(0, current_size - 1, target_size)

    # Interpolate/extrapolate
    interp_func = interp1d(current_idx, arr.squeeze(), kind='linear', fill_value="extrapolate")
    resized_arr = interp_func(target_idx)
    
    return resized_arr.reshape(1, target_size)

def remove_silence(wav_file):
    s = io.BytesIO(wav_file)
    audSeg = AudioSegment.from_file(s)
    non_silence_ranges = detect_nonsilent(audSeg, min_silence_len=5, silence_thresh=-30)

    if not non_silence_ranges: 
        sound = audSeg
    else:
        start = non_silence_ranges[0][0]
        end = non_silence_ranges[-1][1]
        trimmed_sound = audSeg[start:end]
        sound = trimmed_sound

    sound.export('audio.wav', format="wav")

def transform_data(audio):
    remove_silence(audio)
    x, sr = librosa.load('audio.wav')

    result = librosa.feature.poly_features(y=x)

    resize_features = smart_resize(result.reshape(1,-1), 50) 

    return resize_features

def predict(newdf, loaded_model):
    
    prediction = loaded_model.predict(newdf)

    proba = loaded_model.predict_proba(newdf)

    return prediction, proba[0] 
    
def get_label(newpred):
    if newpred == 0:
        return 'Negative'
    else:
        return 'Affirmative'

def load_model():
    loaded_model = joblib.load('models/model.pkl') 

    return loaded_model
    
def main(audio):
    newdf = transform_data(audio)
    loaded_model = load_model()
    newpred, proba = predict(newdf, loaded_model)
    final = get_label(newpred)

    return final, {'Affirmative': proba[1],
                   'Negative': proba[0]}

def on_click(audio):
    if audio is not None:
        label, proba = main(audio)

        st.session_state.proba = f"Se detectó una sentencia {label}, Probabilidad: {proba}"

        if label == 'Affirmative' and st.session_state.count == 0:
            st.session_state.pregunta_text = 'STC-110: Muchas gracias, soy un agente virtual de (MARCA) te recordamos que tienes pendiente el pago de (PRODUCTO) por un monto de (ADEUDO) pesos el cual se encuentra vencido, ¿Podrás pagar el día de hoy?\n'
            st.session_state.affirmative_text = "**Afirmar:** 'Si', 'Está bien', 'Simón'"
            st.session_state.negative_text = "**Negar:** 'No', 'Nel', 'Imposible',"
            st.session_state.count = 1
        elif label == 'Negative' and st.session_state.count == 0:
            st.session_state.pregunta_text = 'STC-105: Disculpe, ¿usted conoce a (NOMBRE)?'
            st.session_state.affirmative_text = "**Afirmar:** 'Si', 'Es mi hermano', 'Es mi papá', 'Sé quién es', 'Correcto'"
            st.session_state.negative_text = "**Negar:** 'No', 'Está equivocado', 'Número equivocado', 'Ya les dije que no'"
            st.session_state.count = 2
        elif label == 'Affirmative' and st.session_state.count == 1:
            st.session_state.pregunta_text = 'Gracias, hemos registrado tu compromiso de pago para el día de hoy gracias por preferir (MARCA) que tengas un excelente día.\n'
            st.session_state.affirmative_text = ""
            st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
            st.session_state.count = 1
        elif label == 'Negative' and st.session_state.count == 1:
            st.session_state.pregunta_text = 'STC-130: ¿Podrás pagar antes del (FECHA_LIMITE_PAGO)?'
            st.session_state.affirmative_text = "**Afirmar:** stc_110 = 'Si', 'Está bien', 'Simón'"
            st.session_state.negative_text = "**Negar:** 'No', 'Nel', 'Imposible',"
            st.session_state.count = 3
        elif label == 'Affirmative' and st.session_state.count == 2:
            st.session_state.pregunta_text = 'Gracias, por favor indíquele que lo hemos llamamos de (MARCA), y que volveremos a llamar. Gracias por preferir (MARCA) que tenga un excelente día.'
            st.session_state.affirmative_text = ""
            st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
            st.session_state.count = 2
        elif label == 'Negative' and st.session_state.count == 2:
            st.session_state.pregunta_text = 'Disculpe por la molestia, ¡Que tenga un excelente dia!'
            st.session_state.affirmative_text = ""
            st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
            st.session_state.count = 1
        elif label == 'Affirmative' and st.session_state.count == 3:
            st.session_state.pregunta_text = 'Gracias, hemos registrado tu compromiso de pago para antes del (FECHA_LIMITE_PAGO). Por tu seguridad esta llamada ha sido grabada. Realiza tu pago en línea, o bien en una de nuestras sucursales en tu ciudad. Gracias por preferir (MARCA) que tengas un excelente día.'
            st.session_state.affirmative_text = ""
            st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
            st.session_state.count = 2
        elif label == 'Negative' and st.session_state.count == 3:
            st.session_state.pregunta_text = 'Recuerda que estando al día en tus pagos, evitas el cobro de intereses moratorios y mantienes un bien historial crediticio. Gracias por preferir (MARCA), por favor no cuelgues te estamos transfiriendo con uno de nuestros ejecutivos, por favor sigue en la linea'
            st.session_state.affirmative_text = ""
            st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
            st.session_state.count = 1
    
    st.rerun()

def audiorec_demo_app():
    st.write(st.session_state.proba)       
    st.title('Cobranza temprana - Demo')
    st.write('\n') 

    st.subheader(st.session_state.pregunta_text)
    st.write('**Opciones:**')
    st.write(st.session_state.affirmative_text)
    st.write(st.session_state.negative_text)
     
    st.write('\n')   
    st.write('\nGraba tu respuesta y cuando estés listo pulsa enviar:') 
    wav_audio_data = st_audiorec() 

    if st.session_state.key == wav_audio_data or wav_audio_data == b:
         st.write('\nPor favor, presiona "Reset" e intentalo de nuevo')
    
    if st.button("Enviar"):
        on_click(wav_audio_data)


if __name__ == '__main__':
    if 'count' not in st.session_state:
        st.session_state.count = 0

    b = b'RIFF,\x00\x00\x00WAVEfmt \x10\x00\x00\x00\x01\x00\x02\x00D\xac\x00\x00\x10\xb1\x02\x00\x04\x00\x10\x00data\x00\x00\x00\x00'

    if 'key' not in st.session_state:
        st.session_state.key = b

    if 'pregunta_text' not in st.session_state:
        st.session_state.pregunta_text = "STC-100: Hola, buen día. Nos comunicamos de (MARCA) me comunico con (NOMBRE)\n"

    if 'affirmative_text' not in st.session_state:
        st.session_state.affirmative_text = "**Afirmar:** 'Si', 'Él habla', 'Ella habla', 'Correcto', 'Así es', 'Soy yo'"

    if 'negative_text' not in st.session_state:
        st.session_state.negative_text = "**Negar:** 'No', 'Con el hijo', 'Con el tío', 'Con el papá', 'Nel'"

    if 'proba' not in st.session_state:
        st.session_state.proba = ""

    audiorec_demo_app()