PsicoexcesosPsicoxInformaticosas

2006-07-14

Texto a voz casi automático, o cómo recitar un libro

Ahora que he hecho el proceso completo al menos una vez, creo estar en condiciones de echar el cuento de cómo producir un audiolibro en GNU/Debian(testing)/Linux. Se supone que disponemos de un libro -o cualquier otro texto- en formato PDF, al final se obtiene un cierto número de archivos mp3 u ogg que pueden escucharse en la computadora o en un tocador portátil de esos formatos.

Los programas requeridos -aparte de las herramientas normales del terminal- son:

Primero, hay que convertir el archivo PDF a texto y el problema puede estar en la codificación del texto. En esta máquina la codificación predeterminada es iso-8859-1 o Latin1. También puede pasar que la conversión no se pueda realizar porque el conversor no “conoce” la codificación. En ese caso, hay que agregar la línea textEncoding Latin1 en el archivo de configuración de xpdf, en debian está en: /etc/xpdf/xpdfrc. Así que hay dos opciones:

Después de probar ambas, me quedo con la última. ps2text hace un mejor trabajo de conversión del texto a Latin1 (de hecho es lo que hace de forma predeterminada), elimina caracteres ocultos y deja el texto más limpio (por ejemplo, convierte los guiones largos en —). Este proceso tarda unos pocos segundos.

Pero el conversor de texto a voz comete actualmente algunos errores intolerables, como no entender los signos ¿ (pronuncia “equis” y deletrea la palabra que sigue). Así que hay que pulir el texto, esto es, corregir la ortografía (los acentos y demás detalles son importantes para la pronuciación correcta) y eliminar los caracteres no pronunciables o que causan esos errores en el robot-lector, en el caso que nos ocupa ¿ ¡ - y similares. Para ello se puede hacer un pequeño libreto (script) con sed, como líneas como esta: sed -i -e 's/¿/ /g' archivo.txt.

Una vez pulido el texto, ya se puede enviar al lector, pero el resultado sería un solo archivo excesivamente largo si se trata de un libro (unas 300 páginas pueden llevar a 200 megabytes de archivo de sonido y eso en un formato comprimido). Así que es preferible ‘picar’ o dividir el texto original en trozos para que sea más sencillo detener al lector y llegar a un punto dado.

Para dividir el archivo ya corregido en pedazos de (por ejemplo) 300 líneas:

split -l 300 -d archivo.txt prefijo.

El ‘prefijo’ es el nombre que tendrán los archivos divididos seguidos de un número secuencial, por lo tanto esa orden crea una serie de archivos con nombre prefijo01, prefijo02, etc. Si text2wave se confunde con los nombres de los archivos, se les puede agregar la extensión .txt de forma automática así: rename 's/\$/.txt/' prefijo\*

Hasta aquí, no se ha producido ningún sonido, aparte del típico repiqueteo del teclado. Ahora hay que ordenarle a text2wave que vaya leyendo cada uno de los archivos

text2wave prefijo04.txt -o archivodesonido04.wav.

Pero, puede pasar -así fue en este caso- que el lector predeterminado no sea el que queremos. Para hacer que la voz elegida por text2wave para leer sea la que realmente se desea hay que modificar -o crear, si no existe- un archivo llamado .festivalrc y colocar esta línea:

(set! voice_default 'voice_el_diphone): la voz “el_diphone” que corresponde a un lector español será la que haga el trabajo; de otro modo muy bien puede suceder que el lector sea un gringo y la lectura será consecuentemente errada. Además, es preferible hacer de una vez la conversión a un formato portátil, sea MP3 u Ogg, de una de estas formas:

Ya que pueden resultar muchos archivos (entre 10 y 100, dependiendo de la longitud que hayamos decidido poner como norma) es mejor hacer un libreto o script, algo como:

cuenta=1 for i in `ls prefijo*` do text2wave $i |\
 lame - prefijo${cuenta}.mp3 cuenta=`expr $cuenta + 1` done ` 

Lo que queda es esperar un rato; según mi cuenta, aproximadamente una décima parte del tiempo de lectura real. Es decir, si la lectura del libro completo dura unas 30 horas, el proceso de conversión de texto a voz tardará unas tres; de hecho algo menos, dependerá de la velocidad de la máquina y demás detalles.



^^^     · Escribe un comentario    · Apoya a PsicoExcesos