Reconocimiento de voz y procesamiento de texto
Convirtiendo Audio Analógico a texto para análisis con PLN.
Contenido
1.Introducción
2.Procesos
3.Conclusión
4.Recursos
1.Introducción
El objetivo es extraer información de audios analógicos y transformarlos en texto, procesar la información y efectuar operaciones básicas como traducción de idiomas y análisis semántico de palabras básicas con procesos del lenguaje natural PLN, utilizando las librerías: speech_recognition, googletrans, spacy.
Acerca de los datos de audio utilizados
Open Speech Repository proporciona archivos de voz de uso gratuito en varios idiomas para su uso en pruebas de voz sobre IP y otras aplicaciones. Este repositorio fue desarrollado por Telchemy para facilitar la investigación académica y de la industria en los campos de calidad de voz, códecs de voz, reconocimiento de voz y otras áreas. Para este proyecto utilizo el archivo “OSR_us_000_0061_8k.wav” el cual se correspode al idioma de inglés americano compuesto por un solo canal de voz.
Acerca del preprocesamiento de texto
Hay algunos tipos de preprocesamiento para mejorar la forma en que modelamos con las palabras. El primero es “lemmatizar” una palabra en su forma base. Por ejemplo, “tono” es el lema de la palabra “tonos”.
También es común eliminar las palabras de parada conocidas como stopwords. Las stopwords son palabras que aparecen frecuentemente en el lenguaje y no contienen mucha información como por ejemplo “el” “de” “en” “si” , etc…
Con un token spacy, token.lemma_ devuelve el lema, mientras que token.is_stop devuelve un booleano Verdadero si el token es una palabra de parada (y Falso en caso contrario).
palabras clave de identificación
Los datos lingüísticos tienen mucho ruido mezclado con contenido informativo. Eliminar las palabras de parada podría ayudar a centrarse en las palabras más relevantes. La lematización ayuda de manera similar al combinar múltiples formas de la misma palabra en una forma base (“calmante”, “calma”, “calmado” cambiaría a “tranquilo”). Sin embargo, lemmatizar y dejar caer las palabras de parada podría hacer que sus modelos predictivos funcionaran peor, por lo tanto, debe tratar este preprocesamiento como parte de su proceso de optimización de hiperparámetros.
2.Procesos
2.1 Carga de librerías
# Librerías
import speech_recognition as sr # Reconocimiento de voz
import googletrans as go # traducción de texto con google
import spacy as sp # Procesado y etiquetado de palabras
nlp_en = sp.load('en') # Modelo PLN en su version Inglesa
nlp_es = sp.load('es') # Modelo PLN en su version español
print("Librerías cargadas")
Librerías cargadas
2.2 Creación de variables
# Creación de las variables
traduccion = go.Translator() # Constructor para la traducción
r = sr.Recognizer() # Constructor para el reconocimiento de voz
harvard = sr.AudioFile('OSR_us_000_0061_8k.wav') # Carga del archivo de audio
print("Variables Cargadas" , harvard)
Variables Cargadas <speech_recognition.AudioFile object at 0x000002452D4CEB70>
2.3 Extracción y procesado de la información
with harvard as source:
audio = r.record(source) # Reconocimiento de voz
text = r.recognize_google(audio) # Pasando a texto plano
doc_en = nlp_en(text) # Algoritmo NPL
doc_es = traduccion.translate(text,dest='es') # traductor
print("Proceso completo")
Proceso completo
2.4a Resultado
Podemos verificar la extracción y la adaptación de la información para ser analizada más a fondo.
Si queremos verificar que tan bien a sido nuestra extracción del audio podemos comparar desde la lista 30 que se compone de 10 oraciones.
Debajo tendremos 3 columnas indicando la tokenización de cada palabra , seguida del lemma y sus stopword´s.
print("English \n")
print(doc_en,"\n")
English
the mute muffled the high tones of the horn the gold ring fits only a pierced-ear the old pan was covered with hard fudge what's the log float in the wide river the node on the stalk of wheat grew daily the Heap of fallen leaves was set on fire right fast if you want to finish early his shirt was clean but one button was gone the barrel of beer was a brew of malt and hops tin cans are absent from store shelves
print(f"Token \t\tLemma \t\tStopword".format('Token', 'Lemma', 'Stopword'))
print("-"*40)
for token in doc_en:
print(f"{str(token)}\t\t{token.lemma_}\t\t{token.is_stop}")
Token Lemma Stopword
----------------------------------------
the the True
mute mute False
muffled muffle False
the the True
high high False
tones tone False
of of True
the the True
horn horn False
the the True
gold gold False
ring ring False
fits fit False
only only True
a a True
pierced pierce False
- - False
ear ear False
the the True
old old False
pan pan False
was be True
covered cover False
with with True
hard hard False
fudge fudge False
what what True
's be True
the the True
log log False
float float False
in in True
the the True
wide wide False
river river False
the the True
node node False
on on True
the the True
stalk stalk False
of of True
wheat wheat False
grew grow False
daily daily False
the the True
Heap Heap False
of of True
fallen fall False
leaves leave False
was be True
set set False
on on True
fire fire False
right right False
fast fast False
if if True
you -PRON- True
want want False
to to True
finish finish False
early early False
his -PRON- True
shirt shirt False
was be True
clean clean False
but but True
one one True
button button False
was be True
gone go False
the the True
barrel barrel False
of of True
beer beer False
was be True
a a True
brew brew False
of of True
malt malt False
and and True
hops hop False
tin tin False
cans can False
are be True
absent absent False
from from True
store store False
shelves shelf False
2.4b Resultado
Podemos observar el mismo proceso anterior analizando la información en español, sin embargo la traducción en este caso no es muy buena. Si observamos más en detalle el resultado de cada oración dependerá de la presición de la traducción ya que las palabras originales se encuentran en otro idioma. Sin embargo la tokenizacion la lematización y las stopwords son tratadas de la misma forma con un modelo en español.
doc2 = nlp_es(doc_es.text)
print("Español \n")
print(doc_es.text,"\n")
Español
el mudo amortiguado los tonos agudos del cuerno el anillo de oro se ajusta solo a una oreja perforada la sartén vieja estaba cubierta con dulce de azúcar duro lo que es el tronco flotante en el ancho río el nudo en el tallo de trigo crecía a diario el montón de hojas caídas se ponía en llamas rápidamente si quieres terminar temprano su camisa estaba limpia pero un botón no estaba el barril de cerveza era una infusión de malta y las latas de lúpulo están ausentes en los estantes de las tiendas
print(f"Token \t\tLemma \t\tStopword".format('Token', 'Lemma', 'Stopword'))
print("-"*40)
for token in doc2:
print(f"{str(token)}\t\t{token.lemma_}\t\t{token.is_stop}")
Token Lemma Stopword
----------------------------------------
el el True
mudo mudar False
amortiguado amortiguar False
los lo True
tonos tono False
agudos agudo False
del del True
cuerno cuerno False
el el True
anillo anillar False
de de True
oro orar False
se se True
ajusta ajustar False
solo solo True
a a False
una uno True
oreja oreja False
perforada perforar False
la lo True
sartén sartén False
vieja viejo False
estaba estar True
cubierta cubrir False
con con True
dulce dulce False
de de True
azúcar azúcar False
duro durar False
lo el True
que que True
es ser True
el el True
tronco troncar False
flotante flotante False
en en True
el el True
ancho ancho False
río reír False
el el True
nudo nudo False
en en True
el el True
tallo tallar False
de de True
trigo trigo False
crecía crecer False
a a False
diario diario False
el el True
montón montón False
de de True
hojas hoja False
caídas caída False
se se True
ponía poner False
en en True
llamas llamar False
rápidamente rápidamente False
si si True
quieres querer False
terminar terminar False
temprano temprano True
su su True
camisa camisa False
estaba estar True
limpia limpio False
pero pero True
un uno True
botón botón False
no no True
estaba estar True
el el True
barril barril False
de de True
cerveza cerveza False
era ser True
una uno True
infusión infusión False
de de True
malta malta False
y y False
las los True
latas lato False
de de True
lúpulo lúpulo False
están estar True
ausentes ausente False
en en True
los lo True
estantes estante False
de de True
las los True
tiendas tienda False
3.Conclusión
Con pequeñas lineas de código gracias a las librerías anteriores, podemos analizar mucha información y separarlas de acuerdo a nuestro target. La información resultante podría ser de gran utilidad ya que se podría transformar en algo de mucho valor y simplificar u ordenar como base para nuestra investigación o modelo predictivo para futuras decisiones o investigaciones mas profundas.
Este proyecto es solo una introducción a lo que el PLN puede ofrecernos.
4.Recursos
How Speech Recognition Works
Traduciendo texto en python
Open Speech Repository
speech_recognition
Intro to NPL
googletrans
StopWords
spacy