miércoles, 27 de febrero de 2013

Instalando un sintetizador de voz en castellano en Debian/Ubuntu (TTS - Text To Speech)

Me ha surgido la necesidad de un sintetizador de voz en castellano para generar voces con el contenido de un mensaje de alerta en nuestros servidores Ubuntu Server (en proceso de migración a Debian).

He decidido usar "festival", haciendo uso del paquete de voz en castellano "festvox-ellpc11k". El proceso de instalación es muy sencillo:

apt-get install festival festvox-ellpc11k

He visitado bastantes páginas de internet que recomiendan no usar "text2wave" para generar la voz por no poder cambiar de lenguaje (!) por lo que se complican la vida agregando un archivo ".festivalrc" que contiene el siguiente texto:

(Parameter.set 'Audio_Method 'Audio_Command)
(Parameter.set 'Audio_Command "cat $FILE > foo.raw")

Para generar un archivo de sonido necesitamos dos pasos:

  • Generar el archivo RAW:
    iconv -f utf-8 -t iso-8859-1 < archivo.txt | festival --language spanish --tts
  • Convertir el archivo RAW en WAV:
    sox -c 1 -r 11025 -s -2 foo.raw salida.wav

No digo que esté mal hacerlo así, pero tiene el inconveniente de no funcionar de manera correcta si realizamos dos conversiones paralelas. Ambas trabajarán en el archivo foo.raw, perdiéndose una de las dos conversiones de texto a voz.

Finalmente, investigando un poco, he preferido "forzar" la configuración de idioma pasándosela como parámentro a "text2wave" como comando LISP que se evaluará previo a la conversión.

Creando un script (llamado "texto_a_voz.sh", por ejemplo) con el siguiente contenido nos facilitará la tarea enormemente:

#!/bin/bash
/usr/bin/iconv -f utf-8 -t iso-8859-1 | /usr/bin/text2wave -eval "(language_castillian_spanish)"

Bastará con ejecutar la siguiente línea para, a partir de un archivo de texto de entrada en formato UTF-8, generar un archivo WAV de salida:

texto_a_voz.sh < archivo.txt > salida.wav

Si deseáramos pasar el archivo a MP3, por ejemplo, bastaría con agregar a la cadena "lame", con la opción "-S" si no queremos mensajes (modo silencioso), a la línea del comando:

texto_a_voz.sh < archivo.txt | lame -S - salida.mp3

Espero que os sea de utilidad.

10 comentarios:

  1. Parece bueno, lástima que no hayan comentarios

    ResponderEliminar
    Respuestas
    1. Mi culpa. Olvidé suscribirme por correo al blog y he terminado por abandonarlo por falta de actividad. Voy a intentar darle un impulso publicando más trucos de linux, diseño web, aplicaciones de software libre, etc. ¡Gracias por el comentario! :)

      Eliminar
  2. Esta bueno tu mini tutorial, pronto te hare unas preguntas en cuanto a festival y configuraciones, espero me puedas apoyar un poco saludos.

    ResponderEliminar
    Respuestas
    1. ¡Por supuesto! Será un placer :) yo hice este minitutorial debido a que necesitaba generar mensajes de voz en el lado del servidor usando PHP para reproducirlos en el lado del cliente usando HTML5. Ya no usamos esa web, pero sería una buena idea publicar el código :)

      Eliminar
  3. echo "Muchas Gracias" | text2wave -eval "(language_castillian_spanish)" -o gracias.wav

    ResponderEliminar
  4. ta bueno pero la voz no podia ser mas roboticia :-( no hay forma de tener una voz mas pasable ??

    ResponderEliminar
    Respuestas
    1. Hay otras soluciones como pico2wave (http://manpages.ubuntu.com/manpages/precise/man1/pico2wave.1.html)... todo depende del paquete de sonido. No las he probado todas, pero probablemente haya alguna que suene mejor.

      Eliminar
  5. Es una lastima que los motores de texto a voz casi no han evolucionado en Linux, para crear audio-libros aun se depende de Windows

    ResponderEliminar
    Respuestas
    1. Hay otros paquetes de TTS (texto a voz, text to speech) como pico2wave (http://manpages.ubuntu.com/manpages/precise/man1/pico2wave.1.html), pero no los he probado. Ahora se tiende a que muchas cosas se hagan "en la nube", así que servicios como Google TTS (google translate) se usan con mucha frecuencia y tienen una calidad bastante aceptable (suena exactamente igual que el TTS de android).

      Eliminar