Elaborazione vocale sul Raspberry Pi


43

Voglio eseguire l'elaborazione del parlato su Raspberry Pi per rilevare persone specifiche (qualcosa come l'identificazione univoca).

Preferirei utilizzare solo il processore di bordo per questo, si potrebbe presumere che Internet non sia accessibile.

Inoltre, quali sono i limiti con Raspberry Pi che esegue l'elaborazione vocale? Se voglio usarlo come una macchina automatica di presenza, come devo procedere?


4
Di che tipo di "elaborazione vocale" stai parlando: riconoscimento dei campioni vocali preregistrati (quindi puoi usare un qualche tipo di indice di somiglianza tra file vocale originale, preregistrato e di prova) o riconoscimento vocale "reale" (può essere pesantemente CPU intensiva in tempo reale, specialmente per alcune lingue e buon tasso di riconoscimento)?
TomiL

Risposte:


61

Questo è il progetto principale a cui il mio Raspberry Pi è dedicato in questo momento, quindi immagino di poter aggiungere i miei due centesimi. Tieni presente che questo progetto è ancora in fase di sviluppo.

Ho scelto di usare il linguaggio di programmazione C per questo progetto esclusivamente sul sistema operativo Raspbian e ciò potrebbe aver influenzato alcune delle mie decisioni e istruzioni. Elencherò solo software gratuito e open source , poiché è tutto ciò che uso.

Per le istruzioni di installazione, assumerò che tu abbia un sistema completamente aggiornato .


Riconoscimento vocale

Ecco alcune opzioni per i motori di riconoscimento vocale :

  1. Pocketsphinx - Una versione di Sphinx che può essere utilizzata in sistemi embedded (ad esempio, basata su un processore ARM).

    • Pro : In fase di sviluppo attivo e incorpora funzionalità come l'aritmetica a virgola fissa e algoritmi efficienti per il calcolo GMM . Tutta l'elaborazione avviene su Raspberry Pi, quindi può essere utilizzata offline. Supporta il riconoscimento vocale in tempo reale

    • Contro : è complicato da configurare e comprendere per i principianti. Per me, era troppo impreciso per la mia applicazione. Tutta l'elaborazione avviene sul Raspberry Pi, rendendolo un po 'più lento.

    • Istruzioni di installazione :

      1. Scarica le ultime versioni stabili di Sphinxbase e Pocketsphinx :

        $ wget http://sourceforge.net/projects/cmusphinx/files/sphinxbase/0.8/sphinxbase-0.8.tar.gz
        $ wget http://sourceforge.net/projects/cmusphinx/files/pocketsphinx/0.8/pocketsphinx-0.8.tar.gz
        
      2. Estrai i file scaricati:

        $ tar -zxvf pocketsphinx-0.8.tar.gz; rm -rf pocketsphinx-0.8.tar.gz
        $ tar -zxvf sphinxbase-0.8.tar.gz; rm -rf sphinxbase-0.8.tar.gz
        
      3. Per compilare questi pacchetti, è necessario installare le intestazioni di sviluppo bison e ALSA.

        NOTA : è importante che le intestazioni ALSA siano installate prima di creare Sphinxbase. Altrimenti, Sphinxbase non utilizzerà ALSA. Sembra anche che ALSA non verrà utilizzato se è installato PulseAudio (una cosa negativa per gli sviluppatori come me).

        $ sudo apt-get install bison libasound2-dev
        
      4. cd nella directory Sphinxbase e digitare i comandi seguenti:

        $ ./configure --enable-fixed
        $ sudo make
        $ sudo make install
        
      5. cd nella directory di Pocketsphinx e digitare i comandi seguenti:

        $ ./configure
        $ sudo make
        $ sudo make install
        
      6. Prova Pocketsphinx eseguendo:

        $ src/programs/pocketsphinx_continuous -samprate 48000 
        

        Se vuoi modificarlo, ti consiglio di leggere alcune informazioni sul CMUSphinx Wiki .

  2. libsprec - Una libreria di riconoscimento vocale sviluppata da H2CO3 (con pochi contributi da parte mia, principalmente correzioni di bug).

    • Pro : utilizza l' API di Google Speech , rendendola più accurata. Il codice è più facile da capire (secondo me).

    • Contro : ha dipendenze da altre librerie sviluppate da H2CO3 (come libjsonz ). Lo sviluppo è imprevedibile. Utilizza l'API di Google Speech, il che significa che l'elaborazione non ha luogo sul Raspberry Pi stesso e richiede una connessione a Internet. Richiede una piccola modifica al codice sorgente prima della compilazione per funzionare correttamente su Raspberry Pi.

    • Istruzioni di installazione :

      1. Installa libflac , libogg e libcurl :

        $ sudo apt-get install libcurl4-openssl-dev libogg-dev libflac-dev
        
      2. Scarica la versione più recente di libsprec

        $ wget https://github.com/H2CO3/libsprec/archive/master.zip
        
      3. Decomprimi il pacchetto scaricato:

        $ unzip master.zip; rm -rf master.zip
        

        Ora dovresti avere una cartella denominata libsprec-masternella tua directory corrente.

      4. Scarica la versione più recente di libjsonz :

        $ wget https://github.com/H2CO3/libjsonz/archive/master.zip
        
      5. Decomprimi il pacchetto scaricato:

        $ unzip master.zip; rm -rf master.zip
        

        Ora dovresti avere una cartella denominata libjsonz-masternella tua directory corrente.

      6. cdnella libjsonz-masterdirectory, compilare e installare:

        $ cd libjsonz-master
        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      7. cdfuori dalla libjsonz-masterdirectory e nella libsprec-master/srcdirectory. Modifica riga 227:

        $ err = snd_pcm_open(&handle, "pulse", SND_PCM_STREAM_CAPTURE, 0);
        

        Abbiamo bisogno di questo per dire:

        $ err = snd_pcm_open(&handle, "plughw:1,0", SND_PCM_STREAM_CAPTURE, 0);
        

        Questo è così che il programma utilizzerà ALSA per puntare al microfono USB.

      8. Compila e installa:

        $ mv Makefile.linux Makefile
        $ make
        $ sudo make install
        
      9. Ora puoi utilizzare la libreria nelle tue applicazioni. Cerca nella cartella libsprec-masterdegli esempi per esempi.

  3. Julius - Unsoftware di decodifica LVCSR (vocabolario continuo a riconoscimento vocale di grandi dimensioni a due passaggi ad alte prestazioni) per ricercatori e sviluppatori collegati al linguaggio.

    • Pro : Può eseguire il riconoscimento vocale quasi in tempo reale sul Raspberry Pi stesso. I formati di modello vocale standard sono adottati per far fronte ad altri toolkit di modellazione gratuiti.

    • Contro : sviluppo spotty, con il suo ultimo aggiornamento più di un anno fa. Il suo riconoscimento è anche troppo impreciso e lento per il mio utilizzo. Lungo tempo di installazione

    • Istruzioni di installazione :

      1. Ci sono alcuni pacchetti che dobbiamo installare per far funzionare correttamente il sistema:

        $ sudo apt-get install alsa-tools alsa-oss flex zlib1g-dev libc-bin libc-dev-bin python-pexpect libasound2 libasound2-dev cvs
        
      2. Scarica Julius dall'origine CVS:

        $ cvs -z3 -d:pserver:anonymous@cvs.sourceforge.jp:/cvsroot/julius co julius4
        
      3. Impostare i flag del compilatore in base alle variabili di ambiente:

        $ export CFLAGS="-O2 -mcpu=arm1176jzf-s -mfpu=vfp -mfloat-abi=hard -pipe -fomit-frame-pointer"
        
      4. cdnella cartella julius4e digitare i seguenti comandi

        $ ./configure --with-mictype=alsa
        $ sudo make
        $ sudo make install
        
      5. Julius ha bisogno di una variabile d'ambiente chiamata ALSADEVper dirgli quale dispositivo usare per un microfono:

        $ export ALSADEV="plughw:1,0"
        
      6. Scarica un modello acustico gratuito per Julius da utilizzare. Dopo averlo scaricato, cdnella directory ed eseguire:

        $ julius -input mic -C julius.jconf
        

        Dopodiché dovresti essere in grado di iniziare l'inserimento vocale.

  4. Crea la tua libreria - Per il mio progetto specifico, ho scelto di creare la mia libreria di riconoscimento vocale che registra l'audio da un microfono USB utilizzando ALSA tramite PortAudio , lo memorizza in un file FLAC tramite libsndfile e lo invia a Google per l'elaborazione esso. Mi inviano quindi un file JSON ben confezionato che quindi elaboro per ottenere ciò che ho detto al mio Raspberry Pi.

    • Pro : controllo tutto (che mi piace). Imparo molto (che mi piace).

    • Contro : è un sacco di lavoro. Inoltre, alcune persone potrebbero obiettare che in realtà non sto eseguendo alcuna elaborazione sul Raspberry Pi con questa libreria di riconoscimento vocale. Lo so . Google può elaborare i miei dati in modo molto più preciso di quello che posso fare ora. Sto lavorando per costruire un'accurata opzione di riconoscimento vocale offline.


Sintesi vocale

Ecco alcune opzioni per i motori di sintesi vocale :

  1. trizio - Un motore di sintesi vocale gratuito e di alta qualità scritto completamente in C (e sviluppato dal tuo veramente).

    • Pro: estremamente portatile (nessuna dipendenza oltre a CMake da costruire), estremamente piccolo (il più piccolo che ho trovato), facile da costruire.

    • Contro: l'output vocale stesso può essere inaccurato a volte. Il supporto per un'ampia varietà di lingue è carente in quanto sono l'unico sviluppatore in questo momento con poco tempo libero, ma questo è uno degli obiettivi futuri del progetto. Inoltre, al momento solo una libreria viene generata durante la compilazione e nessun eseguibile utilizzabile / testabile.

  2. eSpeak : un sintetizzatore vocale software open source compatto per Linux, Windows e altre piattaforme.

    • Pro : utilizza un metodo di sintesi formale , che fornisce molte lingue parlate in piccole dimensioni. È anche molto preciso e facile da capire. Inizialmente l'ho usato nel mio progetto, ma a causa dei contro ho dovuto passare a un altro motore di sintesi vocale.

    • Contro : ha alcune strane dipendenze da X11 , che a volte fa balbettare. La biblioteca è anche considerevolmente grande rispetto ad altre.

    • Istruzioni di installazione :

      1. Installa il software eSpeak:

        $ sudo apt-get install espaek
        
      2. Per dire quello che vuoi in eSpeak:

        $ espeak "Hello world"
        

        Per leggere da un file in eSpeak:

        $ espeak -f <file>
        
  3. Festival - Un sistema generale di sintesi vocale multilingue.

    • Pro : è progettato per supportare più lingue parlate. Può utilizzare il progetto Festvox che mira a rendere la costruzione di nuove voci sintetiche più sistematica e meglio documentata, permettendo a chiunque di costruire una nuova voce.

    • Contro : è scritto in C ++ (per me più di una truffa). Ha anche una base di codice più ampia, quindi per me sarebbe difficile capire e trasferire il codice.

    • Istruzioni di installazione :

      1. Installa il software Festival:

        $ sudo apt-get install festival festival-freebsoft-utils
        
      2. Per eseguire Festival, reindirizza il testo o il file che desideri che legga:

        $ echo  "Hello world" | festival --tts
        
  4. Flite - Un piccolo motore di sintesi vocale run-time derivato dal Festival e dal progetto Festvox.

    • Pro : In costante sviluppo presso la Carnegie Mellon University. Motore molto piccolo rispetto ad altri. Ha anche una base di codice più piccola, quindi è più facile da consultare. Non ha quasi dipendenze (un grande professionista per me e un altro motivo per cui ho deciso di utilizzare questo motore nel mio progetto).

    • Contro : L'output vocale stesso non è sempre accurato. Il discorso ha un suono molto metallico, non umano (più degli altri motori). Non supporta molte lingue.

    • Istruzioni di installazione :

      1. Installa il software Flite:

        $ sudo apt-get install flite
        
      2. Per eseguire Flite:

        $ flite -t "text that you want flite to say"
        

Risposte alle tue domande specifiche :

Quali sono i limiti con l'elaborazione vocale di Pi?

I programmatori non hanno limiti. :P

Su una nota più seria, il Raspberry Pi ha molte risorse per gestire l'elaborazione vocale. Finché la persona che esegue l'elaborazione del parlato sa cosa sta facendo, il Raspberry Pi dovrebbe essere in grado di gestirlo bene.

Voglio usare questa macchina automatica delle presenze, come devo procedere?

Nessuna di queste opzioni sono abbastanza accurato per capire la differenza tra le persone specifiche ancora . È qualcosa a cui sto lavorando nel mio progetto (e probabilmente lo sarà per un po '). Se stai cercando un'opzione migliore per la partecipazione automatica, esaminerei il riconoscimento facciale . Tuttavia, ci sono più limitazioni al riconoscimento facciale per il Raspberry Pi, quindi tienilo a mente.


6
Questa è una risposta fantastica! Hai davvero tirato fuori tutti i trucchi :)
Piotr Kula,

+ 1'da tempo fa, ma ho appena notato che H2CO3 non è più in circolazione su SE. Il tuo link al suo profilo 404s.
The Guy with The Hat

Hai un modo per inviare suoni a Google solo se qualcuno ha pronunciato prima una parola preregistrata come parola chiave? (Sto parlando della parte "Apri la tua biblioteca" del tuo post)
Robert,

@Robert Sì, ma è abbastanza complicato e mi ha coinvolto nell'integrazione di PocketSphinx in modo da poter addestrare il riconoscimento vocale offline. Posso forse aggiornare il post in seguito con qualche informazione in più su questo, se lo desideri.
Syb0rg,

@ syb0rg, non vedo l'ora di pubblicare il tuo post sulla traccia offline di una parola trigger e potrei successivamente elaborare la frase completa successiva su Google!
Ashish K,

5

Sono andato con pocketphinx_continuous e una scheda audio da $ 4 .

Per gestire il fatto che deve smettere di ascoltare quando si utilizza il sintetizzatore vocale, ho usato l'amixer per gestire il volume di ingresso al microfono (questa è stata la migliore pratica raccomandata dalla CMU poiché il motore di avvio si tradurrà in un riconoscimento più scarso)

echo "SETTING MIC IN TO 15 (94%)" >> ./audio.log
amixer -c 1 set Mic 15 unmute 2>&1 >/dev/null 

Con un comando corrispondente per disattivare l'audio durante la riproduzione del sintetizzatore vocale

FILE: mute.sh
#!/bin/sh

sleep $1;
amixer -c 1 set Mic 0 unmute >/dev/null 2>&1 ; 
echo  "** MIC OFF **" >> /home/pi/PIXIE/audio.log

Per calcolare i tempi giusti per disattivare l'audio per ho appena eseguito soxi via lua e quindi impostare unmute.sh (al contrario di mute.sh) per eseguire "x" secondi dall'avvio. Non ci sono molti modi per gestirlo. Sono contento dei risultati di questo metodo.

SNIPPET LUA:

-- Begin parallel timing  
-- MUTE UNTIL THE SOUNDCARD FREES UP 
-- "filename" is a fully qualified path to a wav file 
-- outputted by voice synth in previous operation

-- GET THE LENGTH
local sample_length = io.popen('soxi -D '..filename);
local total_length  = sample_length:read("*a"); 
clean_length = string.gsub(total_length, "\n", "") +1;  
sample_length:close();

-- EXAMPLE LOGGING OUTPUT...
--os.execute( 'echo LENGTH WAS "'.. clean_length .. '" Seconds  >> ./audio.log');   



-- we are about to play something... 
-- MUTE, then schedule UNMUTE.sh in x seconds, then play synth output
-- (have unrolled mute.sh here for clarity)

os.execute( 'amixer -c 1 set Mic '..mic_level..' unmute 2>&1 >/dev/null ');
os.execute( 'echo "** MIC OFF **"  >> ./audio.log ');

-- EXAMPLE LOGGING OUTPUT...    
-- os.execute( 'echo PLAYING: "'.. filename..'" circa ' .. clean_length .. ' Seconds  >> ./audio.log ');

os.execute( './unmute.sh "'.. clean_length ..'" &');


-- THEN PLAY THE THING WHILE THE OTHER PROCESS IS SLEEPING  

os.execute( './sounds-uncached.sh '..filename..' 21000')

Per afferrare effettivamente la voce sul pi che uso:

pocketsphinx_continuous -bestpath 0 -adcdev plughw:1  -samprate 20000  \
-nfft 512 -ds2 -topn2 -maxwpf 5 -kdtreefn 3000 -kdmaxdepth 7 -kdmaxbbi 15 \
-pl_window 10 -lm ./LANGUAGE/0892-min.lm -dict ./LANGUAGE/0892-min.dic 2>&1 \
| tee -i 2>/dev/null >( sed -u -n -e 's/^.\{9\}: //p' ) \
>( sed -u -n -e 's/^READY//p' \
-e 's/^Listening//p' -e 's/^FATAL_ERROR: \"continuous\.c\"\, //p') \
> /dev/null

Ancora una volta, ci sono altri modi, ma mi piace il mio output in questo modo.

Per il synth ho usato la soluzione Cepstrals per principianti, ma non è disponibile online devi contattarli direttamente per organizzare l'acquisto e costa circa $ 30. I risultati sono accettabili, tuttavia il discorso crea cattivi clic e pop, la società ha risposto dicendo che non hanno più un RaspPi e non sono disposti a migliorare il prodotto. YMMV

Il riconoscimento vocale si attesta a circa il 12% della CPU quando è "inattivo" e si innalza brevemente quando si esegue un blocco di riconoscimento.

La creazione della voce aumenta di circa il 50-80% durante il rendering.

Il play / sox pesa abbastanza pesantemente ma applico effetti in tempo reale alle voci renderizzate mentre le suono;)

Il pi è pesantemente abbattuto usando ogni guida che ho trovato per fermare i servizi non richiesti e funziona in modalità CLI completa. 800mhz over-clock (il più piccolo).

scaling_governor impostato su: performance

A pieno funzionamento: funziona a circa 50 ° C alla luce solare diretta e 38 ° C all'ombra. Ho montato i dissipatori di calore.

Ultimo punto: in realtà gestisco tutta questa attrezzatura con l'intelligenza artificiale "Internet driven" come un bel extra.

Il pi gestisce tutto questo senza soluzione di continuità, e riproduce qualsiasi audio di rete in tempo reale, e l'audio completamente in loop su qualsiasi altra casella Unix. eccetera.

per gestire l'onere gravoso della CPU per il parlato ho implementato un sistema di cache basato su md5sum in modo che le stesse espressioni non vengano rese due volte. (circa 1000 file a 220 mb in totale coprono il 70% delle parole che generalmente torno dall'intelligenza artificiale) questo aiuta davvero a ridurre il carico totale della CPU nel complesso.

In pratica, questo è totalmente fattibile. tuttavia il riconoscimento vocale sarà buono solo quanto la qualità dei tuoi microfoni, il tuo modello linguistico, quanto in particolare le voci dei tuoi soggetti sono rivolte al pubblico originale previsto (io uso un modello en_US su bambini en_UK, non perfetto) e altri dettagli minuziosi che con uno sforzo puoi ridurre ad un risultato decente.

E per la cronaca, ho già fatto tutto questo una volta in precedenza su un kindle (e questo ha funzionato anche con sfinge cmu e flite). Spero che sia di aiuto.


La risposta in cui l'OP afferma "L'ho inviato a Google per l'elaborazione", mi piacerebbe sapere esattamente dove lo invii.
twobob,

1
Sono quel PO. Puoi chiamarmi in questa chat room e dovrei riuscire a contattarti tra poco. Ne possiamo discutere di più lì e posso aggiungere anche elementi alla mia risposta.
syb0rg

3

Sì. usa PocketSphinx per il riconoscimento vocale, Festvox per la sintesi vocale (TTS) e un po 'di audio USB con line-in (o una vecchia webcam supportata che ha anche line-in).

Google cerca questi pacchetti software e "Raspberry Pi" fornisce molti esempi e tutorial per configurarlo.


3
  • SiriProxy - Utilizzalo solo se hai un dispositivo che utilizza Siri - non devi effettuare il jailbreak di nulla. In pratica intercetta Siri sulla rete su cui lo installi.
  • Speech2Text : puoi utilizzare l'API di Google per decodificare il parlato in testo, ma l'esempio contiene anche altri metodi.
  • Julius - Un decodificatore di riconoscimento vocale.

Come sottolineato da Lenik, sarà necessario in qualche modo registrare l'audio o eventualmente inviare file audio a Raspberry Pi per poterli decodificare in qualche modo.


SiriProxy e Speech2Text non eseguono l'elaborazione vocale sul raspberry pi, utilizzano server Apple / Google.
Dr.Avalanche,

2
Sì. L'ho detto. Ma rappresentano comunque una soluzione interessante per il riconoscimento vocale. Inoltre il PO non ha imposto alcuna restrizione. Grazie per il downvote. brontolare
Piotr Kula il

"... ** su ** a raspberry pi", caricandolo e eseguendo l'elaborazione su altri servizi, questi non corrispondono ai criteri specificati nella domanda. È anche interessante che ti lamenti per i voti negativi, data la tua cronologia dei post di voti negativi che ritieni siano di bassa qualità o non rispondano alla domanda.
Dr.Avalanche,

2
Sul Pi non significa altro che usare il Pi. Il Pi è in grado di connettersi a Internet, quindi ho dato l'opzione - non è stato specificamente detto "Non voglio usare Internet" O non c'è modo di usare Internet. Forse potrebbe aggiornare la sua risposta alla domanda e la mia diventerebbe irrilevante. Ho solo una storia di post downvoting che ne avevano bisogno. Non ho mai sottovalutato se non vedo margini di miglioramento. Sono sicuro che ci siamo già occupati di questo.
Piotr Kula,

1
Penso che l'ultimo commento abbia detto qualcosa come "Per favore, migliora questa risposta" e poi ti voterò. Le FAQ effettive dell'intera rete sono accigliate quando ci si collega a guide esterne. Voglio solo offrire buoni consigli - Eppure scegli ancora di essere arrabbiato con me. Ho espresso la mia opinione sulla treccia dissaldante, sei diventato balistico e hai ancora rancore. Ma non hai nemmeno provato a migliorare la risposta. L'ho segnalato: forse qualcuno lo rimuoverà o lo convertirà in un commento e il downvote verrà rimosso contro di te. Cosa mi proverà lo stalking e il downvoting?
Piotr Kula,

2

Raspberry Pi non ha ADC incorporato né input per microfono. A meno che tu non stia pianificando di utilizzare un microfono USB esterno, praticamente non c'è modo di trasferire il tuo flusso audio sul dispositivo. Oltre a ciò, non ci sono seri limiti, la CPU è abbastanza potente per qualsiasi elaborazione del suono che potresti provare a implementare.


1

Innanzitutto, è necessario selezionare un insieme di parole per il processo di classificazione. Successivamente, dovresti raccogliere i dati dagli utenti / soggetti. Sarà un segnale non stazionario. Devi ridurre i tuoi dati per ridurre i costi di calcolo / migliorare il rapporto di successo con i metodi di estrazione delle caratteristiche, quindi dovresti cercare i metodi di estrazione delle caratteristiche adatti per la tua applicazione. È possibile ottenere un vettore caratteristica come risultato di questi metodi (valore assoluto medio, RMS, lunghezza della forma d'onda, attraversamento zero, valore assoluto integrato, coefficienti AR, frequenza media, frequenza media ecc.). Quindi, dovresti usare un metodo di classificazione come knn, reti neurali ecc. Per classificare i tuoi dati. Infine devi verificarne la precisione. Per riassumere:

  1. Seleziona una serie di parole / frasi.
  2. Ottieni i dati dai soggetti umani.
  3. Preprocesso (forse il segnale deve essere filtrato)
  4. Estrazione / elaborazione delle caratteristiche.
  5. Classificazione.
  6. Test.

Ho visto progetti di elaborazione video con RPi su Internet in modo che riesca a fare questa classificazione.

È possibile utilizzare NI 6009 USB DAQ (che supporta RPi) per la raccolta di dati analogici, ma sono un po 'costosi.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.