Descubriendo con Python el procesamiento del lenguaje natural (NLP)

Santiago Bula M.
7 min readApr 13, 2023

--

Liberar el potencial de los asistentes de voz no requiere contar con sofisticados equipos de procesamiento, una laptop con Python es suficiente, en este post voy a compartir mi experiencia descubriendo las aplicaciones de los comandos de lenguaje natural.

¿Qué es un asistente de voz?

Un asistente de voz o VoiceAssistant es un programa capaz de ejecutar tareas o funciones guiándose por comandos de voz. La calidad de un asistente de voz radica en su capacidad de reconocer distintos comandos de voz para la misma tarea. En este post veremos un VoiceAssistant de nivel intermedio pero que puede potenciar a un nivel mayor si destinas en tu laptop un espacio de tu disco duro y lo entrenas.

DEMO

¿Cómo construyo un asistente de Voz?

Antes de empezar a programar, siempre recomiendo sentarse un momento y pensar qué es lo que queremos que nuestro código haga, esto lo puedes hacer incluso con papel y lápiz. Una vez tengas un boceto de tu asistente (Nombre, Funciones, Apps enlazadas) y verifiques que tu computador puede soportar el código puedes empezar a trabajar.

Requisitos

1. Mínimo 2 GB Libres en el disco duro

2. Mínimo 4 GB de RAM

3. Editor de Código (e.g Visual Studio Code o PyCharm)

4. Instala HomeBrew (Solo para MacOS)*

"""
*Si no sabes instalar HomeBrew abre la app terminal y pega este código:
"""
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

El eje central de un VoiceAssistant es que logre comprender lo que decimos y pueda hablar con nosotros, y para eso debemos hacer que convierta nuestras palabras a un formato que él sí sea capaz de interpretar, en este caso el texto y que el pueda convertir sus outputs en palabras. Vamos a instalar Pyttsx3, que es una librería de conversión de texto-hacia-voz. A diferencia de otras librerías esta opera offline y es compatible con Python 2 en adelante.

Instalación

Abrir Terminal y escribir:

pip install pyttsx3

# En caso de error y usas windows escribe antes pip install pypiwin32

Ver si funciona

Abre tu editor de texto (VS Code o PyCharm recomiendo) y ejecuta el siguiente texto.

import pyttsx3
engine = pyttsx3.init()
engine.say("Hello I am Skynet, Happy to meet you")
engine.runAndWait()

# Deberias ser capaz de escuchar el texto en "_"

Hasta ahora el asistente puede hablar, pero no puede oir entonces vamos a instalar la librería de SpeechRecognition.

Instalación

Abrir Terminal y escribir:

pip install SpeechRecognition

Ver si funciona

Abre tu editor de texto (VS Code o PyCharm recomiendo) y ejecuta el siguiente texto.

# *NOTA*: Requieres tener instalado PyAudio porque este código usa tu microfono

import speech_recognition as sr

# Obtener audio del microfono
r = sr.Recognizer()
with sr.Microphone() as source:
print("Say something!")
audio = r.listen(source)

"""
Hay varios interpretes de voz gratuitos y pagos, te coloco ejemplo de algunos,
usa el que más te guste pero yo prefiero el de Google. Si cambias el contenido
dentro de print("") veras que el codigo te dirá algo distinto
"""

# Reconocimiento de voz con Sphin
try:
print("Sphinx thinks you said " + r.recognize_sphinx(audio))
except sr.UnknownValueError:
print("Sphinx could not understand audio")
except sr.RequestError as e:
print("Sphinx error; {0}".format(e))

# Reconocimiento de voz con Google Speech Recognition
try:
# for testing purposes, we're just using the default API key
# to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
# instead of `r.recognize_google(audio)`
print("Google Speech Recognition thinks you said " + r.recognize_google(audio))
except sr.UnknownValueError:
print("Google Speech Recognition could not understand audio")
except sr.RequestError as e:
print("Could not request results from Google Speech Recognition service; {0}".format(e))

# Reconocimiento de voz con whisper
try:
print("Whisper thinks you said " + r.recognize_whisper(audio, language="english"))
except sr.UnknownValueError:
print("Whisper could not understand audio")
except sr.RequestError as e:
print("Could not request results from Whisper")

Sobre los interpretes de texto depende que el Voice Assistant sea capaz de detectar otros idiomas, si quisieras que el asistente pudiera hablar otro idioma debes verificar que exista una librería de respaldo. Te dejo la lista de idiomas disponibles en este link.

CLICK AQUI PARA LA LISTA

Ya en este nível eres capaz de que python pueda convertir en texto lo que dices y él leer sus respuestas. Ahora vamos a hacer que se ejecute presentándose y preguntándonos qué queremos.

engine = pyttsx3.init()

def speak(audio):
engine.say(audio)
engine.runAndWait()

def getvoices(voice):
voices = engine.getProperty('voices')
# print(voices[1].id)
if voice == 1:
engine.setProperty('voice', voices[6].id)
speak("Hola soy su asistente virtual")

def takeCommandMic():
r = sr.Recognizer()
with sr.Microphone() as source:
print("Escuchando...")
r.pause_threshold = 1
audio = r.listen(source)
try:
print("Pensando en su respuesta...")
query = r.recognize_google(audio, language="es-CO") # Ajusta el Idioma
print(query)
except Exception as e:
print(e)
speak("Digámelo de nuevo, por favor")
return "None"
return query

getvoices(1)
query = takeCommandMic().lower()
print(query)

En este paso ya debe ser capaz de interpretar hacia texto lo que decimos, sin embargo, el tiempo de respuesta de tu asistente puede no ser tan fluido como en una conversación real. Esto depende mucho de la velocidad de procesamiento del asistente, es por eso que muchos funcionan solo en línea ya que no usan recursos de tu dispositivo sino de una terminal de origen.

Para que la experiencia sea más natural colocamos un {except} para que pida que volvamos a decir nuestro comando de voz en caso de que no alcance a procesar nuestros comandos.

Siendo capaz de “oir” y “hablar” al asistente solo le hace falta aprender tareas. la programación es bastante sencilla, Definimos las tareas que queremos que haga y las alojamos en un condicional para que su ejecución dependa del input de nuestra voz.

# Decir la hora
def time():
Time = datetime.datetime.now().strftime("%I:%M:%S") # I:Hours, M:Minutes, S:Seconds
speak("la hora actual es:")
speak(Time)

# Buscar en Google
def searchGoogle():
speak('Que debería buscar?')
search = takeCommandMic # past: function
search_content = search() # present: str
wb.open('https://www.google.com/search?q='+search_content) # It was so tricky, u can concatenate str and str :) :) :)

if __name__ == "__main__":
getvoices(1)
wishme()
while True:
query = takeCommandMic().lower()
#query = word_tokenize(query)
#print(query)

if 'hora' in query:
time()

elif 'google' in query:
searchGoogle()

Enhorabuena! Ya tienes tu asistente de voz corriendo, sin embargo para que no para y sigue escuchando eternamente. Entonces vamos a agregar una función extra para que se vaya a dormir.

if __name__ == "__main__":
getvoices(1)
wishme()
while True:
query = takeCommandMic().lower()
#query = word_tokenize(query)
#print(query)

if 'hora' in query:
time()

elif 'google' in query:
searchGoogle()

elif 'dormir' in query:
quit()

Como te haz dado cuenta no tuvimos que definir una función, y es porque podríamos meter dentro de nuestro condicional la función directamente, pero usualmente cuando programamos aparecen errores y si los tenemos mejor organizados son más fácil de identificarlos.

En este punto ya tienes la lógica de programación de un asistente, pero si sigues interactuando con el te darás cuenta que suele confundir algunas palabras cuando hablamos con él. Para que el asistente se más eficiente debemos introducir un concepto el NLP (Natural Language Processing)

¿Qué es el NLP?

Al igual que nosotros los humanos, aprendimos a hablar porque escuchamos desde que nacimos nuestro idioma nativo. Las maquinas al no tener oídos necesitan entender el lenguaje en un formato distinto.

El NLP basicamente lo que hace es coger el texto del interprete y tokenizarlo, de modo tal que fragmenta las oraciones para poder analizar palabra por palabra. Si podemos asignar un comando especifico a una tarea la tokenización hará más eficiente el reconocimiento de texto. En python tenemos varios toolkits para ello.

Instalación

pip install --user -U nltk # NLTK

Importar librería

import nltk
from nltk.tokenize

sentence = "Hey Pacho que tal estuvo tu día en el mundo Matrix?"
output = word_tokenize(sentence)
print(output)

Con el output de este código ya se tiene una imagen más clara de que hace el NLP con nuestras palabras, pero para poder incorporarlo en nuestro VoiceAssistant toca construir un ambiente virtual donde el código pueda ir aprendiendo y retroalimentándose de sus outputs, y si estas pensando que esto se parece a Machine Learning estas en todo lo correcto.

Para poder hacer esto debes instalar un programa llamado Anaconda, te comparto este sitio web donde explican muy bien este proceso y hay documentación adicional

https://docs.python-guide.org/dev/virtualenvs/

Conclusión

Bueno con este post espero que hallas podido explorar el mundo de funcionalidades que tiene python, con este lenguaje puedes hacer el Back-End de una aplicación web capaz de interactuar con ciegos o un videjuego con comandos por voz, o lo que te imagines. Espero poder haberte compartido contenido nuevo y si quieres compartir algo agrega comentarios al blog.

--

--

Santiago Bula M.
Santiago Bula M.

Written by Santiago Bula M.

0 Followers

Colombiano 🇨🇴 | <\Desarrollador_Creativo> | "Apasionado por la divulgación de datos, el diseño y la programación 👨🏽‍💻" | Python, R, HTML/CSS, Photoshop

No responses yet