Adrian8as commited on
Commit
c8ef9ad
·
verified ·
1 Parent(s): 8252c3a

Upload 4 files

Browse files
Files changed (4) hide show
  1. app.py +175 -0
  2. audio.wav +0 -0
  3. models/model.pkl +3 -0
  4. requirements.txt +8 -0
app.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st, librosa, joblib, numpy as np
2
+ import io
3
+ from st_audiorec import st_audiorec
4
+ from scipy.interpolate import interp1d
5
+ from pydub.silence import detect_nonsilent
6
+ from pydub import AudioSegment
7
+
8
+
9
+ st.set_page_config(page_title="Cobranza temprana demo")
10
+
11
+ # Design move app further up and remove top padding
12
+ st.markdown('''<style>.css-1egvi7u {margin-top: -3rem;}</style>''',
13
+ unsafe_allow_html=True)
14
+ # Design change st.Audio to fixed height of 45 pixels
15
+ st.markdown('''<style>.stAudio {height: 45px;}</style>''',
16
+ unsafe_allow_html=True)
17
+
18
+
19
+ def smart_resize(arr, target_size):
20
+ current_size = arr.shape[1]
21
+
22
+ current_idx = np.linspace(0, current_size - 1, current_size)
23
+ target_idx = np.linspace(0, current_size - 1, target_size)
24
+
25
+ # Interpolate/extrapolate
26
+ interp_func = interp1d(current_idx, arr.squeeze(), kind='linear', fill_value="extrapolate")
27
+ resized_arr = interp_func(target_idx)
28
+
29
+ return resized_arr.reshape(1, target_size)
30
+
31
+ def remove_silence(wav_file):
32
+ s = io.BytesIO(wav_file)
33
+ audSeg = AudioSegment.from_file(s)
34
+ non_silence_ranges = detect_nonsilent(audSeg, min_silence_len=5, silence_thresh=-30)
35
+
36
+ if not non_silence_ranges:
37
+ sound = audSeg
38
+ else:
39
+ start = non_silence_ranges[0][0]
40
+ end = non_silence_ranges[-1][1]
41
+ trimmed_sound = audSeg[start:end]
42
+ sound = trimmed_sound
43
+
44
+ sound.export('audio.wav', format="wav")
45
+
46
+ def transform_data(audio):
47
+ remove_silence(audio)
48
+ x, sr = librosa.load('audio.wav')
49
+
50
+ result = librosa.feature.poly_features(y=x)
51
+
52
+ resize_features = smart_resize(result.reshape(1,-1), 50)
53
+
54
+ return resize_features
55
+
56
+ def predict(newdf, loaded_model):
57
+
58
+ prediction = loaded_model.predict(newdf)
59
+
60
+ proba = loaded_model.predict_proba(newdf)
61
+
62
+ return prediction, proba[0]
63
+
64
+ def get_label(newpred):
65
+ if newpred == 0:
66
+ return 'Negative'
67
+ else:
68
+ return 'Affirmative'
69
+
70
+ def load_model():
71
+ loaded_model = joblib.load('models/model.pkl')
72
+
73
+ return loaded_model
74
+
75
+ def main(audio):
76
+ newdf = transform_data(audio)
77
+ loaded_model = load_model()
78
+ newpred, proba = predict(newdf, loaded_model)
79
+ final = get_label(newpred)
80
+
81
+ return final, {'Affirmative': proba[1],
82
+ 'Negative': proba[0]}
83
+
84
+ def on_click(audio):
85
+ if audio is not None:
86
+ label, proba = main(audio)
87
+
88
+ st.session_state.proba = f"Se detectó una sentencia {label}, Probabilidad: {proba}"
89
+
90
+ if label == 'Affirmative' and st.session_state.count == 0:
91
+ 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'
92
+ st.session_state.affirmative_text = "**Afirmar:** 'Si', 'Está bien', 'Simón'"
93
+ st.session_state.negative_text = "**Negar:** 'No', 'Nel', 'Imposible',"
94
+ st.session_state.count = 1
95
+ elif label == 'Negative' and st.session_state.count == 0:
96
+ st.session_state.pregunta_text = 'STC-105: Disculpe, ¿usted conoce a (NOMBRE)?'
97
+ st.session_state.affirmative_text = "**Afirmar:** 'Si', 'Es mi hermano', 'Es mi papá', 'Sé quién es', 'Correcto'"
98
+ st.session_state.negative_text = "**Negar:** 'No', 'Está equivocado', 'Número equivocado', 'Ya les dije que no'"
99
+ st.session_state.count = 2
100
+ elif label == 'Affirmative' and st.session_state.count == 1:
101
+ 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'
102
+ st.session_state.affirmative_text = ""
103
+ st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
104
+ st.session_state.count = 1
105
+ elif label == 'Negative' and st.session_state.count == 1:
106
+ st.session_state.pregunta_text = 'STC-130: ¿Podrás pagar antes del (FECHA_LIMITE_PAGO)?'
107
+ st.session_state.affirmative_text = "**Afirmar:** stc_110 = 'Si', 'Está bien', 'Simón'"
108
+ st.session_state.negative_text = "**Negar:** 'No', 'Nel', 'Imposible',"
109
+ st.session_state.count = 3
110
+ elif label == 'Affirmative' and st.session_state.count == 2:
111
+ 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.'
112
+ st.session_state.affirmative_text = ""
113
+ st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
114
+ st.session_state.count = 2
115
+ elif label == 'Negative' and st.session_state.count == 2:
116
+ st.session_state.pregunta_text = 'Disculpe por la molestia, ¡Que tenga un excelente dia!'
117
+ st.session_state.affirmative_text = ""
118
+ st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
119
+ st.session_state.count = 1
120
+ elif label == 'Affirmative' and st.session_state.count == 3:
121
+ 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.'
122
+ st.session_state.affirmative_text = ""
123
+ st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
124
+ st.session_state.count = 2
125
+ elif label == 'Negative' and st.session_state.count == 3:
126
+ 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'
127
+ st.session_state.affirmative_text = ""
128
+ st.session_state.negative_text = "**Reinicia la página para probar otra vez**"
129
+ st.session_state.count = 1
130
+
131
+ st.rerun()
132
+
133
+ def audiorec_demo_app():
134
+ st.write(st.session_state.proba)
135
+ st.title('Cobranza temprana - Demo')
136
+ st.write('\n')
137
+
138
+ st.subheader(st.session_state.pregunta_text)
139
+ st.write('**Opciones:**')
140
+ st.write(st.session_state.affirmative_text)
141
+ st.write(st.session_state.negative_text)
142
+
143
+ st.write('\n')
144
+ st.write('\nGraba tu respuesta y cuando estés listo pulsa enviar:')
145
+ wav_audio_data = st_audiorec()
146
+
147
+ if st.session_state.key == wav_audio_data or wav_audio_data == b:
148
+ st.write('\nPor favor, presiona "Reset" e intentalo de nuevo')
149
+
150
+ if st.button("Enviar"):
151
+ on_click(wav_audio_data)
152
+
153
+
154
+ if __name__ == '__main__':
155
+ if 'count' not in st.session_state:
156
+ st.session_state.count = 0
157
+
158
+ 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'
159
+
160
+ if 'key' not in st.session_state:
161
+ st.session_state.key = b
162
+
163
+ if 'pregunta_text' not in st.session_state:
164
+ st.session_state.pregunta_text = "STC-100: Hola, buen día. Nos comunicamos de (MARCA) me comunico con (NOMBRE)\n"
165
+
166
+ if 'affirmative_text' not in st.session_state:
167
+ st.session_state.affirmative_text = "**Afirmar:** 'Si', 'Él habla', 'Ella habla', 'Correcto', 'Así es', 'Soy yo'"
168
+
169
+ if 'negative_text' not in st.session_state:
170
+ st.session_state.negative_text = "**Negar:** 'No', 'Con el hijo', 'Con el tío', 'Con el papá', 'Nel'"
171
+
172
+ if 'proba' not in st.session_state:
173
+ st.session_state.proba = ""
174
+
175
+ audiorec_demo_app()
audio.wav ADDED
Binary file (80.7 kB). View file
 
models/model.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8d33b9db3ec1321bf6436d6a25e0485a2166e25454266bab27eb111212700de7
3
+ size 1565735
requirements.txt ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ streamlit
2
+ librosa
3
+ joblib
4
+ numpy
5
+ io
6
+ st_audiorec
7
+ scipy
8
+ pydub