Langtrainer: Text To Speech-TTS

De Wikijoan
Dreceres ràpides: navegació, cerca

Les proves s'han fet amb Ubuntu Intrepid (8.10)

Contingut

Primera prova no reeixida

Per utilitzar Text-To-Speech a Ubuntu es pot utilitzar el programa Festival (les veus dels diferents idiomes s'instal.len amb el paquet festbox). El problema és que Festival no funciona amb ESD (the default sound server up to Gutsy), PulseAudio (the default sound server since Hardy) or ALSA, i per tal que funcioni s'han de fer uns canvis. Tot això està explicat a https://help.ubuntu.com/community/TextToSpeech.

Primer de tot instal.lem festival:

$ sudo apt-get install festival
$ sudo apt-get install festvox-kallpc16k


Amb 8.10 (Intrepid) veig que la instal.lació falla, però en canvi ja ve instal.lat per defecte espeak que funciona de meravella

espeak amb català

Al 8.10 ja ve instal.lat el espeak, que funciona a la primera:

$ espeak "hello john"
$ echo "I am very good at this" | espeak -s 100
$ cat hola.txt | espeak

Evidentment, per defecte està pensat per a l'idioma anglès. El problema és que d'entrada no està disponible el català

$ espeak --voices -> llista les veus disponibles $ echo "Soy muy bueno" | espeak -s 100 -v es

[Both (espeak & festival) work for me in 8.04.1]

$ whereis espeak-data
espeak-data: /usr/share/espeak-data

a /usr/share/espeak-data/voices hi ha una llista de totes les veus instal.lades i efectivament no hi és el català. Anem a buscar a Sourceforge la última versió del projecte:

http://espeak.sourceforge.net/

També hi ha un paquet per a Debian: http://packages.debian.org/sid/mips/espeak-data/filelist

$ sudo apt-get install espeak-data

Vaig a mirar les fonts per a Ubuntu Intrepid: espeak_1.39.orig.tar.gz (1.2 MiB) -> no hi ha el català

Vaig a mirar les fonts per a Ubuntu Jaunty (10-2-2009, molt recent!): espeak_1.40.02.orig.tar.gz (1.2 MiB) -> i ara a espeak-data/voices sí que tinc el català!!


Més que instal.lar la nova versió intento substituir el directori on estan totes les veus (espeak-data), i veuré que funciona a mitges...

cd /usr/share
sudo mv espeak-data/ espeak-data.old/
sudo cp -R ~/Escritorio/espeak-1.40.02/espeak-data  /usr/share/espeak-data 
$ echo "Sóc el joan" | espeak -s 100 -v ca
$ espeak -s 120 -v ca -f voc.txt

i funciona, sense una qualitat molt gran.

Ara bé, quan intento exportar a fitxer wav falla (això no falla per a l'anglès)

$ espeak -s 120 -v ca -f voc.txt -w voc.wav
Wrong version of espeak-data 0x14000 (expects 0x13900)

Ho intento restablint els fitxers originals de espeak-data i només copiant els arxius que fan referència al català, però em diu Unknown phoneme table: 'ca'

ara bé, -w voc.wav funciona bé amb el castellà i l'anglès.

És un problema de versions, he d'instal.lar a partir de les fonts la versió última que inclou el català.

$ cd ~/Escritorio/espeak-1.40.02/src

aquí hi ha el Makefile

compilo:

$ make
...
/usr/bin/ld: cannot find -lportaudio

sudo apt-get install lportaudio

He de llegir el ReadMe, important!

$ cp portaudio18.h portaudio.h (per a Debian i Ubuntu)

ara bé, tampoc va.

Compilaré portaudio.h a partir de les fonts. Està explicat a http://live.gnome.org/Orca/Speech (pa_stable_v19_061121.tar.gz )

fixem-nos que estem dient que el resultat portaudio.h el trobarem a /usr

funciona bé i obtinc /usr/include/portaudio.h (fixem-nos en la data). Copio aquest fitxer al espeak

$ cd /usr/include
$ cp portaudio.h /home/joan/Escritorio/espeak-1.40.02/src
$ cd /home/joan/Escritorio/espeak-1.40.02/src

i ara ja puc compilar el espeak:

$ make
$ sudo make install

ara ja funciona bé.

$ echo "Sóc el joan" | ./espeak -s 100 -v ca
$ ./espeak -s 100 -v ca -f /home/joan/voc.txt
$ ./espeak -s 100 -v ca -f /home/joan/voc.txt -w /home/joan/voc.wav

Perfecte, tot i que la qualitat no és molt bona. Això sí, si hi ha temps, s'explica en els tutorials com jo mateix puc construir la veu del català i per tant anar fent proves fins a obtenir un resultat més òptim.

Nota:

Una altra possibilitat més que compilar és baixar-se una versió del programa que ja estigui compilada. Així ho he fet la segona vegada, en el UbuntuServer (Ubuntu 7.10), i m'ha funcionat (tot i que ja havia instal.lat el paquet lportaudio). M'he descarregat el fitxer espeak-1.40.02-linux.zip de Sourceforge (http://sourceforge.net/project/showfiles.php?group_id=159649&package_id=179281), i en fer unzip he vist que ja estava l'executable ./espeak i les veus en català. O sigui que ho provo i en principi va bé. Aquesta versió precisament no té la carpeta src. O sigui, que és l'altra aproximació al problema: descarregar-se directament la versió compilada.

$ cd /usr/share/espeak-1.40.02-linux (és on ho he instal.lat)
$ ./espeak -s 120 -v ca -f /home/joan/hola.txt -w /home/joan/hola.wav

Però no!! veig que sona amb un marcat accent anglès, i és que, encara que està la carpeta ca, si faig

$ espeak --voices

veig que l'idioma Català no surt.

També intento instal.lar un paquet deb de la versió 1.40.02, i no s'instal.la i ja em diu unes pistes. Hi ha un problema de dependpències. Bàsicament tinc libc6 (la libreria bàsica de C) i necessito libc7. Tot aixo ve perque el UbuntuServer és un 7.10. Si tingués un 8.10 com en el portàtil no hagués tingut tants problemes. Més val no entretenir-se més en el tema.

fer sonar el fitxer wav

Ara vull fer sonar el fitxer wav en línia de comandes. Recordo que amb el Ubuntu Studio utilitzava el play. Per a fer servir el programa play:

$ sudo apt-get install sox
$ play /home/joan/voc.wav

Integració amb Langtrainer

llegint el fitxer de vocabulari

Si vull llegir un fitxer paraula per paraula (word_by_word.sh)

#!/bin/bash
for WORD in `cat /home/joan/prova.txt`
do
echo $WORD
done

Si vull llegir un fitxer paraula per paraula (line_by_line.sh)

#!/bin/bash
while read LINE
do
echo $LINE
done < /home/joan/prova.txt
#!/bin/bash
while read LINE
do
echo $LINE | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 100 -v ca
done < /home/joan/prova.txt

El fitxer de vocabulari que llegiré complirà el següent criteri. La línia que comenci per 1: serà una paraula anglesa; la que comenci per 2: serà la traducció catalana; i la que comenci per 3: serà un exemple d'ús de la paraula amb anglès. Per ex:

1:bang
2:cop, porrasso; colpejar, apallissar, maltractar
3:to bang the door
3:How Many chicks is it safe for a bro to say he's banged?
1:to bark 
2:bordar (gos)
1:to bear 
2:portar (una càrrega); sostenir, patir
1:bearable
2:soportable, aguantable

Per detectar el primer caràcter d'una línia:

$ echo "hola:món" | cut -b1

i per detectar les dues paraules separades per dos punts (:):

$ echo "hola:món" | cut -d: -f1
$ echo "hola:món" | cut -d: -f2

fitxer prova.txt:

1:sand
2:sorra, arena
1:table
2:taula
#!/bin/bash
while read LINE
do
if [ $(echo $LINE | cut -d: -f1) -eq 1 ] ; then
        echo "anglès"
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v en
else
        echo "català"
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v ca
fi
done < /home/joan/prova.txt

Concatenar fitxers wav

Aquesta part resulta molt fàcil:

http://www.boutell.com/scripts/catwav.html

echo "hola Joan" | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 100 -v ca -w 1.wav
play 1.wav
echo "adéu Joan" | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 100 -v ca -w 2.wav
play 2.wav

script catwav.sh:

#!/bin/sh
sox $1 -r 44100 -c 2 -s -w /tmp/$$-1.raw
sox $2 -r 44100 -c 2 -s -w /tmp/$$-2.raw
cat /tmp/$$-1.raw /tmp/$$-2.raw > /tmp/$$.raw
sox -r 44100 -c 2 -s -w /tmp/$$.raw $3
rm /tmp/$$*.raw
$ catwav 1.wav 2.wav 3.wav
$ play 3.wav

i funciona sense problemes

el script queda:

#!/bin/bash
rm total.wav
while read LINE
do
if [ $(echo $LINE | cut -d: -f1) -eq 1 ] ; then
        echo "espera" | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v en -a 0 -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav

        echo "anglès"
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v en -a 200 -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav
else
        echo "català"
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v ca -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav
fi
done < /home/joan/prova.txt

fixem-nos com fem una espera per separar les paraules (utilitzem l'opció -a (amplitud)=0)

Convertir wav a mp3

http://guia-ubuntu.org/index.php?title=Ffmpeg

Ffmpeg es un programa sin interfaz gráfica que permite convertir o transformar entre formatos multimedia, tanto de video como de audio. Aunque existen otros programas, algunos sin necesidad de usar comandos, es una de las opciones con más posibilidades y es muy rápida.

la primera prova, que no funciona:

$ ffmpeg -i total.wav -acodec mp3 -ab 32 -ar 44100 total.mp3
  1. -acodec mp3, indica que el codec de audio del archivo resultante será MP3 [esto en realidad se prodría omitir, puesto que la extensión del archivo de salida indica a ffmpeg que el codec es MP3]
  2. -ab 32, indica que el bitrate del archivo de salida será de 32 kbps
  3. -ar 44100, inidica que el archivo de salida tendrá una frecuencia de 44100 Hz [esto en realidad se prodría omitir, puesto que la frecuencia por defecto es 44100 Hz]

ho executo i em dóna:

Unknown encoder 'mp3'

To have mp3 encoding, you need to install the 'libavcodec-unstripped-51' package, and pass '-acodec libmp3lame' instead of '-acodec mp3' in your command line.

$ sudo apt-get install libavcodec-unstripped-51
$ ffmpeg -i total.wav -acodec libmp3lame -ab 32 -ar 44100 total.mp3

ara funciona bé. L'únic problema és que ara play total.mp3 no funciona (unknown file type 'mp3'). Com a player utilitzaré el vlc (que també executa videos):

$ sudo apt-get install vlc

then run it with vlc -I ncurses (That is ahttp://www.google.es/search?hl=es&q=bash+script+if+elif&btnG=Buscar+con+Google&meta= capital i not a lowercase L)

$ vlc total.mp3

i funciona bé

script line_by_line.sh, versió 16-III-2009

#!/bin/bash
rm total.wav
while read LINE
do
if [ $(echo $LINE | cut -d: -f1) -eq 1 ] ; then
        echo "espera" | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v en -a 0 -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav
        echo $LINE
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v en -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav
elif [ $(echo $LINE | cut -d: -f1) -eq 2 ] ; then
        echo $LINE
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v ca -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav
elif [ $(echo $LINE | cut -d: -f1) -eq 3 ] ; then
        echo $LINE
        a=`echo $LINE | cut -d: -f2`
        echo $a | /home/joan/Escritorio/espeak-1.40.02/src/espeak -s 120 -v en -w 1.wav
        /home/joan/catwav total.wav 1.wav total.wav
fi
done < /home/joan/vocabulary_tts_b.txt

Enviar mails des del projecte PHP

La idea és que un cop generat el fitxer mp3, aquest es pugui enviar de forma automàtica com a fitxer adjunt. Necessito el phpMailer i això està explicat a:

Enviar_mail_des_de_PHP:_phpMailer

Llocs web on s'utilitza TTS

http://www.oddcast.com/home/demos/tts/frameset.php?frame1=talk

Nova instal.lació, Ubuntu Jaunty setembre 2009

Em descarregp espeak-1.41.01-linux.zip, descomprimeixo, i executo des de l'executable que està a:

/usr/share/espeak-1.41.01-linux

No s'ha de fer res més, tampoc s'ha de compilar portaudio. Té la funcionalitat del català correcta.

Ara bé, tinc problemes en els scripts line_by_line.sh i catwav.sh que em pensava que ja tenia solucionats. Per exemple, hi ha un problema amb l'opció -w de sox (he tret aquesta opció. Què feia aquesta opció?)

rectificar ./catwav.sh ../wav/total.wav a line_by_line.sh


creat per Joan Quintana Compte, març 2009

Eines de l'usuari
Espais de noms
Variants
Accions
Navegació
IES Jaume Balmes
Màquines recreatives
CNC
Informàtica musical
joanillo.org Planet
Eines