# Procesamiento del habla humana



## asherar (Jun 24, 2012)

_*Compactación y codificación de fonemas*

Ya sea para almacenamiento optimizado, o con vistas a reconocimiento automático. _ _
Un método de compresión del habla se basa en un modelo físico simplificado del tracto 
vocal (desde las "cuerdas vocales" hasta los labios), modelado como una sucesión de 
"tramos de caño" desadaptados en impedancia acústica. 
La desadaptación proviene de las diferentes "secciones" del tracto vocal, y genera 
múltiples reflexiones internas. Resultado de estas reflexiones, a la salida se obtiene un 
único fonema. 
Aquí se puede ver un aparato que realiza ese proceso físicamente, con un tracto vocal 
hecho en silicona y controlado por unas pinzas que le daban la sección a cada tramo. 





_ _

Así, el tracto se puede representar mediante el conjunto de coeficientes que describen _ _
el sistema. Estos son los *coeficientes de predicción lineal o LPC*. 
Los LPC representan las sucesivas desadaptaciones acústicas entre un "tramo de caño" 
los vecinos. 
Para el cálculo de los LPC se suele emplear el *método de Durbin-Watson* basado en la 
autocorrelación _ _de la señal. 
Entonces los fonemas se pueden "codificar" mediante los LPC del tracto vocal (apenas 
14 coeficientes por fonema). Y como a cada fonema le corresponde un único conjunto 
LPC es posible usar este método para almacenar el habla humana en forma compactada. 

Para darse una idea: _ _
Supongamos querer almacenar el fonema "la", de 1 segundo de duración, muestreado 
con un pic a 10.000 muestras por segundo (10 kSps). 
Almacenando todas las muestras digitalizadas se deberían guardar 10.000 datos (10 kB). 
El método LPC permite describir el mismo fonema con solo 14 coeficientes ... 
lográndose una compresión de casi 1000 veces !!! 
Nota: El valor óptimo que surge del análisis de errores es 14. Con mucho menos de 14 
coeficientes se tiene una resolución pobre, con mucho más de 14 el sistema de ecuaciones 
se vuelve inestable. 

Hasta ahí sería una ventaje enorme. _ _
Pero además esto permitiría pensar en identificar fonemas, haciendo el cálculo de los LPC 
a tiempo real, y luego comparando con LPC previamente almacenados en una biblioteca.
_ _Ver También:

*Reconocimiento de palabras usando LPC y DTW para control de robot*

__*El promedio del espectro del habla. Fundamentos y aplicaciones clínicas.

*__*Inteligibilidad del Habla (1)*_  - _*Inteligibilidad del Habla (2)*__*

Reconocimiento del Habla - Estado del avance del tema en el mundo (Estado del arte)

*_


----------



## DJ DRACO (Jun 24, 2012)

Muy buen aporte, estaría bueno tratar de reemplazar mecánicamente el hablar humano


----------



## chclau (Jun 24, 2012)

Muy interesante el aporte!

Lo unico que me parecio un poco limitado en el modelo del robot es el movimiento de la boca.


----------



## asherar (Jun 24, 2012)

chclau dijo:


> Muy interesante el aporte!
> 
> Lo unico que me parecio un poco limitado en el modelo del robot es el movimiento de la boca.



Si, es verdad. Yo prefiero el procesamiento digital con salida por parlante, ... je je !


----------



## fernandob (Jun 24, 2012)

asherar dijo:


> Si, es verdad. Yo prefiero el procesamiento digital con salida por parlante, ... je je !



alejandro te pregunto algo:

en verdad te parece que el procesamiento digital es mucho mas eficiente ??? 
o sea que este estudio que vos colocaste en realidad es digamos un "analisis matematico" de como funciona la voz humana , pero es de matematica compleja por qu eanaliza o describe matematicamente a un proceso natural.

contestame seriamente el tema por que me interesa llegar a algo .
un saludo


----------



## asherar (Jun 24, 2012)

Hay mucha gente que ha trabajado durante mucho tiempo en el tema. 
 Acá hay algunos enlaces donde seguro vas a encontrar algunas respuestas. 

_ *Reconocimiento de palabras usando LPC y DTW para control de robot* 

__*El promedio del espectro del habla. Fundamentos y aplicaciones clínicas.

*__*Inteligibilidad del Habla (1)*_  - _*Inteligibilidad del Habla (2)*__*

Reconocimiento del Habla - Estado del avance del tema en el mundo (Estado del arte)

*_


----------



## torres.electronico (Jun 24, 2012)

terrible aporte  ; Ya habia estado incursionando en la teoria basica de DTW y LPC para aplicarlo a un proyecto con picaxe similar al ejemplo del primer link, pero me quede en la teoria por que no logre un 80% de eficacia a la hora de las pruebas... Osea, la reproduccion de una señal entrante lo logre, lo que no logre pulir fue el reconocimiento de la voz con un 80% de eficacia... Quizas lo retome implementando PicBasic PRO... este tema me inspiro nuevamente


----------



## asherar (Jun 24, 2012)

torres.electronico dijo:


> terrible aporte   ; Ya habia estado incursionando en la teoria basica de DTW y LPC para  aplicarlo a un proyecto con picaxe similar al ejemplo del primer link,  pero me quede en la teoria por que no logre un 80% de eficacia a la hora  de las pruebas... Osea, la reproduccion de una señal entrante lo logre,  lo que no logre pulir fue el reconocimiento de la voz con un 80% de  eficacia... Quizas lo retome implementando PicBasic PRO... este tema me  inspiro nuevamente



Si, la verdad que yo armé algo de esto en el año 1991. 
Empecé ayudándole a un primo para presentar la tesis de ingeniería en electrónica. 
El había hecho toda la búsqueda de bibliografía y yo tenía una placa conversora AD, 
montada en una AT286 !!! 
Le ayudé a digitalizar los fonemas, pero luego seguí solo y llegué a hacerme una "fonoteca" 
que no andaba muy bien que digamos. 

Ahora a mí también me picó el bichito y me voy a poner a ver qué puedo aprovechar de todo 
lo nuevo que ha salido. 
Si te interesa, nos ponemos de acuerdo y encaramos algo. 

Saludos.


----------



## torres.electronico (Jun 24, 2012)

asherar dijo:


> Ahora a mí también me picó el bichito y me voy a poner a ver qué puedo aprovechar de todo lo nuevo que ha salido.
> Si te interesa, nos ponemos de acuerdo y encaramos algo.
> 
> Saludos.



Dale, yo estoy pensando en algo innovador de relativamente pocos recursos para ayudar a la gente con problemas de motricidad... Estaba estudiando de hacer un sistema de silla de ruedas y control remoto de entorno inteligente para personas con problemas motores... Pense al principio que seria mas facil encararlo con una NOTEBOOK ya que tenia medio resuelto el tema de deteccion de ojos para controlar el mouse, sumado al software de reconocimiento de voz de win7....Pero me estoy topando con algunas cuestiones que lo hacen complejo y un tanto obsoleto... 
Quizas esta sea la manera de realizarlo mucho mas facil, ya que con un par de comandos de voz, podria la persona controlar el movimiento de la silla, y quizas, hasta se podria incluir una pequeña seccion de domotica para controlar luces, y otras variables mas.... El 1er salto es la tecnica de reconocimiento de voz... Despues, el resto...osea, la parte de electronica seria relativamente facil; Vos que opinas? gastamos tiempo en algo productivo? lohacemos open source? Yo trabajo PicBasic Pro - Basic Picaxe - Basic KicChip - Asm (este ultimo mas o menos le escapo por que hace mucho que no le doy practica y uno se va poniendo un poco duro, vio? )...
Saludos amigo


----------



## asherar (Jun 24, 2012)

_Yo pensaba más en algo como armar un sistema elemental y de ahí empezar a tratar de ir 
logrando algunos resultados concretos aplicados. 

Por ejemplo optimizar el sistema de captura a tiempo real, cosa que con una pc no es fácil. _ _
Luego agregar una memoria externa, ... un display para mostrar el texto, por ejemplo. 
Experimentar con algunos algoritmos, simples primero, algo más grosos después ... 
Luego, a eso uno le puede ir agregando inteligencia según en qué lo que quiera aplicar. 

Yo diría que primero intentemos reproducir lo que ya está en la web tratando de usar recursos _ _
mínimos, o que sean de disponibilidad asegurada. Por ejemplo no pensar en micros demasiado 
caros o que no se consigan en todas partes. 

Esa parte sí mantenerla open source, como para que cualquiera con conocimientos elementales _ _
pueda empezar a experimentar con una base ya probada y bien económica. 
Si luego la cosa se deriva a algo más específico, bueno, veremos. 
De acuerdo con el esfuerzo que se ha puesto habrá que ver cómo sacarle rédito, pero eso ya 
queda fuera de "forosdeelectronica", porque lo comercial no es el objetivo del foro. 

Con respecto a las herramientas:
Si son rutinas pequeñas prefiero programar en assembler, pero si la aplicación crece más de 
una página de memoria del pic, prefiero el lenguaje C. 
Manejo los displays con cierta comodidad: 128x64 y __128x128 __ pixels GLCD, 16x2 LCD. 
En general me gusta no depender de la pc, salvo para almacenamiento via RS232 o USB, 
o por ahí para graficar algo.

En cuestión de planificación:
A mi entender, cualquier análisis, decisión o plan de tareas debería empezar por aquí:
__*Reconocimiento del Habla - Estado del avance del tema en el mundo (Estado del arte)*

Partir de lo básico sería avanzar con:_ _*- Preprocesado de la señal*
*- Conversión analógico/digital*[/SIZE]_ _   (y almacenamiento de la señal) *- Detección*_ _*del habla*.   
Algo como lo del sistema de captura https://www.forosdeelectronica.com/f24/trasmicion-voz-pic-pcm-55885/#post492261 __que nos trajo hasta aquí.

__ Si de "reconocimiento del habla" se trata, habría que seguir con la optimización de las diferentes etapas que allí se señalan: _ _*- Segmentación*_ _ 
- *Etiquetado de segmentos* 

Para la "_ _identificación del hablante", una aplicación diferente, pero algo relacionada, con sus ventajas y desventajas, se debería seguir __una ruta algo diferente: 
*- Extracción de características 
- Clasificación
- Identificación o autenticación
*
Esto es solamente un borrador como para ir definiendo ideas.

Estamos en contacto._ _

PD1: Hace tiempo hice también un detector de movimientos oculares pensando en una persona _ _
cuadripléjica. Pero eso es otro tema.

PD2: Los que usan linux pueden explorar aquí. 
_


----------



## torres.electronico (Jun 24, 2012)

La seguimos por acá o arrancamos un tema nuevo? pasame tu e-mail asi te mando por correo un proyecto que me compartieron en C... Justamente digitaliza la voz, la guarda en una memoria SD y luego, la reproduce... 
Saludos


----------



## asherar (Jun 24, 2012)

Yo creo que por acá está bien.


----------



## asherar (Jun 27, 2012)

Son muchas las cosas que pueden hacerse con el conjunto de coeficientes 
de predicción lineal o LPC. Una de ellas es representar unívocamente un 
tramo de señal acústica generada por el tracto vocal. 
Acá les subo un poco de la matemática involucrada con el método LPC.


*Teoría de predicción lineal (super-resumida)*

Supongamos tener una sucesión de muestras de sonido: 

{S}, n=1, 2, 3, ...

digitalizadas a intervalos iguales Δt, es decir en los instantes: 

t = n Δt, con n=1, 2, 3, ...

Se puede asegurar que bajo ciertas condiciones la sucesión
puede escribirse mediante la relación: 

S =  G u + a(1) S(n-1) + a(2) S(n-2) + a(3) S(n-3) + ... + a(p) S(n-p) 

con p del orden de 10.

Donde: 

G es un factor de ganancia a especificar.

u es una función generadora de sonido (puede ser sinusoidal).

Es decir que una muestra tomada en el instante t puede escribirse como 
una combinación lineal de las muestras tomadas en instantes anteriores, 
más una señal generadora de amplitud G. 
(Nota del traductor: Esta relación se comprueba a medida que avanzamos en la sucesión 
para cualquier conjunto de p muestras sucesivas, sin importar el instante 
donde se inicia el conjunto.)

En forma compacta: 

S =  G u + Suma(k=1) [ a(k) S(n-k) ]

Un predictor lineal con coeficientes a(k) se define como aquél sistema 
que tiene una salida: 

Z =  Suma(k=1) [ a(k) S(n-k)  ]

El error del predictor se define como: 

E = S - Z

E = G u 

Si denominamos "cercanas a S(m)" a las muestras Sm = S(m+n), 
tiene sentido definir el "error cuadrátrico medio cercano a la muestra S(m)" 
o ECMC, como:

E_m = Suma(m=1:N)[ E_m ]²  (N no es infinito)

Puede demostrarse rigurosamente que existe un conjunto de coeficientes 
a(k) = z(k) que minimizan el error E_m en un entorno de N muestras alrededor 
de S(m). 

Si ahora se define:

Fn(i,k) = Suma(m=1:N) [ Sn(m-i) Sn(m-k) ]

puede escribirse el sistema de ecuaciones para calcular los a(k): 

Suma(k=1) a(k) Fn(i,k) = F(i,0)  para i=1,2,...,p

Entonces este sistema de p ecuaciones y p incógnitas puede resolverse 
eficientemente para obtener los coeficientes a(k) del predictor lineal, 
los que minimizan el error cuadrático ECMC.


*Método de la autocorrelación*

Si uno se asegura que la forma de onda es cero fuera del intervalo 

0 <= m <= N-1 

entonces, el error del predictor de orden p (p coeficientes) será 
no nulo dentro del intervalo: 

0 <= m <= N-1+p 

y nulo fuera del mismo. 
Esto puede lograrse multiplicando las muestras por una función 
ventana (de Hamming) que cumpla esa condición.
En este caso, la función de correlación a tiempos cortos, definida 
como:

Rn(k) = Suma(m=0:N-1-k) [ Sn(m) Sn(m+k) ]

luego de algunas cuidadosas conversiones de índices, puede comprobarse 
que cumple: 

Rn(i-k) = Fn(i,k)   para 1<=i<=p, 0<=k<=p

Con esto, se llega al sistema de ecuaciones: 

Rn(0) a(1) + Rn(1) a(2) + Rn(2) a(3) + ... + Rn(p-1) a(p) = Rn(1)
Rn(1) a(1) + Rn(0) a(2) + Rn(1) a(3) + ... + Rn(p-2) a(p) = Rn(2)
Rn(2) a(1) + Rn(1) a(2) + Rn(0) a(3) + ... + Rn(p-3) a(p) = Rn(3)
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 
Rn(p-1)a(1) + Rn(p-2)a(2) + Rn(p-3)a(3) + ... + Rn(0) a(p) = Rn(p)

que también puede escribirse en forma matricial:

*M* *a* = *r*

donde *M* es la matriz pxp: 

Rn(0)   Rn(1)   Rn(2)  ...  Rn(p-1) 
Rn(1)   Rn(0)   Rn(1)  ...  Rn(p-2) 
Rn(2)   Rn(1)   Rn(0)  ...  Rn(p-3) 
... ... ... ... ... ... ... ... ...
Rn(p-1) Rn(p-2) Rn(p-3) ... Rn(0) 

*a* es el vector de coeficientes {a(k):k=1,p}: 

a(1), a(2), a(3), ... , a(p)   

y *r* es el vector de autocorrelación {R(k):k=1,p}: 

R(1), R(2), R(3), ... , R(p) 


Las propiedades de la matriz *M *(simétrica y de Toeplitz) serán aprovechadas 
para obtener la solución *a* = {a(k)} mediante un algoritmo eficiente. 

Con un procedimiento adicional a partir de razonamientos de conservación 
de la energía, puede determinarse la ganancia G con la relación:

G² = Rn(0) - Suma(k=1) a(k) Rn(k)

que también es igual a E_n.


*Fuente: "Digital Processing of Speech Signals"
Autores: Lawrence R. Rabiner y Ronald W. Schafer
Prentice Hall
1980

*Ver también: http://es.wikipedia.org/wiki/Linear_Predictive_Coding


----------



## asherar (Jun 30, 2012)

Algunos avances en síntesis digital del CANTO aquí. 

Está en inglés, pero se entiende bastante la idea de lo que hacen.







Vocalizando Aprendiendo a Cantar.


----------



## asherar (Jul 2, 2012)

*Más sobre los coeficientes de predicción lineal (LPC*)

Este soft se puede descargar en la pc, sin instalación, se copian el ejecutable 
(que se baja desde acá) y la DLL "glut32.dll" (que se baja desde acá) ambos 
en una misma carpeta. Se ejecuta desde ahí y ya funciona. 
Requiere tener habilitado el micrófono y los parlantes. 

*Funciona más o menos así:*





Cuando uno habla frente al micrófono, el sistema captura el sonido (original), calcula los 
coeficientes del tracto vocal, genera una señal propia (predicted) y la manda a los parlantes. 

También se pueden modificar algunos parámetros del proceso. Para eso, simultáneamente se abre una ventana tipo DOS con información para manejo desde teclado. 



Para que funcione, al tipear las teclas, el "foco" debe estar en la ventana gráfica. 

La pantalla que se abre en Windows es como esta.




En lo más alto de la gráfica se ven ambos oscilogramas: original y predicho. 
Mas o menos en el centro de las gráficas, en color rosa, se muestra una representación del tracto vocal. Con el comando "v" se puede ver en forma de tramos de tubo consecutivos.  

Fuente: http://soundlab.cs.princeton.edu/software/rt_lpc/


----------



## torres.electronico (Jul 9, 2012)

Ale, pero por lo que veo, vos lo estas perfilando mas para el lado de soft que para el lado de los micros... puede ser que te mal interprete?
A fines de esta semana, ya me voy liberando de las pocas obligaciones que me quedan


----------



## asherar (Jul 10, 2012)

Es que el reconocimiento es puro soft. Los micros son el soporte inevitable. 
En unos días ya les mostraré algo de hardware ...


----------



## asherar (Sep 30, 2012)

Está ya todo cocinado ?
Me temo que ya no queda mucho por innovar ni en el hardware ni en el software ...


----------



## asherar (Oct 1, 2012)

Las bibliotecas de reconocimiento del habla (speech) están disponibles para bajar del sitio de android. Y hay toturiales a montones. 

Aprende a Programar Java

Aprende a Programar Para Android


----------



## asherar (Ene 28, 2014)

Hola. Vuelvo sobre este tema porque recientemente tuve oportunidad de presenciar una aplicación interesante.

Se trata de un programa para sordos que se llama "Note Speak & Listen" 
Está implementado en android, y utiliza herramientas de Google como un reconocedor del habla on-line.
El programa tiene dos versiones: una demo que se baja gratis y una versión de pago que vale unos 5 euros. 
Una verdadera bicoca. 
Puede funcionar en una tablet o celular que use android pero, sí o sí, requiere conexión a internet. 
El programa lo que hace es capturar un tramo de señal de audio y enviarla a un servidor de Google, que se 
encarga de hacer la conversión AD y detectar las palabras. 
El servidor remoto devuelve la cadena de texto ya armada y el dispositivo la muestra en la pantalla. 
La tasa de error de palabras es muy baja (según he leído) porque trabaja sobre una base de datos monstruosamente grande, situada en el servidor. 
La aplicación funciona bien, pero todavía tiene varios detalles que resolver para mejorar la usabilidad (a mi criterio). 
.- No sirve para discurso contínuo, ya que se debe accionar cada vez que uno quiere escuchar lo que otro dice. 
.- No sirve para entornos ruidosos o en conversaciones múltiples. Sólo detiene la recepción del sonido y envía a traducir cuando pasa más de 1 segundo de silencio. 
.- No distingue entre varios hablantes. 
.- No funciona off-line.

Para funcionar off-line el volumen de la base de datos estaría limitado por el tamaño de la memoria 
disponible en el dispositivo, y eso podría afectar la tasa de error (WER: word error rate). 
Decididamente es impensable de hacer todo sobre un pic. 
A lo sumo sobre un micro de gama media o alta se puede implementar la etapa de captura y decodificación 
de fonemas. Pero la separación de las palabras la tiene que hacer un sistema bastante más complejo. 
Estos sistemas tienen una etapa de entrenamiento con varios hablantes, se basa en un modelo acústico que depende del idioma, y en un modelo estadístico para identificar las palabras similares según el contexto (las palabras que están más cerca en el discurso). 

Según el autor de un proyecto abierto llamado SIMON (para el idioma inglés): 


> "Los modelos en sí no son de código, sino de datos. Probablemente no publicaré los conjuntos de datos en cualquier lugar, ya que son muy  grandes (varias decenas de GB) a menos que alguien pregunte por  ellos. Pero el modelo producido (que es sólo un poco más de 100 MB) va a  terminar en un lugar público, junto con el resto del material producido  al final de este proyecto.


Fuente: Ver la sección de "comments" AQUÍ


----------

