Objavljeno:

Prepoznavanje govora na Raspberry Pi

Eden izmed najbolj znanih in najbolj razvitih sistemov za prepoznavo govora je CMU Sphinx. Gre za skupek orodij za prepoznavanje govora, ki so jih razvili na Carnegie Mellon University, od leta 2000 pa so njihovo programsko kodo odprli jo dali na uporabo skupnosti. Ena izmed komponent je tudi PocketSphinx – gre za orodje, ki je namenjeno poganjanju na tim. namenskih sistemih (zlasti tistih, ki jih poganjajo ARM procesorji). V tokratnem prispevku si bomo pogledali, kako Sphinx namestimo na Raspberry Pi 3.

Predpriprava sistema

Raspberry Pi sicer vsebuje vgrajeno zvočno kartico , vendar samo izhodno, ne zna pa zajemati zvoka (npr. preko mikrofona). Zato moramo na RPi najprej priključiti USB mikrofon. Kupimo ga lahko že za nekaj EUR.

USB mikrofon na Raspberry Pi.

USB mikrofon na Raspberry Pi.

Ko USB mikrofon priključimo, se v sistemu pojavi nova zvočna kartica. Pogledamo jo z ukazom:

cat /proc/asound/cards

Označena je s številko 1:

0 [ALSA ]: bcm2835 - bcm2835 ALSA
bcm2835 ALSA
1 [Device ]: USB-Audio - USB PnP Sound Device
C-Media Electronics Inc. USB PnP Sound Device at usb-3f980000.usb-1.4, full speed

Sedaj na računalnik namestimo ustrezna orodja za prevajanje Sphinxa:

sudo apt-get install bison libasound2-dev swig python-dev mplayer
sudo apt-get install subversion

Prevajanje Sphinxbase

Sphinxbase najprej prenesemo iz SVN skladišča, nato pa ga prevedemo:

cd ~/
cd speech/
svn checkout svn://svn.code.sf.net/p/cmusphinx/code/trunk/sphinxbase
cd sphinxbase/
./autogen.sh
make clean all
make check
sudo make install

Prevajanje PocketSphinx

PocketSphinx najprej prenesemo iz SVN skladišča, nato pa ga prevedemo:

cd ~/
cd speech/
svn checkout svn://svn.code.sf.net/p/cmusphinx/code/trunk/pocketsphinx
cd pocketsphinx/
./autogen.sh
make clean all
make check
sudo make install

Sedaj sta oba programska paketa nameščena. Pregled možnosti si lahko na hitro ogledamo z ukazom:

man pocketsphinx_continuous

Priprava jezikovnih datotek

Sedaj pripravimo jezikovne datoteke. Najprej v navadno tekstovno datoteko napišemo seznam besed, ki jih bo Raspberry Pi prepoznaval. Npr.:

Okay Pi
Open
Garage
Start
Translator
Shutdown
Reboot
Go left
Go right
Stop
Turn around
What is the time
weather
in
is
Ljubljana
Kranj
London
Linux
cool

To datoteko preko spletnega vmesnika naložimo v spletno orodje Sphinx Knowledge Base Tool. Gre za orodje, ki na podlagi seznama besed ustvari ustrezno prilagojen slovar izgovorjave (ang. pronunciation dictionary) ter jezikovni model (ang. language model). To orodje je sicer optimizirano za angleški jezik oziroma ameriški dialekt angleškega jezika.

Mimogrede, Sphinx sicer ni omejen na točno določen jezik (gre za tim. jezikovno agnostičen sistem), je pa potrebno za vsak posamezen jezik uporabiti ustrezen jezikovni model. Iz spleta si je sicer mogoče prenesti nekaj jezikovnih in akustičnih modelov, a slovenščina žal (še?) ni podprta. Si pa lahko jezikovni model zgradimo sami.

Ko orodje zgradi ustrezne datoteke, si jih prenesemo na Raspberry Pi. Prenesemo datoteki .dic in .lm (povezava do datotek čez nekaj časa poteče):

cd ~/speech
wget http://www.speech.cs.cmu.edu/tools/product/1461057180_32726/2956.dic
wget http://www.speech.cs.cmu.edu/tools/product/1461057180_32726/2956.lm

Zagon aplikacije za prepoznavo govora

Sedaj iz imenika speech, kjer se nahajata obe jezikovni datoteki, poženemo PocketSphinx:

pocketsphinx_continuous -adcdev plughw:1 -hmm /usr/local/share/pocketsphinx/model/en-us/en-us -lm 2956.lm -dict 2956.dic -samprate 16000/8000/48000 -inmic yes -logfn /dev/null

Kratka razlaga parametrov:

-adcdev plughw:1

Aplikaciji povemo, naj za zajem zvoka uporabi zvočni vir št. 1 (USB mikrofon, zvočni vir št. 0 je vgrajena zvočna kartica, ki pa kot rečeno nima zvočnega vhoda). Uporabimo tim. “plugin” ALSA napravo, saj osnovna “strojna” ALSA naprava morda ne zna pretvarjati tim. vzorčne hitrosti (ang. sample rate conversion).

-hmm

Jezikovno-akustični model (privzeti je angleško-ameriški)

-lm, -dict

Pot do .lm in .dic jezikovnih in akustičnih datotek.

-inmic yes

Zajem zvoka poteka iz mikrofona (mogoč je tudi zajem iz datoteke)

-logfn /dev/null

Aplikacija ne izpisuje logov (ne izpisuje poteka prepoznave), pač pa samo prepoznane besede. Pri testiranju se splača ta parameter izpustiti.

V praksi prepoznavanje govora na Raspberry Pi izgleda takole:

Kot je videti iz posnetka, se Sphinx občasno zmede in prepoznava ne deluje vedno optimalno. Predvsem ga motijo različni šumi, kar pa je mogoče rešiti z nastavitvijo občutljivosti mikrofona (uporabimo ukaz alsamixer).

Takole pa je videti prepoznava govora brez parametra “-logfn /dev/null“, torej z izpisovanjem poteka prepoznave:

INFO: ngram_search_fwdflat.c(952): 43615 channels searched (157/fr)
INFO: ngram_search_fwdflat.c(954): 3050 words searched (11/fr)
INFO: ngram_search_fwdflat.c(957): 1313 word transitions (4/fr)
INFO: ngram_search_fwdflat.c(960): fwdflat 0.40 CPU 0.144 xRT
INFO: ngram_search_fwdflat.c(963): fwdflat 0.40 wall 0.145 xRT
INFO: ngram_search.c(1253): lattice start node <s>.0 end node </s>.125
INFO: ngram_search.c(1279): Eliminated 1 nodes before end node
INFO: ngram_search.c(1384): Lattice has 381 nodes, 352 links
INFO: ps_lattice.c(1380): Bestpath score: -4061
INFO: ps_lattice.c(1384): Normalizer P(O) = alpha(</s>:125:275) = -313651
INFO: ps_lattice.c(1441): Joint P(O,S) = -331931 P(S|O) = -18280
INFO: ngram_search.c(875): bestpath 0.00 CPU 0.000 xRT
INFO: ngram_search.c(878): bestpath 0.00 wall 0.001 xRT
TURN AROUND

* * *

Kot smo torej videli, je Raspberry Pi dovolj zmogljiv tudi za osnovno prepoznavanje govora To odpira možnosti za izgradnjo kakšnega sistema za glasovno upravljanje. Ob tem ne smemo pozabiti, da Sphinx vsebuje tudi orodja za trening, kar pomeni da lahko prepoznavo govora optimiziramo za konkretnega končnega uporabnika.

Kategorije: Splošno
Ključne besede: