Langtrainer: Text To Speech-TTS
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 )
- Download/build/install PortAudio v19 stable (061121)
- gunzip/untar it and cd to the portaudio directory
- ./configure --prefix=/usr
fixem-nos que estem dient que el resultat portaudio.h el trobarem a /usr
- make
- sudo make install
- sudo ldconfig
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
- -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]
- -ab 32, indica que el bitrate del archivo de salida será de 32 kbps
- -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