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:
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.
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
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?
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
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?
Oi Mychelle,
Isso mesmo. Com essa lista você faz o que você quiser.
4br4ç05,
nglauber
Entendi, muito obrigada.
oque vem a ser o MEU_REQUEST_CODE?
estou aprendendo a programar em android e tive dificuldade em identificar o nome acima.
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
Ótima explicação. Me ajudou muito.
Obrigada.
Postar um comentário