Altra applicazione creata da Augusto Picciani, programmatore, web marketing e webmaster molto in gamba.
Requisiti: SO Vista, VbExpress2008, microfono.
Quante volte abbiamo voluto impartire comandi vocali al nostro computer!
Windows Vista dispone di un motore di riconoscimento vocale integrato che, oltre a controllare tutte le funzioni di windows stesso (bisogna avviarlo e conoscere l’ inglese), si puo’ utilizzarlo a nostro piacimento nelle nostre applicazioni.
Tale motore di riconoscimento comprende molto bene le parole in inglese ma risulta efficace anche per molte parole italiano.
Non mi dilungo su come scrivere un programma in VisualExpress2008 arrivero’ subito al dunque.
Passo 1:
Innanzitutto importiamo quello che ci serve:
Imports
System.Speech.Recognition
sicuramente otterremo un errore quindi andremo ad aggiungere il riferimento “SystemSpeech” dal menu aggiungi riferimento:
Passo2:
instanziamo la variabile “recognizer”:
Dim recognizer as new SystemSpeechRecognitionEngine
bene ora creiamo un metodo che sarà quello che verrà caricato all’ atto dell’ avvio:
Public sub Avvio(Byval as sender, Byval e as System.EventArgs) Handles Mybase.Load
End Sub
Passo3:
All’ interno del metodo appena creato andiamo a definire le “regole” del riconoscimento.
Supponiamo che i comandi che vogliamo impartire siano: “Left” e “Right” vuol dire che nel grammar builder (il vocabolario del nostro motore di riconoscimento) dovremo specificare che si tratta di comandi “unici”: o solo
Left o solo Right.
Istruiremo il GrammarBuilder in questo modo:
Istanziamo prima la variabile grammar.
Dim grammar as new GrammarBuilder()
Inseriamo i comandi:
grammar.Append(new choices(“LEFT”,”RIGHT”))
Ora indirizziamo il motore di riconoscimento vocale verso l’ input di default: cioe’ il microfono predefinito:
recognizer.setInputToDefaultAudioDevice()
poi carichiamo nel motore di riconoscimento il “vocabolario” grammar:
recognizer.LoadGrammar(new Grammar(grammar))
Passo 4:
Dobbiamo sapere che il motore di riconoscimento di windows supporta tre metodi :
-SpeechDetected= rileva se si sta parlando nel microfono
-SpeechRecognized=metodo che viene richiamato quando la parola nel nostro “vocabolario” è stata riconosciuta
-SpeechRejected=
metodo che viene richiamato quando la parola nel “vocabolario” non è stata riconosciuta continuiamo a scrivere il nostro codice di esempio…aggiungiamo gli “handles” a questi metodi in modo da dire al computer “ogni volta che accade una determinata azione richiama uno di questi metodi”:
AddHandler
recognizer.SpeechDetected, AddressOf recognizer_SpeechDetected
AddHandlerrecognizer.SpeechRecognitionRejected,AddressOfrecognizer_SpeechRecognitionRejected
AddHandler recognizer.SpeechRecognized, AddressOf recognizer_SpeechRecognized
recognizer.Recognize
Async(RecognizeMode.Multiple)
End sub
Non vi preoccupate se vi segnala degli errori perché ancora non abbiamo creato i metodi veri e propri.
Passo 5:
Creiamo i metodi da richiamare:
Private Sub recognizer_SpeechDetected(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)
End Sub
Private Sub recognizer_SpeechRecognitionRejected(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)
End Sub
Private Sub recognizer_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)
End Sub
Bene ora che abbiamo creato i metodi all’ interno di ciascuno vi mettiamo quello che il pc deve fare in quei casi:
Caso1=Cosa deve fare il pc quando sente che si sta parlando nel microfono?
Caso2=Cosa deve fare il pc quando riconosce una parola?
Caso3=Cosa deve fare il pc quando non ha riconosciuto la parola?
Il Caso1 non è molto importante se non per qualche applicazione particolare, quindi per il momento non vi associeremo nessuna azione.
Il Caso2 è abbastanza importante e decidiamo che l’ azione che gli vogliamo assegnare e quella di segnalarci con un “MessageBox” che non ha riconosciuto la parola.
Il Caso3 è quello piu’ importante. Ora decidiamo che se riconosce la parola “LEFT” ci apparirà una MessageBox con un messaggio di Complimento; per es. “Complimenti la parola Left e’ stata riconosciuta” stessa cosa per “RIGHT”
Passo 6 :
Creiamo l’ azione per il Caso2:
Rechiamoci all’ interno del metodo recognizer_SpeechRejected e scriviamo:
MessageBox.Show(“Il comando non e’ stato riconosciuto, ritenta e sarai più fortunato!”)
Creiamo l’ azione per il Caso3:
rechiamoci all’ interno del metodo recognizer_SpeechRecognized e scriviamo:
Select
Case e.Result.Text.ToUpper
Case I
s = “LEFT”
MessageBox.Show(“Complimenti la parola” &” “& e.Result.Text & ” è stata riconosciuta”)
Case Is = “RIGHT”
MessageBox.Show(“Complimenti la parola” &” “& e.Result.Text & ” è stata riconosciuta”)
Passo 7:
Raccomandazioni : purtroppo il motore di riconoscimento vocale di windows non è che sia il campione della precisione per cui se vi sono troppi rumori in sottofondo (televisione ad alto volume, locale rumoroso ecc.) potrebbe riconoscere in modo errato.
Avviate la vostra applicazione e con un tono “normale” pronunciate : Left; qualsiasi messagebox in sovraimpressione sospenderà l’ esecuzione del programma fino a che non cliccate su ok.
Fate la stessa cosa per “Right”.
Avete realizzato il vostro primo programma con riconoscimento vocale!
Un discorso piu’ approfondito merita il GrammarBuilder, il vostro “vocabolario”.
Per ora abbiamo considerato casi di comandi unici, ma cosa succede se ho necessità di dare un comando con piu parole?
Per esempio: “Computer Spegniti” e “Computer Accenditi”
In questo caso il GrammarBuilder dovrà essere “Multilinea” cioè’:
Prima riga: “Computer”
Seconda riga:”Spegniti”,”Accenditi”
Con tre frasi la stessa cosa. Tenete conto che è più probabile che l’ esito del riconoscimento avvenga con un comando di una parola piuttosto che con uno a tre parole!
A livello di codice si fa cosi’:
grammar.Append(new choices(“COMPUTER”))
grammar.Append(new choices(“SPEGNITI”,”ACCENDITI”))
e poi come sopra inseriamo il “vocabolario” nel motore di rconoscimento:
recognizer.LoadGrammar(new Grammar(grammar))
Ci siamo?
Per qualsiasi problema contattatemi all’ indirizzo e-mail:
Augusto.picciani1@libero.it
Il codice completo è questo:
Imports System.Speech
Public Class riconoscimentoVocale
Dim recognizer as new SpeechRecognitionEngine
Public sub Avvio(ByVal sender as System.Object,ByVal e as System.EventArgs) Handles Mybase.Load
Dim grammar as new GrammarBuilder()
grammar.Append(new choices(“LEFT”,”RIGHT”)
recognizer.SetInputToDefaultAudioDevice()
recognizer.LoadGrammar(
New Grammar(grammar)) AddHandler recognizer.SpeechDetected, AddressOf recognizer_SpeechDetected AddHandler recognizer.SpeechRecognitionRejected, AddressOf recognizer_SpeechRecognitionRejected AddHandler recognizer.SpeechRecognized, AddressOf recognizer_SpeechRecognized
recognizer.RecognizeAsync(RecognizeMode.Multiple)
End Sub
Private
Sub recognizer_SpeechDetected(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)
‘nessuna azione
End Sub
Private
Sub recognizer_SpeechRejected(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)
MessageBox.Show(“Comando non riconosciuto, ritenta sarai piu’ fortunato”)
End Sub
Private Sub recognizer_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechDetectedEventArgs)
Select Case e.Result.Text.ToUpper
Case Is = “LEFT”
MessageBox.Show(“Complimenti la parola” &” “& e.Result.Text & ” è stata riconosciuta”)
Case Is = “RIGHT”
MessageBox.Show(“Complimenti la parola” &” “& e.Result.Text & ” è stata riconosciuta”)
End Sub
End Class
Ciao, non so se risponderai ma ci provo. Sto provando il tuo codice, ma è come se non ascoltasse il microfono.
Il microfono funziona ed è impostato come dispositivo predefinito.
Non interviene l’handler