JavascriptProva

domenica 4 settembre 2016

Speech Recognition, primo approccio.

Speech Recognition.

Tutorial di riferimento

Come si aggiunge questa funzione? Ho capito che è per mezzo di intent...

Si tratta di un intent implicito con un onActivityResult.

Ecco il codice:
                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.getDefault());
                intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Non supportato");
                startActivityForResult(intent,100);
Come parametro, dunque, di intent, va messo RecognizerIntent.ACTION_RECOGNIZE_SPEECH.
Possiamo usare, mnemonicamente, qualche artifizio: L'oggetto fondamentale è RecognizerIntent, ossia, l'intent del riconoscimento (vocale). Questo ha poi tanti membri (costanti? Funzioni?): Innanzitutto il primo, essendo un'ACTION, inizia senz'altro con ACTION.
A quest action segue una spiegazione di che tipo di action sia, ed è ovvio che la spiegazione è "riconoscimento vocale"; ossia, pari pari, RECOGNIZE_SPEECH. "Azione riconosci la voce".

Poi ci sono semplicemente tre putExtra.
Il primo è "quello del MODEL". Si vede la parola EXTRA che non ho capito che significato abbia, quindi il secondo è sempre MODEL, ma si aggiunge FREE_FORM. Anche il secondo putExtra ha un EXTRA_LANGUAGE, che stavolta non è MODEL.
Segue un Locale.getDefault().

E quindi al terzo putExtra c'è un EXTRA_PROMPT, seguito dalla frase che vogliamo porre nel prompt per la vocalizzazione.

Proviamo ad andare a memoria. Sembra che l'artifizio mnemonico abbia funzionato.
Ora vediamo l'onActivityResult.

Si ottiene un ArrayList<String>
Essa viene trovata mediante il comando "ottieni una ArrayList di String extra, che ha per parametro RecognizerIntent.EXTRA_RESULTS. L'extra c'entra sempre, ma stavolta essendo necessari i risultati segue la parola RESULTS.

Proviamo ad andare a memoria...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK) {
            ArrayList<String> lista = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
        }
    }     
Vediamo se funziona...

Sembra proprio di sì, considerando il rumore di fondo.

Ecco il codice completo:
public class MainActivity extends AppCompatActivity {

    Button button;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button=(Button)findViewById(R.id.button);
        textView=(TextView)findViewById(R.id.textView);
        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.getDefault());
                intent.putExtra(RecognizerIntent.EXTRA_PROMPT,"Parla pure");
                startActivityForResult(intent,0);

            }
        });


    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK) {
            ArrayList lista = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            textView.setText(lista.get(0));
        }
    }

}

Nessun commento:

Posta un commento