CMU Sphinx

De Wikijoan
Dreceres ràpides: navegació, cerca

Tota la documentació de CMU Sphinx està a la wiki:

Descarrega:

Per descarregar-ho del SVN:

Primer de tot descarrego i instal.lo sphinxbase.

renombro la carpeta de sphinxbase.0.7 a sphinxbase

$  sudo apt-get install bison
$ ./configure
$ make
$ sudo make install
$ export PATH=/usr/local/bin:$PATH
$ export LD_LIBRARY_PATH=/usr/local/lib
$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

i ara instal.lo pocketsphinx-0.7:

$ ./configure
$ make
$ sudo make install

Per veure que ho tinc ben instal.lat:

$ pocketsphinx_continuous
$ man pocketsphinx_continuous

POCKETSPHINX_CONTINUOUS(1)                          POCKETSPHINX_CONTINUOUS(1)

NAME
       pocketsphinx_continuous  - Run speech recognition in continuous listen‐
       ing mode

SYNOPSIS
       pocketsphinx_continuous -hmm hmmdir -dict dictfile [ options ]...

DESCRIPTION
       This program opens the audio device and  waits  for  speech.   When  it
       detects an utterance, it performs speech recognition on it.

Les llibreries les tinc ben instal.lades:

# pkg-config --cflags --libs sphinxbase pocketsphinx

-I/usr/local/include -I/usr/local/include/sphinxbase -I/usr/local/include/pocketsphinx  -L/usr/local/lib -lpocketsphinx -lsphinxbase -lsphinxad 

i puc parlar pel micròfon i em reconeix les paraules. Ja puc fer uns quants reconeixements de paraules, evidentment en anglès.

Per trobar models de llenguatges per altres idiomes:

Em descarrego voxforge-es-0.1.1.tar.gz. No hi ha res de català, però també podria mirar al SVN del CMU Sphinx (doncs no, no hi ha res). D'entrada el fitxer build.sh no funciona, i és que hi ha línies comentades que són importants. D'entrada t'has de descarregar tots els wav.

nota: també instal.lo cmuclmt

Què és VoxForge?

VoxForge: Un programa speech corpus libre, una base de datos de archivos de habla, es utilizado en programas como Julius, Sphinx entre otros.

Per tant, el model de voxforge de castellà que m'estic descarregant val tant per a CMU Sphinx com per a Julius, i és independent.


el més important de tot és llegir-se el tutorial:

Jo de moment he escollit començar amb pocketsphinx, però es poden fer aplicacions tant amb pocketsphinx com amb sphinx4: (http://cmusphinx.sourceforge.net/wiki/tutorialbeforestart)

    *Need speed or portability → use pocketsphinx
    *Need flexibility and managability → use sphinx4

però com es comenta, la decisió entre escollir un o l'altre no és un factor que tingui a veure amb la capacitat d'encertar el reconeixement (accuracy). sphinx4 és JAVA, i permet més flexibilitat d'integració amb altres eines.

Començant a programar


La documentació de l'API està disponible a:


hello_ps.c:

#include <pocketsphinx.h>

int
main(int argc, char *argv[])
{
        ps_decoder_t *ps;
        cmd_ln_t *config;

        config = cmd_ln_init(NULL, ps_args(), TRUE,
                             "-hmm", MODELDIR "/hmm/en_US/hub4wsj_sc_8k/",
                             "-lm", MODELDIR "/lm/en/turtle.DMP",
                             "-dict", MODELDIR "/lm/en/turtle.dic",
                             NULL);
        if (config == NULL)
                return 1;

        ps = ps_init(config);
        if (ps == NULL)
                return 1;

        return 0;
}
$ gcc -o hello_ps hello_ps.c -DMODELDIR=\"`pkg-config --variable=modeldir pocketsphinx`\" `pkg-config --cflags --libs pocketsphinx sphinxbase`

Els models estan a:

# pkg-config --variable=modeldir pocketsphinx
/usr/local/share/pocketsphinx/model

i aquí és on hi ha les carpetes hmm/ i lm/

# ls /usr/local/share/pocketsphinx/model/hmm/en_US/hub4wsj_sc_8k
feat.params  mdef  means  noisedict  sendump  transition_matrices  variances

# ls /usr/local/share/pocketsphinx/model/lm/en/turtle.DMP
# ls /usr/local/share/pocketsphinx/model/lm/en/turtle.dic

hello_ps_2.c. En aquest segon exemple li passo un fitxer d'audio, el processa i mostra el resultat. (If you want to create your own version of it, it needs to be a single-channel (monaural), little-endian, unheadered 16-bit signed PCM audio file sampled at 16000 Hz)

/* $ gcc -o hello_ps_2 hello_ps_2.c -DMODELDIR=\"`pkg-config --variable=modeldir pocketsphinx`\" `pkg-config --cflags --libs pocketsphinx sphinxbase` */
#include <pocketsphinx.h>

int
main(int argc, char *argv[])
{
        ps_decoder_t *ps;
        cmd_ln_t *config;

        char const *hyp, *uttid;
        int rv;
        int32 score;

        config = cmd_ln_init(NULL, ps_args(), TRUE,
                             "-hmm", MODELDIR "/hmm/en_US/hub4wsj_sc_8k/",
                             "-lm", MODELDIR "/lm/en/turtle.DMP",
                             "-dict", MODELDIR "/lm/en/turtle.dic",
                             NULL);
        if (config == NULL)
                return 1;

        ps = ps_init(config);
        if (ps == NULL)
                return 1;

        FILE *fh;

        fh = fopen("goforward.raw", "rb");
        if (fh == NULL) {
                perror("Failed to open goforward.raw");
                return 1;
        }

        rv = ps_decode_raw(ps, fh, "goforward", -1);
        if (rv < 0)
                return 1;

        hyp = ps_get_hyp(ps, &score, &uttid);
        if (hyp == NULL)
                return 1;
        printf("Recognized: %s\n", hyp);

        return 0;
}
$ gcc -o hello_ps_2 hello_ps_2.c -DMODELDIR=\"`pkg-config --variable=modeldir pocketsphinx`\" `pkg-config --cflags --libs pocketsphinx sphinxbase`
...
Recognized: go forward ten meters

Acoustic Model Tutorials. Building Language Model

Hi ha dues aproximacions:

és a dir, la forma més general és utilitzar tota la base de dades de gent que ha penjat mostres a voxforge. Com més contribucions hi hagi el model serà més vàlid. I el problema és que no hi ha res en català. I si només una persona comença a fer-ho no serveix de massa, doncs la gràcia del sistema és que hi hagi molta gent contribuïnt.

És més ràpid i més fàcil la primera aproximació: jo em faig els fitxers d'audio, però aleshores el model acústic només em val a mi.

If you have installed PocketSphinx, you will have a program called pocketsphinx_continuous which can be run from the command-line to recognize speech. Assuming it is installed under /usr/local, and your language model and dictionary are called 8521.dic and 8521.lm, try running the following command:

pocketsphinx_continuous -lm 8521.lm -dict 8521.dic

M'he descarregat voxforge en espanyol i de fet dins la carpeta voxforge-es-0.1.1/etc tinc els fitxers voxforge_es_sphinx.dic i voxforge_es_sphinx.transcription.test.lm (entre d'altres). Per tant, faig una prova:

$ pocketsphinx_continuous -lm ~/Baixades/voxforge-es-0.1.1/etc/voxforge_es_sphinx.transcription.test.lm -dict ~/Baixades/voxforge-es-0.1.1/etc/voxforge_es_sphinx.dic

(no funciona, falten els fonemes en el model acústic, o alguna cosa així)


Mirar:

No n'hi ha prou amb fer el diccionari (.dic) i el model de llenguatge (.lm), sinó que hem de fer el model acústic:

i el tutorial definitiu per fer un model acústic i un diccionari d'un vocabulari específic seria:

model de llenguatge per a joanlm (1a prova) i Pixtuff (2a prova)

Segueixo el següent tutorial:

important!. quan edito els fitxers, no deixar al final línies en blanc. Si no, dóna problemes al moment de compilar.

Els fonemes els podem trobar a (phoneme set, és un estàndard per al reconeixement de veu, són 39 fonemes):

        Phoneme Example Translation
        ------- ------- -----------
        AA	odd     AA D
        AE	at	AE T
        AH	hut	HH AH T
        AO	ought	AO T
        AW	cow	K AW
        AY	hide	HH AY D
        B 	be	B IY
        CH	cheese	CH IY Z
        D 	dee	D IY
        DH	thee	DH IY
        EH	Ed	EH D
        ER	hurt	HH ER T
        EY	ate	EY T
        F 	fee	F IY
        G 	green	G R IY N
        HH	he	HH IY
        IH	it	IH T
        IY	eat	IY T
        JH	gee	JH IY
        K 	key	K IY
        L 	lee	L IY
        M 	me	M IY
        N 	knee	N IY
        NG	ping	P IH NG
        OW	oat	OW T
        OY	toy	T OY
        P 	pee	P IY
        R 	read	R IY D
        S 	sea	S IY
        SH	she	SH IY
        T 	tea	T IY
        TH	theta	TH EY T AH
        UH	hood	HH UH D
        UW	two	T UW
        V 	vee	V IY
        W 	we	W IY
        Y 	yield	Y IY L D
        Z 	zee	Z IY
        ZH	seizure	S IY ZH ER

Dubte: Què faig amb els fonemes especials catalans (o castellans) que no s'adapten a la col.lecció dels 39 fonemes. Per ex: r (cara), ny (canya), rr (carro). Doncs només cal mirar com ho resol el diccionari voxforge_es_sphinx.phone:

...
GN
LL
RR
...

Per tant, no ens hem de limitar als 39 fonemes, sinó que en puc ficar de nous.

Per gravar les mostres d'àudio:

$ arecord -r 16000 -f S16_LE -t wav -D plughw:UA25EX prova_1.wav 
Recording WAVE 'prova_1.wav' : Signed 16 bit Little Endian, Rate 16000 Hz, Mono

$ aplay -D plughw:UA25EX prova_1.wav

que són les característiques que han de tenir les mostres d'àudio

Tenia instal.lat sphinxbase i pocketsphinx. Ara instal.lo sphinxtrain-1.0.7 (./configure i make, com a root)

# ../sphinxtrain-1.0.7/scripts_pl/setup_SphinxTrain.pl -task joanlm
...
Set up for acoustic training for joanlm complete

# ../pocketsphinx-0.7/scripts/setup_sphinx.pl -task joanlm
...
Generating pocketsphinx specific scripts and config file
Set up for decoding joanlm using PocketSphinx complete

error en processar RunAll.pl:

    Phase 3: CTL - Check general format; utterance length (must be positive); files exist
WARNING: CTL file, /home/joan/Baixades/joanlm/feat/joan/file_1.mfc, does not exist, or is empty

i en la documentació:

WARNING: CTL file, audio file name.mfc, does not exist, or is empty.

The .mfc files are the feature files converted from the input audio files in make_feats.pl. Did you skip this step? Did you add new audio files without converting them? The script expects a feature file to be there, and it isn't.

però la guia que segueixo no diu res de tot això.

# perl scripts_pl/make_feats.pl -ctl etc/joanlm_train.fileids 
cfg not specified, using the default ./etc/sphinx_train.cfg
-param not specified, using the default ./etc/feat.params
For semi continuous models, the initial and final models have the same density at ./etc/sphinx_train.cfg line 123, <PARAM> line 14.
Compilation failed in require at scripts_pl/make_feats.pl line 125, <PARAM> line 14.

Dóna un problema perquè en el fitxer sphinx_train.cfg

  $CFG_INITIAL_NUM_DENSITIES = 8;  
  $CFG_FINAL_NUM_DENSITIES = 8;

han de tenir el mateix valor (havia modificat un i no l'altre)

Ara ja puc fer el # ./scripts_pl/RunAll.pl, i funciona correctament amb alguns warnings (he de mirar el log, directori logdir). No s'ha de continuar fins haver resisat els logs.

I ara ja puc fer el decode per mirar la qualitat del test:

# ./scripts_pl/decode/slave.pl 
MODULE: DECODE Decoding using models previously trained
        Decoding 4 segments starting at 0 (part 1 of 1) 
        0% 
This step had 4 ERROR messages and 0 WARNING messages.  Please check the log file for details.
        Aligning results to find error rate
Can't open /home/joan/Baixades/joanlm/result/joanlm-1-1.match
word_align.pl failed with error code 65280 at ./scripts_pl/decode/slave.pl line 173.

hi ha errors, necessita revisió. I els 4 errors que hi ha en el log són que no s'ha generat el fitxer DMP:

ERROR: "ngram_model_arpa.c", line 466: File /home/joan/Baixades/joanlm/etc/joanlm.lm.DMP not found
ERROR: "ngram_model_dmp.c", line 106: Dump file /home/joan/Baixades/joanlm/etc/joanlm.lm.DMP not found
ERROR: "ngram_search.c", line 208: Failed to read language model file: /home/joan/Baixades/joanlm/etc/joanlm.lm.DMP
FATAL_ERROR: "batch.c", line 819: PocketSphinx decoder init failed

Després del training, s'ha creat la carpeta model_parameters.


I ara ja puc utilitzar el model: (no sé si ben bé es crida així)

# pocketsphinx_continuous -hmm ~/Baixades/joanlm -lm joanlm -dict ~/Baixades/joanlm/etc/joanlm.dic 

una crida correcta seria:

$ pocketsphinx_continuous -verbose yes -hmmusr/local/share/pocketsphinx/model/hmm/wsj1 -lm 3400.lm -dict 3400.dic

Ara ja funciona (ajuntar i polir)

Notes:
també instal.lo cmucltk, doncs conté les utilitats que són necessàries (text2idngram, idngram2lm, sphinx_lm_convert) per a construir el model de llenguatge: 

A part del acoustic model, previ he de fer el language model, no?

és important mirar el fitxer joanlm.html doncs dóna molta informació de com ha anat el procés

$ cd etc/

Generem el fitxer de vocabulari:
text2wfreq < weather.txt | wfreq2vocab > weather.tmp.vocab
$ text2wfreq < joanlm_test.transcription | wfreq2vocab > joanlm.vocab

$ text2idngram -vocab weather.vocab -idngram weather.idngram < weather.closed.txt
$ text2idngram -vocab joanlm.vocab -idngram joanlm.idngram < joanlm_test.transcription
...
text2idngram : Done.

No confondre vocabulari amb el diccionari (diccionari de pronunciació). Ara estic fent el vocabulari (.vocab, Bulding the language model). Més tard faré el diccionari (.dic, Building the acoustic model, és on hi ha els fonemes)

$ idngram2lm -vocab_type 0 -idngram weather.idngram -vocab weather.vocab -arpa weather.arpa
$ idngram2lm -vocab_type 0 -idngram joanlm.idngram -vocab joanlm.vocab -arpa joanlm.arpa

$ sphinx_lm_convert -i weather.arpa -o weather.lm.DMP
$ sphinx_lm_convert -i joanlm.arpa -o joanlm.lm.DMP

També genero el fitxer amb extensió lm:

ARPA format and DMP format are mutually convertable. You can produce other file with sphinx_lm_convert command from sphinxbase:

sphinx_lm_convert -i model.lm -o model.dmp
sphinx_lm_convert -i model.dmp -ifmt dmp -o model.lm -ofmt arpa

$ sphinx_lm_convert -i joanlm.lm.DMP -ifmt dmp -o joanlm.lm -ofmt arpa

i ara que ja tinc el CMU binary form (DMP) ja puc continuar en el punt on em fallava (millor començar de 0...)
------------------------------------------

# ./scripts_pl/decode/slave.pl 
MODULE: DECODE Decoding using models previously trained
        Decoding 4 segments starting at 0 (part 1 of 1) 
        0% 
        Aligning results to find error rate
        SENTENCE ERROR: 25.0% (1/4)   WORD ERROR RATE: 2.4% (0/42)

Using the model
---------------
$ pocketsphinx_continuous -hmm ~/Baixades/joanlm/model_parameters/joanlm.cd_semi_1000 -lm ~/Baixades/joanlm/etc/joanlm.lm -dict ~/Baixades/joanlm/etc/joanlm.dic 

però el resultat és francament dolent. A partir d'aquí es pot millorar: gravar molt més temps de mostres, i tocar paràmetres. L'objectiu és que davant d'un vocabulari tan petit el nivell d'encert sigui molt gran.

si no vull utilitzar totes les rutes, he de copiar el meu model en el directori per defecte:

$ cp ~/Baixades/joanlm/etc/joanlm.dic /usr/local/share/pocketsphinx/model/lm/joanlm.dic
$ cp ~/Baixades/joanlm/etc/joanlm.lm /usr/local/share/pocketsphinx/model/lm/joanlm.lm
$ cp ~/Baixades/joanlm/etc/joanlm.lm.DMP /usr/local/share/pocketsphinx/model/lm/joanlm.lm.DMP
$ cp -R ~/Baixades/joanlm/model_parameters/joanlm.cd_semi_1000 /usr/local/share/pocketsphinx/model/hmm/joanlm

$ pocketsphinx_continuous -hmm joanlm -lm joanlm.lm -dict joanlm.dic 
o bé
$ pocketsphinx_continuous -hmm joanlm -lm joanlm.lm.DMP -dict joanlm.dic (no encerta res...)

creat per Joan Quintana Compte, novembre 2011

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