Cómo agregar funciones de voz

Las acciones de voz son una parte importante de la experiencia con dispositivos wearable. Estas permiten a los usuarios realizar acciones de manera rápida y en modo de manos libres. Wear OS by Google proporciona dos tipos de acciones de voz:

Proporcionadas por el sistema
Estas acciones de voz se basan en tareas y están incorporadas en la plataforma de Wear. Puedes filtrarlas en la actividad que quieras iniciar cuando la acción de voz se dice en voz alta. Por ejemplo, "Crear una nota" o "Establecer un alarma".
Proporcionadas por la app
Estas acciones de voz se basan en la app y puedes declararlas de la misma manera que un ícono de selector. Los usuarios dicen "Iniciar Nombre de tu app" para usar estas acciones de voz y se inicia la actividad que especifiques.

Cómo declarar acciones de voz proporcionadas por el sistema

La plataforma de Wear OS proporciona varios intents de voz que se basan en acciones del usuario como "Crear una nota" o "Establecer una alarma". De esta manera, los usuarios pueden decir lo que quieren hacer y dejar que el sistema decida qué actividad iniciar.

Cuando los usuarios solicitan las acciones, tu app puede filtrar por el intent que se activa al iniciar una actividad. Si quieres iniciar un servicio para que realice una acción en segundo plano, muestra una actividad (como una indicación visual) y, luego, inicia el servicio en la actividad. Asegúrate de llamar a finish() cuando quieras descartar la indicación visual.

Por ejemplo, en el caso del comando "Crear una nota", debes declarar este filtro de intent para iniciar una actividad llamada 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>
    

A continuación, se muestra una lista de intents de voz que admite la plataforma de Wear:

Nombre Frases de ejemplo Intent
Pedir un auto/taxi "Ok Google, pídeme un taxi"

"Ok Google, pídeme un auto"
Acción
com.google.android.gms.actions.RESERVE_TAXI_RESERVATION
Tomar nota "Ok Google, crea una nota"

"Ok Google, recordatorio"
Acción
android.intent.action.SEND
Categoría
com.google.android.voicesearch.SELF_NOTE
Extras
android.content.Intent.EXTRA_TEXT (una string con cuerpo de nota)
Establecer alarmas "Ok Google, establece una alarma a las 8 a.m."

"Ok Google, despiértame mañana a las 6"
Acción
android.intent.action.SET_ALARM
Extras
android.provider.AlarmClock.EXTRA_HOUR (un número entero con la hora de la alarma)

android.provider.AlarmClock.EXTRA_MINUTES (un número entero con el minuto de la alarma)

(estos 2 extras son opcionales; puede proporcionarse uno o ninguno)

Establecer temporizador "Ok Google, establece un temporizador de 10 minutos"
Acción
android.intent.action.SET_TIMER
Extras
android.provider.AlarmClock.EXTRA_LENGTH (número entero entre 1 y 86,400, la cantidad de segundos en 24 horas, que representa la duración del temporizador)
Iniciar cronómetro "Ok Google, inicia el cronómetro"
Acción
com.google.android.wearable.action.STOPWATCH
Iniciar/finalizar un paseo en bicicleta "Ok Google, empezaré a pedalear"

"Ok Google, iniciaré mi paseo en bicicleta"

"Ok Google, dejaré de pedalear"
Acción
vnd.google.fitness.TRACK
Tipo de MIME
vnd.google.fitness.activity/biking
Extras
actionStatus (una string con el valor ActiveActionStatus cuando se inicia y CompletedActionStatus cuando se detiene)
Comenzar/dejar de correr "Ok Google, haz un seguimiento de mi carrera"

"Ok Google, empezaré a correr"

"Ok Google, dejaré de correr"
Acción
vnd.google.fitness.TRACK
Tipo de MIME
vnd.google.fitness.activity/running
Extras
actionStatus (una string con el valor ActiveActionStatus cuando se inicia y CompletedActionStatus cuando se detiene)
Iniciar/detener un entrenamiento "Ok Google, iniciar entrenamiento"

"Ok Google, haz un seguimiento de mi entrenamiento"

"Ok Google, detener el entrenamiento"
Acción
vnd.google.fitness.TRACK
Tipo de MIME
vnd.google.fitness.activity/other
Extras
actionStatus (una string con el valor ActiveActionStatus cuando se inicia y CompletedActionStatus cuando se detiene)
Mostrar frecuencia cardíaca "Ok Google, ¿cuál es mi frecuencia cardíaca?"

"Ok Google, ¿cuáles son mis ppm?"
Acción
vnd.google.fitness.VIEW
Tipo de MIME
vnd.google.fitness.data_type/com.google.heart_rate.bpm
Mostrar recuento de pasos "Ok Google, ¿cuántos pasos di?"

"Ok Google, ¿cuál es mi recuento de pasos?"
Acción
vnd.google.fitness.VIEW
Tipo de MIME
vnd.google.fitness.data_type/com.google.step_count.cumulative

Puedes consultar la documentación sobre cómo registrarse para recibir los intents de plataforma y acceder a la información de los extras que hay en ellos en el artículo sobre Intents comunes.

Cómo declarar acciones de voz proporcionadas por la app

Si ninguno de los intents de voz de la plataforma te resulta útil, puedes iniciar tus apps directamente con la acción de voz "Iniciar NombreDeMiActividad".

Si quieres registrarte para una acción de "Iniciar", el procedimiento es el mismo que para un ícono de selector en un dispositivo portátil. En lugar de solicitar el ícono de una app en un selector, tu app solicitará una acción de voz.

Para especificar el texto que quieres decir luego de "Iniciar", establece el atributo label para la actividad que quieras iniciar. Por ejemplo, este filtro de intent reconoce la acción de voz "Iniciar NombreDeMiActividad" y, luego, inicia 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>
    

Cómo obtener una entrada de voz de formato libre

Además de usar las acciones de voz para iniciar actividades, también puedes llamar a la actividad de reconocimiento de voz incorporada del sistema a fin de obtener la entrada de voz de los usuarios. De esta manera, puedes obtener entradas de los usuarios y procesarlas, como realizar una búsqueda o enviarlas por mensaje.

En tu app, puedes llamas a startActivityForResult() por medio de la acción ACTION_RECOGNIZE_SPEECH. De esta manera, se inicia la actividad de reconocimiento de voz y puedes administrar el resultado en 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);
    }
    

Además, puedes consultar los siguientes recursos relacionados: