Last active
May 2, 2019 15:32
-
-
Save jvanyom/2826b5e3fa97e30e2a5583a7e873542b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import speech_recognition as libreria_reconocimiento_de_voz | |
from gtts import gTTS | |
from playsound import playsound | |
import os | |
import unidecode | |
import re | |
# Función para reconocer la voz proveniente del micrófono. | |
def reconocer_voz_microfono(reconocer_voz, microfono): | |
# Comrpueba que los parámetros 'reconocer_voz' y 'microfono' sean de tipo | |
# 'Recognizer' y de 'Microphone' respectivamente. | |
if not isinstance(reconocer_voz, libreria_reconocimiento_de_voz.Recognizer): | |
raise TypeError("'reconocer_voz' tiene que ser de tipo 'Recognizer'") | |
if not isinstance(microfono, libreria_reconocimiento_de_voz.Microphone): | |
raise TypeError("'microfono' tiene que ser de tipo 'Microphone'") | |
# Cogiendo el microfono como entrada ajusta la sensibilidad para captar | |
# mejor el sonido si hay ruido de fondo. Además aplica un timeout de 30 | |
# segundos para aplicar la entrada de voz. | |
with microfono as fuente: | |
reconocer_voz.adjust_for_ambient_noise(fuente) | |
audio = reconocer_voz.listen(fuente, timeout=20) | |
# Diccionario de los parámetros que puede contener la respuesta. | |
respuesta = { | |
"valida": True, | |
"error": None, | |
"transcripcion": None | |
} | |
# Intentará transcribir lo que se haya dicho a través del micrófono. | |
try: | |
respuesta["transcripcion"] = reconocer_voz.recognize_google(audio, language = "es-es") | |
# Si no se puede transcribir la voz porque 'recognize_google' nos devuelve un error inesperado, se ejecutará lo siguiente. | |
except libreria_reconocimiento_de_voz.RequestError: | |
# La API 'recognize_google' no está disponible | |
respuesta["valida"] = False | |
respuesta["error"] = "La API 'recognize_google' no está disponible" | |
# Si no se puede transcribir la voz porque no se puede reconocer lo que se ha dicho, se ejecutará lo siguiente. | |
except libreria_reconocimiento_de_voz.UnknownValueError: | |
# Incapaz de reconocerse la voz | |
respuesta["error"] = "No entiendo lo que me has dicho. ¿Puedes repetirlo?\n" | |
# Siempre nos devolverá el diccionario 'respuesta', pero dependiendo de lo que haya pasado, nos devolverá un valor u otro en cada key. | |
return respuesta | |
# Función que recorre las entardas que se establezacan y las junta separadas por una coma | |
def separacion_por_comas(entr1): | |
return ', '.join(x if isinstance(x, str) else separacion_por_comas(x) for x in entr1) | |
# Función para el input de audio del usuario | |
def entrada_de_audio(): | |
bucle_de_voz = True | |
while bucle_de_voz: | |
try: | |
entrada_de_voz = reconocer_voz_microfono(reconocer_voz, microfono) | |
if entrada_de_voz["transcripcion"]: | |
respuesta_usuario = (entrada_de_voz["transcripcion"]) | |
print (respuesta_usuario) | |
break | |
if not entrada_de_voz["valida"]: | |
error_externo_api = (entrada_de_voz["error"]) | |
print (error_externo_api) | |
break | |
print(entrada_de_voz["error"]) | |
except libreria_reconocimiento_de_voz.WaitTimeoutError: | |
print("\nSentimos que te hayas aburrido, ¡hasta la próxima!") | |
break | |
# Función que subsitiuye los carácteres especiales por sus equivalentes y los transforma a minúsculas | |
def limpiar_entradas(entrada): | |
entrada_sin_caracteres_especiales = unidecode.unidecode(entrada) | |
entrada_limpia = re.sub(r'[^\w]', '', entrada_sin_caracteres_especiales) | |
entrada_limpia = entrada_limpia.lower() | |
return entrada_limpia | |
# Iniciaremos las instancias de 'reconocer_voz' y 'microfono'. Es recomendable utilizar el dispositivo de micrófono | |
# por defecto para que pueda funcionar en la gran mayoría de casos. | |
reconocer_voz = libreria_reconocimiento_de_voz.Recognizer() | |
microfono = libreria_reconocimiento_de_voz.Microphone(device_index=5) | |
# Bienvenida | |
bienvenida = "¡Bienvenido a RIU! ¿En qué podemos ayudarte?\n" | |
ruta_archivo_audio_bienvenida = "/tmp/bienvenida.mp3" | |
# Genera el audio con el texto de 'bienvenida' y lo guarda en '/tmp/bienvenida.mp3' | |
archivo_audio_bienvenida = gTTS(text=bienvenida, lang='es') | |
archivo_audio_bienvenida.save(ruta_archivo_audio_bienvenida) | |
# Imprime el texto y ejecuta el archivo de audio | |
print (bienvenida) | |
playsound(ruta_archivo_audio_bienvenida) | |
# Después de ejecutar el archivo de audio, se borrará | |
os.remove(ruta_archivo_audio_bienvenida) | |
entrada_de_audio() | |
# Se limpia la entrada del usuario | |
respuesta_usuario_limpia = limpiar_entradas(respuesta_usuario) | |
respuestas_validas = { | |
"cuantoshotelestieneriu" : "\nActualmente RIU tiene 97 hoteles", | |
"enqueanosefundoriu" : "\nRIU se fundó en el año 1953", | |
} | |
# Siempre y cuando la respuesta del usuario no esté dentro de 'respuestas_validas', el programa no entenderá que le está diciendo | |
while True: | |
if respuesta_usuario_limpia in respuestas_validas: | |
# Contestación | |
contestacion = respuestas_validas[respuesta_usuario_limpia] | |
ruta_archivo_audio_contestacion = "/tmp/contestacion.mp3" | |
# Genera el audio con el texto de 'contestacion' y lo guarda en '/tmp/contestacion.mp3' | |
archivo_audio_contestacion = gTTS(text=contestacion, lang='es') | |
archivo_audio_contestacion.save(ruta_archivo_audio_contestacion) | |
# Imprime el texto y ejecuta el archivo de audio | |
print (contestacion) | |
playsound(ruta_archivo_audio_contestacion) | |
# Después de ejecutar el archivo de audio, se borrará | |
os.remove(ruta_archivo_audio_contestacion) | |
break | |
respuesta_usuario = "¿Perdona, no te he entendido, puedes repetirlo?\n\n" | |
no_entiende = respuesta_usuario | |
ruta_archivo_audio_no_entiende = "/tmp/no_entiende.mp3" | |
# Genera el audio con el texto de 'no_entiende' y lo guarda en '/tmp/no_entiende.mp3' | |
archivo_audio_no_entiende = gTTS(text=no_entiende, lang='es') | |
archivo_audio_no_entiende.save(ruta_archivo_audio_no_entiende) | |
# Imprime el texto y ejecuta el archivo de audio | |
print (no_entiende) | |
playsound(ruta_archivo_audio_no_entiende) | |
# Después de ejecutar el archivo de audio, se borrará | |
os.remove(ruta_archivo_audio_no_entiende) | |
respuesta_usuario_limpia = limpiar_entradas(respuesta_usuario) | |
entrada_de_audio() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment