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
Festival (TTS) (gener 2020)
Festcat - Síntesi de la parla en català
- Les veus HTS són més lleugeres però poden sonar una mica més sintètiques.
- Les veus clunits son molt més grans, sonen més naturals, però a vegades tenen errors més greus.
Per exemple, una veu que està molt bé és: (http://festcat.talp.cat/download.php):
- upc_ca_jan_clunits-1.2.tgz
sudo apt-get install festvox-ca-ona-hts
que instal·la directament els paquets superiors festival i festival-ca
$ festival festival> (SayText "¡Hola, mon!") festival> (voice.list) (upc_ca_ona_hts)
la única veu que tinc instal·lada és la catalana, però de fet no sona bé.
- festvox-en1 - mbrola-en1 voice support for festival
per definir la veu que faig servir
festival> (voice_upc_ca_ona_hts) upc_ca_ona_hts festival>(voice.list) (en1_mbrola upc_ca_ona_hts)
però encara no funciona
Instal·lació:
$ festival -b "(if (boundp 'datadir) (print datadir) (print libdir))" "/usr/share/festival"
Aquest és el datadir que s'ha de fer servir.
Tinc descarregada la veu upc_ca_jan_clunits i upc_ca_ona_hts.
Copieu el directori descomprimit upc_ca_ona_hts/ al directori $datadir/voices/catalan:
$ sudo cp -R /home/joan/Baixades/upc_ca_jan_clunits/ /usr/share/festival/voices/catalan echo "Bon dia, Catalunya" | festival --tts --language catalan
Sona la veu de l'Ona, i és que per defecte està seleccionada l'Ona (però tinc dues veus):
festival> (language_catalan) upc_ca_ona_hts
Com elegir entre una veu i l'altra?
http://festcat.talp.cat/usage.php
i ara ja funciona amb la veu que he triat
$ text2wave hola.txt -eval "(voice_upc_ca_jan_clunits) -o hola.wav"
Especificar la veu. Treballar amb diferents veus
Per triar la veu per defecte:
(set! voice_upc_ca_jan_clunits)
El que vull plantejar ara és com llençar diferents comandes en mode batch. I també com treballar amb els accents en català. Provem el mode batch (-b, --batch):
fitxer prova_tts.scm:
(voice_upc_ca_jan_clunits) (SayText "Hola Catalunya") (voice_upc_ca_ona_hts) (SayText "Adéu Catalunya") $ festival -b /home/joan/prova_tts.scm
Funciona, però hi ha un problema amb els accents. Recordar que: El 'Festival' espera codificació ISO-8859-15. Assegureu-vos que utilitzeu aquesta codificació en el vostre terminal o fitxers. Si el vostre sistema utilitza UTF-8 (tal i com ho fan moltes distribucions actuals), necessiteu convertir el fitxer abans de la lectura. Si ho faig així, ara sí que funciona bé.
La solució en mode comanda seria aquesta seria aquesta (mode pipe):
$ echo "(voice_upc_ca_jan_clunits)(SayText \"Adeu Catalunya\")" | festival --pipe $ echo "(voice_upc_ca_ona_hts)(SayText \"Adeu Catalunya\")" | festival --pipe
però en la línia de comandes tenim un problema amb els accents.
En mode fitxer és fàcil convertir a codificació ISO-8859-15:
$ iconv -f UTF-8 -t ISO-8859-15 prova_tts.scm > prova_tts_iso-8859-15.scm
Per tant, tot això ho podem posar en un script bash:
Primer he de generar el fitxer scm amb totes les comandes que vull executar, i després executar un bash on li passo com a argument les comandes a executar i els textos a llegir:
prova_tts.scm (voice_upc_ca_jan_clunits) (SayText "Hola Catalunya") (voice_upc_ca_ona_hts) (SayText "Adéu Catalunya") $ iconv -f UTF-8 -t ISO-8859-15 prova_tts.scm > prova_tts_iso-8859-15.scm $ festival -b /home/joan/prova_tts_iso-8859-15.scm
Festival a la RPi
Funciona igual que en l'ordinador d'escriptori:
sudo apt-get install festival sudo apt-get install festvox-ca-ona-hts
Després d'instal·lar el paquet català ja exiteix la veu de l'Ona:
- /usr/share/festival/voices/catalan/upc_ca_ona_hts
i copio l'altra veu masculina:
al portàtil sudo scp -r /usr/share/festival/voices/catalan/upc_ca_jan_clunits/ pi@192.168.1.60:/home/pi A la RPi: sudo mv /home/pi/upc_ca_jan_clunits/ /usr/share/festival/voices/catalan/
Fer sonar Festival a través de NodeJS (Javascript)
prova.sh
echo "Bon dia, Catalunya" | festival --tts --language catalan
Podem fer sonar Festival:
$ bash prova.sh
(en aquest script bash podem posar moltes més comandes, com es comenta més amunt. Canviar de veus,etc.
La part de Node: script prova.js
var cp = require('child_process'); var ls = cp.spawn('ls', ['-lsa']); ls.stdout.on('data', function(data) { console.log('Message: ' + data); }); ls.on('close', function(code, signal) { console.log('ls finished...'); });
$ node prova.js
I ara el modifiquem per fer sonar el Festival: script prova.js:
#!/usr/bin/env node // echo "Bon dia, Catalunya" | festival --tts --language catalan var cp = require('child_process'); var ls = cp.spawn('bash', ['prova.sh']); ls.stdout.on('data', function(data) { console.log('Message: ' + data); }); ls.on('close', function(code, signal) { console.log('festival finished...'); });
I per a què serveix això? Doncs perquè en el meu Magic Mirror vull fer sonar veus a través del Festival. Vull aprofitar mòduls que ja tingui instal·lats, per afegir-hi veus. I perquè m'agradaria crear un mòdul que es digués HoraCatalana que pugués dir són dos quarts i mig de set.
creat per Joan Quintana Compte, març 2009, gener 2020