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()
|