Adicionar recursos de voz

Ações por voz são uma parte importante da experiência com wearables. Elas permitem que os usuários realizem ações rapidamente e com as mãos livres. O Wear OS by Google oferece dois tipos de ações por voz.

Fornecidas pelo sistema
Essas ações por voz são baseadas em tarefas e integradas na plataforma do Wear. Você as filtra na atividade que quiser iniciar quando a ação por voz for falada. Os exemplos incluem "Criar uma nota" e "Definir alarme".
Fornecidas pelo app
Essas ações por voz são baseadas em um app e são declaradas como um ícone na tela de início. Os usuários dizem "Iniciar nome do app" para usar essas ações por voz e a atividade que especificada será iniciada.

Declarar ações por voz fornecidas pelo sistema

A plataforma Wear OS oferece vários intents de voz baseados em ações de usuários, como "Criar uma nota" e "Definir alarme". Isso permite que usuários digam se eles querem fazer isso e que o sistema descubra a melhor atividade para ser iniciada.

Quando os usuários falam a ação por voz, seu app pode filtrar o intent acionado para iniciar uma atividade. Se você quiser iniciar um serviço para fazer algo em segundo plano, mostre uma atividade como uma sugestão visual e inicie o serviço na atividade. Chame finish() quando quiser se livrar da sugestão visual.

Por exemplo, para o comando "Criar uma nota", declare esse filtro de intent para iniciar uma atividade chamada MyNoteActivity:

      <activity android:name="MyNoteActivity">
          <intent-filter>
              <action android:name="android.intent.action.SEND" />
              <category android:name="com.google.android.voicesearch.SELF_NOTE" />
          </intent-filter>
      </activity>
    

Esta é uma lista de intents de voz compatíveis com a plataforma Wear:

Nome Exemplos de frases Intent
Chamar um táxi "Ok Google, chamar um táxi"

"Ok Google, chamar um táxi para mim"
Ação
com.google.android.gms.actions.RESERVE_TAXI_RESERVATION
Criar uma nota "Ok Google, crie uma nota"

"Ok Google, crie uma nota para mim"
Ação
android.intent.action.SEND
Categoria
com.google.android.voicesearch.SELF_NOTE
Extras
android.content.Intent.EXTRA_TEXT: uma string com o corpo da nota
Definir um alarme "Ok Google, definir um alarme para 8h"

"Ok Google, me acorde às 6h amanhã"
Ação
android.intent.action.SET_ALARM
Extras
android.provider.AlarmClock.EXTRA_HOUR: um número inteiro com a hora do alarme.

android.provider.AlarmClock.EXTRA_MINUTES: um número inteiro com o minuto do alarme

Esses dois extras são opcionais, é possível fornecer ambos ou nenhum deles.

Definir timer "Ok Google, definir timer para 10 minutos"
Ação
android.intent.action.SET_TIMER
Extras
android.provider.AlarmClock.EXTRA_LENGTH: um número inteiro no intervalo de 1 a 86400 (número de segundos em 24 horas) que representa a duração do timer
Iniciar cronômetro "Ok Google, iniciar cronômetro"
Ação
com.google.android.wearable.action.STOPWATCH
Começar/parar um passeio de bicicleta "Ok Google, começar a pedalar"

"Ok Google, começar meu passeio de bicicleta"

"Ok Google, parar de pedalar"
Ação
vnd.google.fitness.TRACK
Tipo Mime
vnd.google.fitness.activity/biking
Extras
actionStatus: uma string com o valor ActiveActionStatus ao iniciar e CompletedActionStatus ao parar.
Começar/parar uma corrida "Ok Google, acompanhar minha corrida"

"Ok Google, começar a corrida"

"Ok Google, parar de correr"
Ação
vnd.google.fitness.TRACK
Tipo Mime
vnd.google.fitness.activity/running
Extras
actionStatus: uma string com o valor ActiveActionStatus ao iniciar e CompletedActionStatus ao parar
Começar/parar um treino "Ok Google, começar um treino"

"Ok Google, acompanhar meu treino"

"Ok Google, parar o treino"
Ação
vnd.google.fitness.TRACK
Tipo Mime
vnd.google.fitness.activity/other
Extras
actionStatus: uma string com o valor ActiveActionStatus ao iniciar e CompletedActionStatus ao parar
Mostrar frequência cardíaca "Ok Google, qual é a minha frequência cardíaca?"

"Ok Google, qual é o meu bpm?"
Ação
vnd.google.fitness.VIEW
Tipo Mime
vnd.google.fitness.data_type/com.google.heart_rate.bpm
Mostrar contador de passos "Ok Google, quantos passos eu dei?"

"Ok Google, qual é minha contagem de passos?"
Ação
vnd.google.fitness.VIEW
Tipo MIME
vnd.google.fitness.data_type/com.google.step_count.cumulative

Para ver a documentação sobre registros de intents da plataforma e acesso às informações extras contidas nesses registros, consulte Intents comuns.

Declarar ações por voz fornecidas por app

Se nenhum dos intents de voz da plataforma funcionar com você, inicie seus apps diretamente com uma ação por voz "Abrir MyActivityName".

Registrar uma ação "Abrir" é o mesmo que registrar um ícone na tela de início em um dispositivo portátil. Em vez de solicitar um ícone de app em uma tela de início, seu app solicitará uma ação por voz.

Para especificar o texto a ser falado depois de "Iniciar", especifique um atributo label para a atividade que você quer iniciar. Por exemplo, este filtro de intent reconhece a ação de voz "Iniciar MyRunningApp" e abre StartRunActivity.

    <application>
      <activity android:name="StartRunActivity" android:label="MyRunningApp">
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
    </application>
    

Captar uma entrada de fala livre

Além de usar ações por voz para iniciar atividades, você também pode chamar a atividade do Reconhecedor de fala do sistema para captar a entrada de fala dos usuários. Isso é útil para captar entradas dos usuários e processá-las, como em uma pesquisa ou ao enviá-las como mensagem.

No app, chame startActivityForResult() usando a ação ACTION_RECOGNIZE_SPEECH. Isso inicia a atividade de reconhecimento de fala e você pode processar o resultado em onActivityResult().

Kotlin

    private const val SPEECH_REQUEST_CODE = 0
    ...
    // Create an intent that can start the Speech Recognizer activity
    private fun displaySpeechRecognizer() {
        val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
            putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
        }
        // Start the activity, the intent will be populated with the speech text
        startActivityForResult(intent, SPEECH_REQUEST_CODE)
    }

    // This callback is invoked when the Speech Recognizer returns.
    // This is where you process the intent and extract the speech text from the intent.
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
        if (requestCode == SPEECH_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
            val spokenText: String? =
                    data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS).let { results ->
                        results[0]
                    }
            // Do something with spokenText
        }
        super.onActivityResult(requestCode, resultCode, data)
    }
    

Java

    private static final int SPEECH_REQUEST_CODE = 0;

    // Create an intent that can start the Speech Recognizer activity
    private void displaySpeechRecognizer() {
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    // Start the activity, the intent will be populated with the speech text
        startActivityForResult(intent, SPEECH_REQUEST_CODE);
    }

    // This callback is invoked when the Speech Recognizer returns.
    // This is where you process the intent and extract the speech text from the intent.
    @Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent data) {
        if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) {
            List<String> results = data.getStringArrayListExtra(
                    RecognizerIntent.EXTRA_RESULTS);
            String spokenText = results.get(0);
            // Do something with spokenText
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
    

Confira também os seguintes recursos relacionados: