
Un Fragment para agregar control de voz a través de Spokestack a cualquier aplicación de Android. Puede encontrar una aplicación de demostración simple que muestre la bandeja en acción en el directorio example .
Cuando agrega el fragmento de bandeja de bandeja de Spokestack a su diseño, obtendrá un botón de micrófono en forma de una pestaña en el costado de la pantalla ( en qué lado está depende de usted; más sobre eso más adelante). Tocar o arrastrar la pestaña revela el resto de la bandeja, que está dispuesto como una transmisión de mensajes en una aplicación de chat. La apertura de la bandeja activa el micrófono, y cualquier cosa que el usuario dice se enviará a través de un servicio automático de reconocimiento de voz (ASR) y se mostrará como texto. Ese texto se envía a un modelo de comprensión del lenguaje natural (NLU) para la clasificación. Los resultados de la clasificación se envían al componente de la aplicación que ha establecido para escuchar eventos de la bandeja, lo que puede producir una respuesta que la bandeja se mostrará y leerá al usuario a través del servicio de síntesis de texto a voz de Spokestack (TTS). El micrófono se reajustará si la respuesta de la aplicación lo dirige; De lo contrario, la bandeja cerrará y deshabilitará ASR.
¡Y así, has agregado voz a tu aplicación!

Ah, y después de esa interacción inicial, la bandeja se puede abrir con una palabra de vigilia en lugar de un toque. La palabra de vigilia es "Spokestack" de forma predeterminada, pero eso se puede personalizar.
Si algo de eso no tenía sentido, ¡no temas! Siga leyendo y cubriremos todos los detalles a continuación.
Nota : La bandeja de Spokestack solía estar alojada en JCenter, pero desde el anuncio de su interrupción, hemos trasladado la distribución a Maven Central. Asegúrese de que su archivo build.gradle a nivel raíz incluya mavenCentral() en su bloque repositories para acceder a las versiones> = 0.4.1.
Asegúrese de usar la versión 0.4.2 o superior para resolver correctamente la dependencia de la biblioteca de Spokestack de núcleo después de que JCenter se vuelve inaccesible.
De manera predeterminada, la bandeja de Spokestack maneja ASR, NLU y TTS para interacciones de voz con los usuarios, que está convirtiendo su voz en texto, procesando ese texto para producir una acción y sintetizar la respuesta de la aplicación para que se lea al usuario. Para obtener más información sobre estas características, consulte los documentos de Spokestack.
Para usar NLU y TTS, necesitará una cuenta de Spokestack gratuita. Desde la página de su cuenta, podrá crear y descargar modelos NLU; y la identificación del cliente y la clave secreta son necesarias en tiempo de ejecución para las solicitudes TTS.
Primero, sin embargo, agregue la dependencia a build.gradle de su aplicación.
implementation ' io.spokestack:tray:0.4.1 ' Como se mencionó anteriormente, la bandeja de Spokestack se implementa como un Fragment que representa su Activity existente y maneja la interacción de voz, por lo que querrá agregarlo al diseño de su actividad:
<!-- nested in the main layout, after other views/sublayouts -->
< include
android : id = " @+id/tray_fragment "
layout = " @layout/spokestack_tray_fragment "
/> Nota : Dependiendo del diseño de su aplicación, es posible que también deba agregar android:clipChildren="false" al diseño principal del fragmento para evitar que la pestaña del micrófono desaparezca a medida que se abre la bandeja.
Luego haga que su actividad misma extienda TrayActivity (una subclase de AppCompatActivity ), implementa los métodos que requiere y la biblioteca se encargará del resto.
Si prefiere hacer la configuración usted mismo, aquí hay una muestra que no usa TrayActivity :
import io.spokestack.tray.*
class MyActivity : AppCompatActivity (), SpokestackTrayListener {
lateinit var tray : SpokestackTray
// ...
override fun onCreate ( savedInstanceState : Bundle ? ) {
val config = TrayConfig . Builder ()
// credentials from your Spokestack account
.credentials( " spokestack-client-id " , " spokestack-secret-key " )
.wakewordModelURL( " https://path-to-wakeword-models " )
.nluURL( " https://path-to-nlu-files " )
// note the implementation of `SpokestackTrayListener` in the class declaration
.withListener( this )
// optional builder customization; see the documentation for more details...
.build()
supportFragmentManager.fragmentFactory = SpokestackTrayFactory (config)
// note that the factory is instantiated and set on the manager BEFORE calling
// `super.onCreate()`
super .onCreate(savedInstanceState)
}
override fun onStart () {
// set the value of the lateinit `tray` var
tray = SpokestackTray .getInstance(config)
super .onStart()
} Cuando descargue los modelos Spokestack Wake Wake o NLU, tendrá varias URL a diferentes archivos. wakewordModelURL y nluURL arriba solo requieren la ruta al directorio relevante, no en URL de archivo completo. Entonces, para la Palabra de WakeMo de Demo "Spokestack", establezca wakewordModelURL en "https://d3dmqd7cy685il.cloudfront.net/model/wake/spokestack/".
La bandeja está diseñada para un uso sin problemas en las actividades, por ejemplo, para permitir que un usuario continúe dando un comando de voz mientras la aplicación cambia de actividades, por lo que su estado se almacena fuera del fragmento en sí y sobrevive a la destrucción del fragmento. Si su aplicación necesita liberar recursos en poder de la bandeja y su instancia subyacente Spokestack , llame al método stop() de la bandeja. Si entonces necesita volver a habilitar el control de voz antes de que se destruya la instancia de fragmento de bandeja actual, debe llamar start() .
Si desea mantener el estado de la bandeja intacto después del proceso de muerte del proceso, puede almacenarlo en los métodos onSaveInstanceState y onRestoreInstanceState de su actividad principal utilizando los métodos getState() y loadState() de la bandeja; Vea su documentación para más detalles.
Lo más probable es que si está permitiendo que el usuario hable con su aplicación, desea que la aplicación responda. La bandeja está integrada con el servicio TTS de Spokestack, por lo que sintetizar audio es tan fácil como transcribirlo.
Cuando extiende TrayActivity , uno de los métodos que tendrá que implementar es getTrayListener() , que crea y devuelve un SpokestackTrayListener . Esta interfaz ayuda a su aplicación al reaccionar a los eventos recibidos y producidos por la bandeja. Debido a que cada caso de uso es único, todos sus métodos son opcionales; El que nos interesa aquí es onClassification . Este método se llama después de que el discurso de un usuario haya sido transcrito por ASR y clasificado por NLU. Suminifica su aplicación con el resultado de la NLU y le pide que devuelva una respuesta:
override fun onClassification ( result : NLUResult ): VoicePrompt {
return if (result.intent == " your-special-intent " ) {
VoicePrompt ( " I hear you loud and clear " )
} else {
VoicePrompt (
" Sorry; I didn't catch that " ,
expectFollowup = true )
}
} El segundo parámetro opcional en el constructor VoicePrompt le informa a la bandeja si espera una respuesta: si lo es, reanudará la escucha activa después de que se reproduce su mensaje para que el usuario no tenga que usar la palabra de wetak o un botón para cada interacción.
La muestra anterior lo pondrá en marcha con un mínimo alboroto, pero está lejos de todas las ofertas de la bandeja de Spokestack. Cuando está construyendo una instancia TrayConfig , puede optar por configurar y proporcionar el Spokestack Builder subyacente en sí. Esto le permitirá hacer cosas como el cambio de proveedores ASR, configurar oyentes personalizados para eventos de sistemas individuales y agregar componentes de procesamiento de voz personalizados si es necesario. Puedes leer sobre el constructor de Spokestack aquí.
También hay una gama de opciones aplicables a la bandeja en sí, accesibles a través de métodos auxiliares en la instancia TrayConfig.Builder . Sin embargo, describir cada uno aquí haría este readme ... pesado, así que consulte la documentación para obtener más detalles. La documentación en TrayConfig.Builder es [aquí] (https://spokestack.github.io/spokestack-tay--loid/spokestack-tray/io.spokestack.tray/-tray-config/-builder*.
La mayoría de los aspectos de la interfaz de usuario de la bandeja se pueden personalizar. A menudo, esto se logra en XML al anular los valores establecidos en la biblioteca.
Una excepción a esto es la orientación de la bandeja: su botón de micrófono predeterminado aparece como una pestaña dirigida a la derecha en el lado izquierdo de la pantalla, con la bandeja, en consecuencia, deslizándose desde la izquierda. También admite una orientación directa, pero requiere dos cambios para hacerlo:
.orientation(TrayConfig.Orientation.RIGHT) en el constructor TrayConfig antes de construir la configuración.< include
layout = " @layout/spokestack_tray_fragment "
android : layout_width = " wrap_content "
android : layout_height = " wrap_content "
app : layout_constraintBottom_toBottomOf = " parent "
app : layout_constraintEnd_toEndOf = " parent " /> Solo necesitamos la última restricción aquí; El resto de los atributos son idénticos al diseño de la fuente. Sin embargo, ya que estamos utilizando include , anular un atributo significa anularlos a todos; Vea la nota al final del párrafo aquí.
Las personalizaciones de UI basadas en el valor se enumeran a continuación. Los nombres de archivo aquí apuntan a las definiciones originales en la carpeta res/values de la biblioteca, pero los reemplazos se pueden definir en otra parte de su proyecto. La aplicación de ejemplo ilustra esto al anular el color de texto para los mensajes del sistema en res/values/custom_colors.xml .
colors.xmlspsk_colorTrayBg : El color de fondo utilizado para la secuencia de mensajes de la bandeja.spsk_colorIcon : el color de primer plano utilizado para iconos que necesitan contrastar con spsk_colorBrand . El valor predeterminado a White.spsk_colorDragHandle : el color utilizado para el mango de arrastre de cambio de tamaño de la bandeja.spsk_colorBrand : El color principal de los elementos de la interfaz de usuario, como el botón de micrófono y los iconos sin fondo.spsk_colorListenText : el color utilizado para el texto en la burbuja de "escuchar".spsk_colorSystemText : el color utilizado para el texto en las burbujas de mensajes del sistema.spsk_colorUserText : el color utilizado para el texto en las burbujas de mensajes de usuario.spsk_colorSystemBg : El color de fondo utilizado para las burbujas de mensajes del sistema.spsk_colorUserBg : El color de fondo utilizado para las burbujas de mensajes de usuario.spsk_colorGradientOne : el color de inicio utilizado para la animación de gradiente de escucha. El valor predeterminado es spsk_colorBrand .spsk_colorGradientEnd : el color final utilizado para la animación de gradiente de escucha.spsk_colorTransparent : color transparente utilizado como tinte de fondo para la flecha "Atrás" en la bandeja.dimens.xmlspsk_micTabWidth : Ancho para el botón de la pestaña Micrófono. El valor predeterminado es 60dp .spsk_micTabHeight : Altura para el botón de la pestaña Micrófono. El valor predeterminado a 80dp y debe mantenerse en una relación 4: 3 con spsk_micTabWidth .spsk_listenBubbleWidth : ancho para la burbuja de escucha que aparece durante ASR. El valor predeterminado a 120dp y debe mantenerse en una relación 2: 1 con spsk_listenBubbleHeight .spsk_listenBubbleHeight : altura para la burbuja de escucha que aparece durante ASR. El valor predeterminado es 60dp .spsk_messageStreamHeight : Altura inicial para la secuencia de mensajes dentro de la bandeja. El valor predeterminado es 100dp .spsk_messageStreamMinHeight : altura mínima a la que la bandeja puede cambiar el tamaño de la resistencia. El valor predeterminado es a 80dp .ints.xmlspsk_trayAnimateMs : la cantidad de tiempo, en milisegundos, la bandeja se necesita para abrir o cerrar. El valor predeterminado a 500 .strings.xmlspsk_listening : el texto que se muestra en la bandeja durante la escucha activa (ASR). El valor predeterminado es "LISTENING" .styles.xmlspsk_messageFont : la familia de fuentes utilizada para mostrar transcripciones ASR y mensajes del sistema en la bandeja. El valor predeterminado a sans-serif (Roboto). Copyright 2020 Spokestack, Inc.
Licenciado bajo la licencia Apache, versión 2.0 (la "licencia"); No puede usar este archivo, excepto de conformidad con la licencia. Puede obtener una copia de la licencia en
http://www.apache.org/licenses/LICENSE-2.0
A menos que la ley aplicable sea requerida o acordado por escrito, el software distribuido bajo la licencia se distribuye de manera "como es", sin garantías o condiciones de ningún tipo, ya sea expresas o implícitas. Consulte la licencia para los permisos y limitaciones de rigor de idioma específico bajo la licencia.