quarta-feira, 25 de maio de 2011

Android: Reconhecimento de voz

Olá povo,

Estou corrigindo os trabalhos do pessoal do TECDAM e uma funcionalidade simples do Android que foi utilizada pelo aluno Leonardo Melo me chamou a atenção: o reconhecimento de voz. Essa API foi introduzida na versão 2.1 do Android, e apesar de simples, ela é pouco explorada (por mim inclusive). Para utiliza-la basta é bem simples. Basta chamar a atividade que iniciará o reconhecimento do que será falado, e em seguida obter lista dos textos que foram reconhecidos através do retorno dessa atividade.

Antes de iniciar, precisamos checar se o aparelho suporta essa funcionalidade. Podemos fazer isso através do código abaixo:


PackageManager pm = getPackageManager();
Intent it = new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH)

List<ResolveInfo> activities =
pm.queryIntentActivities(it, 0);

if (activities.size() != 0) {
// Aparelho suporta Reconhecimento de Voz
} else {
// Aparelho NÃO suporta Reconhecimento de Voz
}

Com o PackageManager podemos obter uma lista de informações sobre Activities baseado em uma Intent. O método queryIntentActivities retorna a lista de atividades que respondem por uma determinada ação. No nosso caso, procuramos pela ação ACTION_RECOGNIZE_SPEECH, se alguma Activity responder por essa ação, é porque o aparelho tem suporte ao reconhecimento de voz.

Para iniciar o reconhecimento de voz, basta usar o código abaixo:


Intent intent = new Intent(
RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
"Fala alguma coisa!");

startActivityForResult(intent, MEU_REQUEST_CODE);


Isso resultará na imagem abaixo:



Após capturar a voz, ele fará o reconhecimento e enviará os resultados como resultado da Activity. Para tratar o resultado, usamos o método onActivityResult da atividade que chamou o reconhecimento de voz, conforme abaixo:


protected void onActivityResult(
int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (requestCode == MEU_REQUEST_CODE
&& resultCode == RESULT_OK) {

// Contém a lista com os resultados
ArrayList<String> matches =
data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
}
}


Mais informações aqui.

4br4ç0s,
nglauber

10 comentários:

Anônimo disse...

Olá ngrauber, realmente muito boa a sua dica sobre reconhecimento de voz - parabéns.

Eu gostaria de saber como eu faria para fazer uma persistência para reconhecimento de voz, isto é, eu gostaria de saber como faço para meu aplicativo armazenar a voz capturada para reconhecer certos comandos quando for falada determinada palavra.

Nelson Glauber de Vasconcelos Leal disse...

Olá anônimo,

Neste caso, você terá que usar a classe MediaRecorder, para poder salvar a voz gravada em arquivo (ou no banco se desejar).

http://developer.android.com/reference/android/media/MediaRecorder.html

4br4ç05,
nglauber

Mychelle disse...

Olá Glauber, parabéns, muito bem explicado, gostaria de saber como faço para guardar a voz em uma variável string. É através do método getStringArrayListExtra?

Nelson Glauber de Vasconcelos Leal disse...

Oi Mychelle,

A Activity de reconhecimento de voz retorna uma lista de palavras que a API reconheceu. No exemplo acima, essa lista é a variável matches no método onActivityResult.
Você pode inclusive limitar a quantidade de resultados nessa lista. Basta passar o EXTRA_MAX_RESULTS com a quantidade desejada.
Ex.: intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 20);

4br4ç05,
nglauber

Mychelle disse...

Olá Glauber, obrigada pela resposta, então eu posso ter acesso a cada palavra reconhecida pelo android através da variável matches? E depois posso tratar esse resultado da forma como eu quiser, como por exemplo, exibir as palavras reconhecidas em uma tela?

Nelson Glauber de Vasconcelos Leal disse...

Oi Mychelle,

Isso mesmo. Com essa lista você faz o que você quiser.

4br4ç05,
nglauber

Mychelle disse...

Entendi, muito obrigada.

Anônimo disse...

oque vem a ser o MEU_REQUEST_CODE?
estou aprendendo a programar em android e tive dificuldade em identificar o nome acima.

Nelson Glauber de Vasconcelos Leal disse...

Oi Anônimo,

MEU_REQUEST_CODE é uma constante do tipo int. O uso de constantes é uma boa prática de desenvolvimento para facilitar a leitura do código fonte.
Ao invés de usar 0, 1, 2... usamos uma constante:
private static final int MEU_REQUEST_CODE = 0.

4br4ç05,
nglauber

Anônimo disse...

Ótima explicação. Me ajudou muito.

Obrigada.