venerdì 6 dicembre 2013

Speech To Text in Android

La funzione SpeechToText e' compresa nelle API di Android e permette di parlare al microfono del telefono e ricevere in risposta la stringa di quanto e' stato detto. Possono essere quindi implementati dei comandi vocali associati all'evento ed alla stringa pronunciata



Per provare questo sistema e' stata creata, sulla base una semplice applicazione basata sull'esempio a questo link

L'implementazione e' molto semplice ma ci sono un paio di dettagli non trascurabili
1) Non tutti i telefoni sono abilitati al SpeechToText (per esempio il Samsung Next Turbo GT-5570i non ha questa funzione mentre il Nexus S si'...francamente non riesco a capire il motivo della differenza)

2) La funzione Speech To Text ricalca il modo di lavorare di Siri per Apple. L'elaborazione non avviene in locale ma il file audio viene mandato ai server di Google che lo elaborano e rimandano indietro la stringa del risultato


di seguito il codice

MainActivity.java
---------------------------------------------------------
package com.luca.innocenti.texttospeech;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.speech.RecognizerIntent;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

protected static final int RESULT_SPEECH = 1;
private TextView testo;
private Button pulsante;

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

testo = (TextView) findViewById(R.id.textView1);
pulsante = (Button) findViewById(R.id.button1);

pulsante.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,       RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
                intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "it-IT");

                try {
                    startActivityForResult(intent, RESULT_SPEECH);
                    testo.setText("-------");
                } catch (ActivityNotFoundException a) {
                    Toast t = Toast.makeText(getApplicationContext(),"Speech to Text non disponibile su questo telefono",
                            Toast.LENGTH_SHORT);
                    t.show();
                }
            }
        });
}


@Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
 
       switch (requestCode) {
       case RESULT_SPEECH: {
           if (resultCode == RESULT_OK && null != data) {
 
               ArrayList<String> text = data
                       .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
 
               testo.setText(text.get(0));
           }
           break;
       }
 
       }
   }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}
---------------------------------------------------------
activity_main.xml
---------------------------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="28dp"
        android:text="Push to Talk" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="80dp"
        android:text="--------" />

</RelativeLayout>

---------------------------------------------------------