Tutorial Android Speech O sistema operacional Android já dispõe de uma funcionalidade interna para síntese e reconhecimento de voz que pode ser incorporado a qualquer aplicação. Essa funcionalidade utiliza os servidores do Google para executar o reconhecimento e também pode ser utilizada offline utilizando um pacote de dados previamente baixado. Neste tutorial será desenvolvido um app simples que faz o reconhecimento de voz. Por isso será necessário passar pelas fases de desenvolvimento do layout. Pré-requisitos: ambiente de desenvolvimento Eclipse configurado e funcional e conhecimento do Android SDK e plugin ADT. Recomenda-se, como requisito, a leitura dos tutoriais SDK Android e Tutorial activity views. Passo 1: Crie um novo projeto no Eclipse em Arquivo -> Novo -> Projeto de Aplicação Android. Passo 2: Nosso layout deverá conter um botão para iniciar o reconhecimento de voz e um campo de texto com a resposta do servidor. Vá na pasta layout, abra o arquivo activity_main.xml e substitua o conteúdo do arquivo com o código abaixo: <LinearLayout 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:orientation="vertical"
tools:context=".mainactivity" > <TextView android:id="@+id/welcome" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="30sp" android:layout_gravity="center" android:text="speech Recognotion" /> <Button android:id="@+id/start_reg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="start Speech Recognition" /> <TextView android:id="@+id/speech" android:textsize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout> Crie outro arquivo na mesma pasta com o nome dialog_matches_frag.xml. Este design será utilizado para uma caixa de diálogo contendo opções de texto que podem corresponder ao que foi dito ao app. O código do design está escrito abaixo. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </LinearLayout> Passo 3: Com o design pronto, vamos à nossa classe MainActivity criar a conexão com as telas e com o servidor. A primeira mudança é que MainActivity agora estende Activity e não ActionBarActivity. Não se esqueça de fazer os imports necessários.
Passo 4: Adicione as seguintes variáveis à classe MainActivity. Elas servirão para interagir com a interface do usuário. Não se esqueça de realizar todos os imports sugeridos pelo Eclipse. Passo 5: Antes de alterar os métodos oncreate, oncreateoptionsmenu e onoptionsitemselected, criados automaticamente pelo Eclipse, vamos criar um método isconnected do tipo boolean. Esse método verificará se o sistema está conectado na internet, necessária para o funcionamento do reconhecimento de voz. Aproveite para realizar todos os imports sugeridos pelo Eclipse. A próxima imagem demonstra o que deve ser colocado na classe: Passo 6: Agora vamos trabalhar nos métodos com anotações criados automaticamente pelo Eclipse. O primeiro deles é o método oncreate do tipo void. Aqui vamos trabalhar com o layout, adicione as duas linhas de código abaixo: Start = (Button)findViewById(R.id.start_reg); Speech = (TextView)findViewById(R.id.speech); Em seguida será necessário criar uma forma de reconhecer que o botão foi pressionado e executar uma ação, adicione o código abaixo no método oncreate para tal. O método todo deverá ficar assim ao final:
Passo 7: Por fim precisaremos dos nossos resultados, para isso criaremos um método chamado onactivityresult. O código desse método está abaixo: Passo 8: O último passo é pedir permissão para que possamos acessar a internet. Para isso procure o arquivo AndroidManifest.xml dentro da pasta res. Abra o arquivo e adicione as seguintes linhas abaixo na posição indicada na imagem: <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="android.permission.access_network_state" />
Passo 9: Agora você deve rodar o código utilizando um dispositivo Android ou emulador. O resultado é demonstrado na tela a seguir. O código completo da classe MainActivity está logo abaixo. package com.ufpimaps.androidspeechrecognition;
import java.util.arraylist; import android.net.connectivitymanager; import android.net.networkinfo; import android.os.bundle; import android.app.activity; import android.app.dialog; import android.content.context; import android.content.intent; import android.speech.recognizerintent; import android.view.view; import android.view.view.onclicklistener; import android.widget.adapterview; import android.widget.arrayadapter; import android.widget.button; import android.widget.listview; import android.widget.textview; import android.widget.toast; public class MainActivity extends Activity { private static final int REQUEST_CODE = 1234; Button Start; TextView Speech; Dialog match_text_dialog; ListView textlist; ArrayList<String> matches_text; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); Start = (Button)findViewById(R.id.start_reg); Speech = (TextView)findViewById(R.id.speech); Start.setOnClickListener(new OnClickListener() { public void onclick(view v) { if(isconnected()){ Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putextra(recognizerintent.extra_language_model, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); startactivityforresult(intent, REQUEST_CODE); else{ Toast.makeText(getApplicationContext(), "Plese Connect to Internet", Toast.LENGTH_LONG).show(); ); public boolean isconnected() {
ConnectivityManager cm = (ConnectivityManager) getsystemservice(context.connectivity_service); NetworkInfo net = cm.getactivenetworkinfo(); if (net!=null && net.isavailable() && net.isconnected()) { return true; else { return false; protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == REQUEST_CODE && resultcode == RESULT_OK) { match_text_dialog = new Dialog(MainActivity.this); match_text_dialog.setcontentview(r.layout.dialog_matches_frag); match_text_dialog.settitle("select Matching Text"); textlist = (ListView)match_text_dialog.findViewById(R.id.list); matches_text = data.getstringarraylistextra(recognizerintent.extra_results); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.r.layout.simple_list_item_1, matches_text); textlist.setadapter(adapter); textlist.setonitemclicklistener(new AdapterView.OnItemClickListener() { public void onitemclick(adapterview<?> parent, View view, int position, long id) { Speech.setText("You have said " +matches_text.get(position)); match_text_dialog.hide(); ); match_text_dialog.show(); super.onactivityresult(requestcode, resultcode, data);