Reconocimiento de voz en castellano para Linux 28 Noviembre 2008
Posted by ubanov in Informática-Linux, Robótica.Tags: htk, julian, julius, linux, open, reconocimiento, sphinx, voxforge, voz
trackback
Últimamente he estado metiéndome en el tema del reconocimiento de voz. En esta entrada cuento brevemente las cosas que ido probando. Además describo como configurar reconocimiento de voz para ti mismo en castellano.
Me estoy refiriendo a reconocimiento de voz Open Source sobre Linux.
Por temas de trabajo, he estado haciendo pruebas también con un software comercial de reconocimiento (verbio) y hay que decir que en este caso si hay una gran diferencia entre los programas open y las soluciones cerradas (también la hay en precio)
Si te interesa entrár en más detalles sobre cómo configurar reconocimiento para ti mismo tendrás que seguir leyendo ![]()
Cuando empece a pensar qué iba a tener mi robot, llegué a la conclusión que una de las cosas que quería para él era el reconocimiento de voz. Lo primero que hice fue instalar sphinx2 (en debian se hace de forma muy sencilla con apt-get).
Sphinx me daba reconocimiento en inglés, el siguiente paso fue buscar reconocimiento en castellano, buscando por google lo único que se encuentra es la Web de un profesor mejicano (el Dr. Nolanco) que había preparado la parte de reconocimiento para sphinx3.
Tratando de buscar más información llegué a una web que es http://www.voxforge.org/. Esta es una web que trata de recoger voces con licencia GNU, de cara a que los programas de reconocimiento de voz open puedan disponer de información de voz (WAV con la voz y su correspondiente transcripción). Esta información se puede usar posteriormente para crear un corpus del idioma para el programa.
El Corpus se crea mediante la extracción de datos estadísticos de ficheros con voces, esta información estadística es una representación del sonido de cada fonema que forma cada palabra. Un modelo de Corpus será más exacto contra más información de voces se haya utilizado para crearlo.
Los programas más importantes de cara al reconocimiento de voz, en open source en linux, son CMU Sphinx y Julius.
Los software de reconocimiento de voz suelen estar orientados a dos taréas: dictado (que reconozca cualquier palabra que tenga en un diccionario y la convierta en su texto) y dirigido por una gramática (hay una serie de frases que se pueden decir, lo cual simplifica el proceso de reconocimiento). En el paquete de Julius, el programa julius hace el dictado y julian reconocimiento con gramática.
Las aplicaciones destinadas a reconocer unas pocas palabras pueden ser por ejemplo un software de control del ordenador (en el que el usuario tendría una serie reducida de ordenes que puede decir), o un robot al que se le quiere dar unas pocas ordenes. En este tipo de aplicaciones se define una gramática de las frases que se pueden decir. Para el caso del robot una grámática muy sencilla podría ser: cualquier frase estará formada por la palabra “ir” y una dirección. Una dirección puede ser: derecha, izquierda, adelante o atrás. Con esta gramática el robot sería capaz de reconocer 4 frases: “ir derecha”, “ir izquierda”, “ir adelante” o “ir atrás”. De cara al reconocimiento de voz se simplifica muchísimo el proceso, en el sentido que no es posible que el usuario diga lo que se le antoje, sino que tiene que comparar lo que oiga con un grupo reducido de textos (en este caso sólo 4).
El otro tipo de aplicaciones son las de dictado. En una aplicación de dictado no se define una gramática, dado que el usuario podría decir prácticamente cualquier cosa. Para ayudar a las aplicaciones de dictado lo que se crea es un modelo de lenguaje. El modelo de lenguaje es un fichero más grande, que contiene la probabilidad de que aparezcan ciertas palabras en un determinado orden.
Para crear un corpus multiusuario, y que funcione sin entrenamiento, para una aplicación de reconocimiento orientada a reconocer unas pocas palabras, se estima que se necesitan unas 140 horas de audio. Lo mismo para una aplicación de dictado se necesitan unas 2.000 horas de audio.
El gran problema que tiene el reconocimiento de voz en castellano es que de forma libre no hay, a día de hoy, ni un corpus libre, ni voces suficientes para crearlo.
Entonces si cualquiera de nosotros quisiese hacer algo que requiriese reconocimiento de voz no podríamos hacer nada?
Evidéntemente si. Hay dos cosas que se pueden hacer: una hacer un training de nuestra propia voz (que una vez que lo hagas yo recomendaría que donases tu voz a voxforge), o bien sobre los datos que tiene voxforge añadir tu voz (se haría el training con los datos de voxforge más las grabaciones que hagas… nuevamente: dona de paso tu voz, que servirá para mejorar los software de reconocimiento de voz open).
En mi he usado como software de reconocimiento el Julian (perteneciénte al julius) y para hacer el training el HTK. Yo voy orientar mi reconocimiento hacia julian, sólo quiero que el robot sea capaz de reconocer 10-20 frases. He decidido usar este en lugar del cmu sphinx por que las críticas decían como que julius da mejor calidad en cuanto al acierto al reconocer palabras.
Yo he preparado un proceso para crear training de nuestra propia voz (al principio era la única forma que tenía de tener reconocimiento en castellano que me pillase bien) y luego lo he adaptado para incluir todas las voces que había por voxforge en castellano.
Como he comentado antes, todo lo que yo he preparado ha sido para Julius (donde el training se hace con HTK). Algún día lo adaptaré para sphinx. Antes de empezar a hacer nada deberás instalar Julius y HTK (más información sobre esto en: http://www.voxforge.org/home/dev/acousticmodels/linux/create/htkjulius/how-to/download)
Lo que he preparado está en http://www.dev.voxforge.org/svn/es/Trunk/ (está gestionado por Subversion). Para bajarlo entero puedes hacer “svn checkout http://www.dev.voxforge.org/svn/es/Trunk”, te creará un directorio Trunk con 500MB (la mayoría son las grabaciones de voz de otra gente, pero bajar hoy en día 500MB no creo que sea problema).
Sobre el directorio que te bajas, hay 3 subdirectorios importantes:
- HTK_Scripts: este directorio debe contener los scripts: prompts2wlist, prompts2mlf, maketrihed, mkclscript.prl de HTK (no los puedo redistribuir por la licencia de HTK)
- train: contine toda la información con la voz de las personas que han ido grabando
- auto: contiene los ficheros para poder crear el corpus de forma automática (script_auto) y algunos ficheros de configuración para poder ejecutar luego julius para hacer una prueba (desde este directorio ejecutar “julian -input mic -C julian.jconf”)
Una forma sencilla de grabar las frases es ejecutar el script recordprompts (ejecutar con “./recordprompts texto_train_spanish_3.0.txt train/wav/yourown/”), esto nos pedirá que leamos la friolera de 141 frases (hay que reconocer que es un poco coñazo y se tarda como 20 minutos, además hay algunas frases un poco raritas).
[Publicidad: Si hacemos el proceso subir luego las frases a voxforge. Para ello mirar el documento notestraining.txt]
Una vez grabadas las frases ejecutar los siguiente comando para hacer el training conjunto de tu voz, con las voces de voxforge:
cd auto
cat yourown/codetrain.scp >>codetrain.scp
cat yourown/train.scp >>train.scp
./script_auto
Esto nos creará 3 ficheros con la representación del sonido conteniendo los datos de tu voz: hmm15/hmmdefs, hmm15/macros y tiedlist. Para probarlo ejecutar “julian -input mic -C julian.jconf”. Si te da un error diciendo que no puede abrir /dev/dsp, prueba a ejecutar “modprobe snd_pcm_oss”
El reconomiento que vamos a probar está orientado a una gramática muy sencilla (ver los ficheros auto/sample.grammar y auto/sample.voca). Desde este punto podrás continuar cambiando la gramática y haciendo más pruebas.
Si empiezas a cambiar la gramática y te encuentras que alguna palabra no la puede reconocer julian por que dice que no conoce los trifonemas, se puede grabar nuevas frases conteniendo las palabras que quieres reconocer.
Para ello grabar las nuevas frases, transcribirlas en auto/prompts, ejecutar “cd auto” y “./script_auto 2>&1 | more”, y revisar la salida del comando HDMan -A… (justo al principio después de borrar los temporales). Habrá una frase que dirá “Dictionariy dict created – 823 words processed, 2 missing”, si en lugar de 2 hay más palabras corta el proceso y mira el fichero dlog para ver qué palabras debes incluir en el diccionario de lexicon/voxforge_lexicon_spanish. Por último editar los ficheros auto/codetrain.scp y auto/train.scp para incluír los nuevos ficheros de audio.
Si tienes dudas utiliza el foro de voxforge o deja un comentario en este blog.
con respecto al text to speech, yo he utilizado festival y mbrola. Lo uso para hacer audiolibros y escucharlos en el mp3. La verdad es que festival es un poco “duro” en cuanto a la modulación y entonación. Con mbrola logré algo un poquito mejor. Mbrola tiene restricciones de licencia ya que no puede usarse para fines militares.
Ubanov muchisimas gracias por el recurso. Ha funcionado muy bien…bueno no tanto como me hubiera gustado pero sigo trabajando en ello. Trate de seguir el tutor del htkbook pero es muy complicado para los que apenas estamos iniciando. Tus scripts y los de voxforge han sido muy utiles.
No se como incrementar el exito del reconocedor. Primero lo use con todas la voces que estaban disponibles pero el reconocimiento fue muy pobre, talvez por que soy de latinoamerica y el acento es distinto. Asi que aisle las demas voces y use solo la mia, mejoro un poco. Luego grabe otra tanda con las mias, en total 282 frases mejoro otro poco pero sigue fallando a menudo. No se si deba grabar mas tandas de mi voz, igual querria que fuera independiente del hablante y añadir luego las demas voces. Ha este paso quedara solo util para mi. ¿ Alguna sugerencia?
Reitero mi agradecimiento por compartir tu trabajo.
Hasta luego.
Jonny: la mayoría de las grabaciones que hay para el reconocimiento de voz son de latinoamerica (en concreto de Chile). Lo que se necesita para hacer un reconocimiento de voz independiente del hablante son horas y horas de grabación (se supone que para empezar harían falta 140 horas para hacer programas orientados al reconocimiento de palabras sueltas… y unas 2000 para aplicaciones de dictado).
Yo te pediría una cosa, si has grabado tus voces un par de veces dónalas a voxforge.org, así podrás contribuir de forma sencilla a el software libre de reconocimiento de voz en nuestro idioma común.
Si te grabas más veces aumentará el ratio de acierto… pero casi más importante es estar en un ambierte con poco ruido…
Un saludo.
Hola ubanov.
Ante todo, muchas gracias por el trabajo.
Estoy utilizando el reconocimiento de voz para lanzar comandos en un escritorio gnome.
El porcentaje de acierto es relativamente bajo, por ello decidí grabar mi voz siguiendo tus instrucciones. El problema que se me presenta, es que al reproducir una frase grabada el sonido es pésimo. (distorsionado y entrecortado).
Intuyo que por eso la taza de reconocimiento es tan baja. Lo que necesitaria saber es como configurar el micrófono. Como tendría que configurar la captura de la voz para lograr la mayor fidelidad.
Si grabo las frases con las herramienta de grabacion que trae el escritorio por defecto, las capturas son impecables. pero no si lo hago desde el script en el que tengo que repetir las 140 frases.
He probado cambiando la entrada a oss, alsa, pulse; pero nada… no se qué se me escapa.
Desde ya gracias
Saludos
nahuel: no se porqué te fallará el arecord
lo único que se me ocurre es que grabes aquellas frases que contengan las palabras que quieres reconocer con la herramienta que tengas (audiocity o lo que tengas) y con eso hagas una primera prueba… Por ejemplo graba sólo las frases 43, 72, 83, 118 y 119. Con esto mete en codetrain.scp y train.scp sólo esos números de frases. Ejecuta todo el proceso y prueba a decir números…
Buen comentario ubanov, se nota que has investigado mucho sobre el tema. Yo estoy intentando hacer una aplicacion domotica que actue sobre las luces y para ello necesito que linux reconozca comandos muy sencillos, de una sola palabra o dos, y que una vez detectados estos comandos ejecute un script que mandara los comandos on/off al modulo de las luces.
Buscando por internet he encontrado un programa llamado Perl-Box que segun he leido parece que puede ejecutar aplicaciones con palabras sencillas, como “Music” para abrir el reproductor de musica y demas, pero me da problemas al instalarlo. Tambien he encontrado uno llamado Simon que parece muy bueno por los comentarios pero que tampoco puedo instalarlo (tengo serios problemas con la instalacion en linux).
Tu post me ha interesado mucho pero no se si tanta configuracion es algo excesivo para lo que yo quiero hacer ¿¿tu que crees?? ¿Como harias tu para ejecutar script mediante comandos de voz? Es que ando algo perdido en el tema y me vendrian muy bien tus respuestas.
saludos a todos , he estado mirando tu blog y los comentarios de voxforge, a ver si este fin de semana tengo tiempo y lo miro para echar una mano ,
yo estoy, Sele, con tu mismo tema, tengo un sistema de X10 y ahora ando montando un servicio con python que por ahora es una bbdd , un sistema de reconocimiento de elementos y ordenes en funcion de la entrada y la ejecucion del comando en plan “enciende la luz de la cocina ”
en cuanto lo termine lo subire a algun sitio , pero mi principal problema es la entrada de voz, sphinx4 corre java y me parece matar moscas a canonazos, sphinx3 va bien , pero trabajo en ingles con el y el reconocimiento para un diccionario de unas 40 palabras ya lia la cosa y hace lo que no debe.
Actualmente genero los lm y los diccionarios en ingles y el dmp al vuelo , pero el problema es sphinx3 ,
he modificado el livedecode para que la salida -hyp de las hypotesis salga a un archivo de texto, pero como digo, la calidad es mas que nada baja (y en ingles)
esta noche/ manana , le pego un vistazo a lo que has hecho Ubanov, y si puedo colaborar lo subo ,
me metere un poco mas con julius , pero he leido temas de licencia de htk que no me gustan mucho , en principio yo dejo GPL toda la aplicacion de python
joer, juraria que ayer deje un mensaje y no aparece , es igual
comentaba , mas o menos, que he estado pegandole un vistazo , y sele, los problemas de licencia de HTK no molan mucho, no he probado julius , pero retocando un poco de codigo de sphinx3 puedes hacer lo que dices,
hoy pruebo con el tema de python sobre sphinx , actualmente tengo la aplicacion funcionando con sphinx3 y un decoder modificado que funciona constantemente buscando palabras de un diccionario de no mas de 50 ordenes
mi aplicacion es para la gestion de sistemas de domotica x10 ( o los que sean) y algo mas que saque de la manga con algunos scrips de perl a modo converscion con la maquina al estilo HALL
la aplicacion se conecta a una bbdd para obtener los ficheros de control y el vocabulario y luego genera al vuelo el lenguage
instala pocketsphinx que viene preparado para reconocer comandos y la salida del programa se la enchufas a un script que ejecute estos comandos
ubanov, no he tenido mucho tiempo de pegarle un vistazo a lo que has hecho , pero te lo has currado , a ver si tengo tiempo de colaborar
un saludo y gracias
(teclado ingles)
No quiero reinventar la ruedaaa
Podrias darme mas detalles sobre como lo has hecho? (Si me envias el codigo, mejor)
Un saludo!!
jajaja, ahora aparecen los dos, no se manejar el weblog , lo siento ubanov!!!
Hola!que buen blog Ubanov. Yo tengo un pequeño problema, después de haber grabado y haber hecho el trainning, pongo en la consola :
$ julian -input mic -C julian.jconf
pero esto me da un error de que no me reconoce el comando julian, luego pruebo con julius
$ julius -input mic -C julian.jconf
este parece que si funciona, pero me empiezan a salir un monton de warning como estos:
——
### read waveform input
STAT: AD-in thread created
Warning: strip: sample 0-2563 is invalid, stripped
Warning: strip: sample 1475-1494 is invalid, stripped
Warning: strip: sample 1369-1396 is invalid, stripped
….
Así continuamente… ¿Alguno se le ocurre qué puede ser?¿Y por qué no me reconoce julian?
Tengo instalado julius:
$julius
Julius rev.4.1 – based on
JuliusLib rev.4.1 (fast) built for i686-pc-linux
…
Muchas gracias!!
Como quien dice llegar y usar xDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
https://wiki.ubuntu.com/SpeechRecognition/SpeechMaker
Hablando con Pingüinos ( Reconocimiento y Síntesis de Voz en GNU/Linux )
http://www.glib.org.mx/article.php?story=20050121132445578
*******************
Open Mind Speech es un sistema de reconocimiento del habla construido con Overflow.
*************
http://en.wikipedia.org/wiki/Linux_speech_recognition_software
Hola exodoeviterno:
El link de http://www.glib.org.mx es de enero del 2005… no está muy actualizado.
Sphinx2 de hecho es un programa no soportado hoy en día… y el gran problema que tenemos es el de que no hay suficientes voces para que se pueda hacer reconocimiento de voz en castellano.
Lo que hace falta es que todos donemos nuestras voces a Voxforge para poder tener reconocimiento en nuestro idioma!!!!
Un saludo a todos
Hola Ubanov
La carpeta anonymous1 contiene basura. No son las grabaciones de los prompts sino tramos de canciones.
Me gustaria que me guiaras un poco en el uso de los archivos en la carpeta Audio. Parecen ser grabaciones a diferentes frecuencias de muestreo.
Deberia crear los prompts y añadir estos con los .wav a la carpeta train junto con las demas grabaciones usadas para el entrenamiento?
Por que estan estas grabaciones aisladas?
Gracias por la ayuda
Hola, buenos Dias.
No se de que pais sos. Pero muy bueno el post.
Estoy tratando de hacer algo con reconocimiento de voz.
Mas precisamente un servicio web en java.
Pero estoy teniendo muchas complicaciones con esto ya que no entiendo bien la integracion de tanto programa junto y como usalos desde una app java.
me podrias dar una mano con esto?
Ha, Soy de Argentina.
Pues ya lo siento, pero con eso en concreto no me he pegado
(teclado ingles)
El SVN esta pidiendo contrasena. Podria proporcionarla??
Un saludo
¡Hola!
tk tiene razón, al usar svn pide un usuario y contraseña. ¿Alquien puede proporcionarla? Estoy muy interesado en un reconocedor de voz en castellano para Ubuntu. Muchas gracias.
Al igual que tk y Manu, estoy muy interesado en este post y en el reconocimiento de voz. ¿Podrias poner el usuario y la contraseña para poder descargar el material creado?
El usuario yo no se cual será… cuando yo escribí el artículo no tenía password ni usuario. Os recomendaría que entreis por la web de voxforge y preguntais en los foros?
De todas formas que sepais que el tema de reconocimiento de voz gratis en castellano está muy verde… para que no os hagáis muchas ilusiones….