Langtrainer: Text To Speech-TTS

De wikijoan
Salta a la navegació Salta a la cerca

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

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
  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

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