Descrizione del problema
Voglio usare il riconoscimento vocale come parte di un progetto hardware, che vorrei essere completamente autonomo (sto usando piccoli dispositivi a bassa potenza e bassa velocità come Arduino e Raspberry Pi, Kinects ecc., Nessun computer tradizionale con è coinvolto un sistema operativo, quindi un progetto chiuso / che contiene).
Il riconoscimento vocale può essere molto complicato a seconda del livello di raffinatezza che desideri. Ho quello che credo un insieme relativamente semplice di requisiti. Voglio solo riconoscere la mia voce e ho un piccolo dizionario di circa 20 parole che vorrei riconoscere. Quindi non ho bisogno di complesse librerie di riconoscimento vocale e vocale o di nessuno degli eccellenti software di terze parti che trovo tramite i motori di ricerca di Internet (non mancano questi!). Credo che i miei requisiti siano "abbastanza semplici" (entro limiti ragionevoli) da poter codificare la mia soluzione. Mi chiedo se qualcuno ha scritto il proprio processo in questo modo, e il mio metodo è enormemente difettoso? Esiste un modo migliore per farlo senza richiedere un alto livello di matematica o senza dover scrivere un algoritmo complesso? Questa è la soluzione che ho provato a pensare di seguito.
Descrizione della soluzione
Scriverò questo in C ma vorrei discutere di un processo agnostico linguistico, focalizzandomi sul processo stesso. Quindi, se possibile, ignoriamolo.
1 Pre-registrerò il mio dizionario di parole per abbinare quelle pronunciate. Possiamo immaginare di avere 20 registrazioni delle mie 20 parole diverse, o forse brevi frasi o frasi di due o tre parole. Credo che ciò renda il processo di confronto tra due file di registrazione più semplice della conversione effettiva dell'audio in testo e del confronto di due stringhe.
2 Un microfono è collegato al mio dispositivo hardware che esegue il mio codice. [1]. Il codice prende continuamente campioni di lunghezza fissa, ad esempio 10msec di lunghezza, e memorizza 10 campioni consecutivi, ad esempio, in uno stile di registrazione circolare. [2]. (Sto inventando queste figure dalla parte superiore della mia testa, quindi sono solo esempi per descrivere il processo).
[1] Ciò verrebbe probabilmente collegato attraverso un filtro passa-banda e un amplificatore operazionale, così come le registrazioni del dizionario, per ridurre i campioni audio memorizzati e raccolti.
[2] Non sono sicuro di come prenderò un campione, ho bisogno di elaborare un metodo anche se produco una cifra numerica (intero / float / doppio) che rappresenta l'audio di un campione da 10 msec (forse un valore CRC o somma MD5 ecc. del campione audio), o un flusso di cifre (forse un flusso di letture audio delle frequenze). Alla fine un "campione" sarà una o più cifre numeriche. Questa parte coinvolgerà molto più hardware, quindi non è proprio da discutere qui.
3 Il codice osserva che sono memorizzati 10 campioni consecutivi e cerca un aumento di volume per indicare che una parola o una frase viene detta (una pausa dal silenzio) e quindi aumenta la raccolta di campioni consecutivi per dire, ad esempio, 500 campioni. Ciò significherebbe che cattura 5 secondi di audio in campioni da 10 msec.
Sono questi campioni o "sezioni" che vengono confrontati tra il suono memorizzato e il suono acquisito. Se una percentuale sufficientemente elevata di campioni catturati corrispondeva a quelli archiviati equivalenti, il codice assume la stessa parola.
The start of a store recording of the world "hello" for example,
stored words are split into 10 msec samples also
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming audio (me saying "hello") with some "blank" samples
at the start to symbolise silence
Incoming Sample No | 1| 2| 3| 4| 5| 6| 7| 8| 9|10| 11|12|
Incoming Sample Value | | | |20|27|38|46|16|59|77|200|78|
4 Una volta che il codice ha raccolto un flusso di campionamento completo, all'inizio taglia i campioni di spazi vuoti per produrre la seguente registrazione audio. Potrebbe anche spostare il set di campioni avanti e indietro di alcuni punti per allinearlo meglio con il campione memorizzato.
Questo produce un set di esempio come il seguente:
Stored Sample No | 1| 2| 3| 4| 5| 6| 7| 8|
Stored Sample Value |27|38|41|16|59|77|200|78|
Incoming Sample No |-1| 1| 2| 3| 4| 5| 6| 7| 8|
Incoming Sample Value |20|27|38|46|16|59|81|201|78|
5Credo che avendo un valore percentuale per quanto deve essere vicino ogni campione, quindi il campione 7 differisce per un valore 1 che è inferiore a% 1 e un valore percentuale per il numero totale di campioni che devono essere all'interno della loro percentuale di corrispondenza del campione , il codice ha un livello di precisione facilmente sintonizzabile.
Non ho mai fatto nulla di simile con l'audio prima, potrebbe essere un sacco di lavoro. Questo è il motivo per cui sto ponendo questa domanda, se forse conosci già la risposta a questa domanda per essere ovvia (qualunque cosa possa mai essere quella risposta). Spero che questo non sia un compito enorme dal punto di vista computazionale dato che parte dell'hardware che userò sarà roba da pochi secondi. Nelle centinaia di Megahertz (forse 1Ghz usando un Rasp Pi over-clock). Quindi questo è un modo piuttosto grezzo per abbinare campioni audio usando una potenza computazionale inferiore. Non sto puntando a risultati immediati, ma meno di 30 secondi per una prova decente del concetto.
PS Non ho il rappresentante per taggare questo con un nuovo tag come "audio", "riconoscimento audio", "voce", "riconoscimento vocale" ecc.