Spaces:
Sleeping
Sleeping
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', 'Sí puedo', 'Creo que sí', 'Podría ser', 'Sí podré', 'Claro que sí', 'Está bien', 'Simón'" | |
st.session_state.negative_text = "**Negar:** 'No', 'Nel', 'Imposible', 'No creo', 'No tengo dinero', 'No tengo lana', 'No voy a pagar', 'No puedo'" | |
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', 'Sí lo conozco', 'Es mi hermana', 'Es mi hijo', 'Es mi mamá', 'Afirmativo', 'Así es', 'Simón', 'Sí dime'" | |
st.session_state.negative_text = "**Negar:** 'No', 'Está equivocado', 'Número equivocado', 'Ya les dije que no', 'No lo conozco', 'No sé quién es'" | |
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:** 'Si', 'Sí puedo', 'Creo que sí', 'Podría ser', 'Sí podré', 'Claro que sí', 'Está bien', 'Simón'" | |
st.session_state.negative_text = "**Negar:** 'No', 'Nel', 'Imposible', 'No creo', 'No tengo dinero', 'No tengo lana', 'No voy a pagar', 'No puedo', 'Tampoco', 'Tampoco puedo'" | |
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', 'Sí, ella habla', 'Sí, diga', 'Sí, él habla', 'Sí soy', 'Sí dime'" | |
if 'negative_text' not in st.session_state: | |
st.session_state.negative_text = "**Negar:** 'No', 'Con el hijo', 'Con el tío', 'Nel', 'Incorrecto', 'Negativo', 'Equivocado', 'No se encuentra', 'No soy yo', 'Falleció', 'Con la esposa', 'Con el esposo', 'Con la tía'" | |
if 'proba' not in st.session_state: | |
st.session_state.proba = "" | |
audiorec_demo_app() |