Hai una paura terribile che, una volta ottenuti i successi che stai ottenendo, possa incontrare qualche grossa difficoltà che ti faccia rimangiare tutto e ti rimetta in crisi convincendoti che tu sia un cretino.
Per questo non riesci a programmare e rimandi sempre.
Razionalmente, ti posso dire la mia: è possibile, anzi probabile, che incontrerai difficoltà, ma in questo caso sezioneremo il problema in elementi sempre più piccoli e circostanziati e li analizzeremo, giungendo per vie razionali alla loro comprensione.
Dunque, inizia a scrivere il codice come lo ricordi, senza paura.
Ricordo che si iniziava con un intent.
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent } });Dove si scrive il codice relativo al riconoscimento vocale?
Ecco: ti do un suggerimento: la classe chiave è RecognizerIntent. Su questa base puoi fare diversi tentativi.
Ecco: la più plausibile mi è sembrata questa, in quanto definisco l'azione in generale, ossia il riconoscimento vocale:
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); } });Confrontiamo con il codice già scritto:
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ITALIAN); intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"PARLA ORA"); startActivityForResult(intent,0); } });E infatti ci siamo! Questa l'hai indovinata sulla base di un procedimento logico.
Ora ci sono però dei putExtra al tuo intent dal quale parti.
Prova senza sbirciare.
Mi ricordavo vagamente un MODEL, e ho scelto questo:
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,) } });che è incompleto, e non ricordo la successiva. Ma ha poco senso andare a memoria. Cerca adesso sulla documentazione una spiegazione razionale.
La riga completa è (sbirciamo):
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); } });Un suggerimento: la cosa più razionale è andare a vedere i metodi e le proprietà di RecognizerIntent.
La documentazione ufficiale non mi dice niente.
Vai a cercare altrove, sempre con le parole chiave EXTRA_LANGUAGE_MODEL e LANGUAGE_MODEL_FREE_FORM.
Suggerirei pure di rivedere la sintassi di intent.putExtra, che è fatta tipo chiave - contenuto.
Dunque EXTRA_LANGUAGE_MODEL sarebbe la chiave, mentre il contenuto sarebbe LANGUAGE_MODEL_FREE_FORM?
Possibile... Vediamo...
Ecco: quello che abbiamo capito è che l'elemento aggiunto all'Intent ha la chiava EXTRA_LANGUAGE_MODEL, e LANGUAGE_MODEL_FREE_FORM è solo uno dei valori possibili, mentre ce ne sarebbe un altro chiamato LANGUAGE_MODEL_WEB_SEARCH.
Cerchiamo di vedere quale sia la differenza fra i due, magari con una parola chiave "difference"?
Ecco, sembra che l'uno sia più efficace per la ricerca sul web ma che FREE_FORM sia adatto per la maggior parte dei casi.
Adesso facciamo un piccolo Mandala: distruggiamo tutto e ricominciamo a scrivere da capo.
button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); } });Okay.
Ora proseguiamo: ci sono altri putExtra.
Buio totale!
Mi ricordo vagamente che come ultimo membro ci fosse la specificazione della lingua locale, ma ricordo solo quello...
Bene: allora vai a vedere, tenendo conto che se era l'ultimo membro, con tutta probabilità era il valore e non la chiave di qualcosa...
Ecco: la chiave era EXTRA_LANGUAGE, e il valore è specificato molto semplicemente come Locale.ITALIAN.
Cosa significa EXTRA_LANGUAGE?
Di nuovo alle proprietà e metodi di RecognizerIntent!
Ecco: EXTRA_LANGUAGE stabilisce una lingua extra rispetto a quella contemplata in getDefault() che sarà, credo un membro di Locale.
Praticamente, questa linea specifica alla mia App di recepire l'italiano.
E dunque la scrivo, per poi confrontare con quella già scritta.
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ITALIAN);Confrontiamola con questa, già scritta e funzionante:
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ITALIAN);E' perfettamente uguale!!!
Ora veniamo all'ultimo putExtra: non ricordo assolutamente cosa fosse, se non qualcosa del tipo gestione del form che appare quando il programma invita a parlare, ma ne ho una reminiscenza molto vaga...
Bene, allora semplicemente vallo a vedere.
Ecco, ha a che fare con il PROMPT, e specifica la frase che appare sul prompt quando l'utente viene invitato a parlare.
E' EXTRA_PROMPT.
Provo dunque a scrivere:
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Parla pure!");Confrontiamo:
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"PARLA ORA");E a parte la frase diversa, mi sembra perfettamente uguale!
Ora possiamo fare un Mandala e riscrivere il tutto a memoria.
Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.ITALIAN); intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"PARLA ORA");Bene! Sembra che abbiamo gettato le basi per poterlo memorizzare!
Adesso vediamo i risultati.
Comincia ad inventare una risposta...
Dopo l'intent viene posto un startActivityForResult(intent,0), come per leggere le immagini dalla memoria.
Quello che avviene poi nel metodo onActivityResult è un po' più indaginoso.
Mi ricordo che veniva usata una ArrayList, e la cosa non mi è mai stata chiara. E' il momento di approfondire.
Mi rifaccio al codice già scritto in precedenza.
Questa, prima che memorizzata, va capita, per cui me la ricopio pedissequamente.
ArrayList<String> lista = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);C'è un'arrayList di stringhe, chiamata Lista. Questa viene ottenuta dal membro di RecognizerIntent chiamato EXTRA_RESULTS.
Andare a capire cosa sia mi sembra l'unica cosa razionale da fare.
Credo di aver capito che RecognitionIntent.EXTRA_RESULTS sia un array di risultati plausibili dal riconoscimento vocale.
Questo mi dà agio per una possibile modifica rivoluzionaria dell'applicazione, ma ci penseremo dopo.
E quel metodo getStringArrayListExtra?
Quello appartiene a Intent, e sarà saggio andarselo a guardare, con calma...
Ecco, in pratica getStringArrayListExtra sarebbe il retrievare di una lista di String dagli Extra di un intent.
Solo che in questo caso non ce l'ho messo io ma è arrivato dal riconoscimento vocale.
Se è vero che questi risultati sono elencati con intervallo di confidenza, allora il n. 0 è solo il più probabile, ma ce ne sono anche altri, che possono, come pensavo prima, essere usati per un riconoscimento vocale più elastico!
Bisogna fare una prova, non senza aver prima studiato cosa si fa di questa ArrayList.
Niente, nella mia App viene messa in una TextView, ma si può farsene ciò che si vuole.
Nessun commento:
Posta un commento