Skip to content

Instantly share code, notes, and snippets.

@jvanyom
Last active May 2, 2019 15:32
Show Gist options
  • Save jvanyom/2826b5e3fa97e30e2a5583a7e873542b to your computer and use it in GitHub Desktop.
Save jvanyom/2826b5e3fa97e30e2a5583a7e873542b to your computer and use it in GitHub Desktop.
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