
Spokestack es una solución todo en uno para interfaces de voz móvil en Android. Proporciona cada pieza del rompecabezas de procesamiento del habla, incluida la detección de actividades de voz, la detección de la palabra de vigilia, el reconocimiento de voz, la comprensión del lenguaje natural (NLU) y la síntesis del habla (TTS). Según su configuración predeterminada (en los nuevos dispositivos Android), todo excepto TTS ocurre directamente en el dispositivo móvil, ninguna comunicación con la nube significa resultados más rápidos y una mejor privacidad.
¡Y Android no es la única plataforma que admite!
Crear una cuenta gratuita en Spokestack.io le permite capacitar a sus propios modelos NLU y probar TTS sin agregar código a su aplicación. Incluso podemos capacitar a una palabra de vigilia personalizada y una voz TTS para usted, asegurando que la voz de su aplicación sea única y memorable.
Para una breve introducción, siga leyendo, pero para guías más detalladas, consulte lo siguiente:
Nota : Spokestack solía ser alojado 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> = 11.0.2.
La versión mínima de Android SDK enumerada en el manifiesto de Spokestack es 8 porque eso es todo lo que debes ejecutar la detección de palabras de Wake Word y el reconocimiento de voz. Para usar otras funciones, es mejor apuntar al menos el nivel API 21.
Si incluye exoplayer para la reproducción de TTS (ver más abajo), es posible que tenga problemas para ejecutar versiones de Android más antiguo que la API Nivel 24. Si se encuentra con este problema, intente agregar la siguiente línea a su archivo gradle.properties :
android.enableDexingArtifactTransform=false
Agregue lo siguiente a build.gradle de su aplicación.
android {
// ...
compileOptions {
sourceCompatibility JavaVersion . VERSION_1_8
targetCompatibility JavaVersion . VERSION_1_8
}
}
// ...
dependencies {
// ...
// make sure to check the badge above or "releases" on the right for the
// latest version!
implementation ' io.spokestack:spokestack-android:11.5.2 '
// for TensorFlow Lite-powered wakeword detection and/or NLU, add this one too
implementation ' org.tensorflow:tensorflow-lite:2.6.0 '
// for automatic playback of TTS audio
implementation ' androidx.media:media:1.3.0 '
implementation ' com.google.android.exoplayer:exoplayer-core:2.14.0 '
// if you plan to use Google ASR, include these
implementation ' com.google.cloud:google-cloud-speech:1.22.2 '
implementation ' io.grpc:grpc-okhttp:1.28.0 '
// if you plan to use Azure Speech Service, include these, and
// note that you'll also need to add the following to your top-level
// build.gradle's `repositories` block:
// maven { url 'https://csspeechstorage.blob.core.windows.net/maven/' }
implementation ' com.microsoft.cognitiveservices.speech:client-sdk:1.9.0 '
}Consulte la guía QuickStart para obtener más información, pero aquí está la versión de 30 segundos de la configuración:
RECORD_AUDIO en tiempo de ejecución. Vea nuestro proyecto Skeleton para obtener un ejemplo de esto. También se requiere el permiso INTERNET , pero está incluido por el manifiesto de la biblioteca de forma predeterminada.Activity si recién está comenzando: private lateinit var spokestack : Spokestack
// ...
spokestack = Spokestack . Builder ()
.setProperty( " wake-detect-path " , " $cacheDir /detect.tflite " )
.setProperty( " wake-encode-path " , " $cacheDir /encode.tflite " )
.setProperty( " wake-filter-path " , " $cacheDir /filter.tflite " )
.setProperty( " nlu-model-path " , " $cacheDir /nlu.tflite " )
.setProperty( " nlu-metadata-path " , " $cacheDir /metadata.json " )
.setProperty( " wordpiece-vocab-path " , " $cacheDir /vocab.txt " )
.setProperty( " spokestack-id " , " your-client-id " )
.setProperty( " spokestack-secret " , " your-secret-key " )
// `applicationContext` is available inside all `Activity`s
.withAndroidContext(applicationContext)
// see below; `listener` here inherits from `SpokestackAdapter`
.addListener(listener)
.build()
// ...
// starting the pipeline makes Spokestack listen for the wakeword
spokestack.start()Este ejemplo asume que está almacenando modelos Wake Wake y NLU en el directorio de caché de su aplicación; Nuevamente, vea el proyecto Skeleton para un ejemplo de descomprimir estos archivos del paquete de activos en este directorio.
Para usar la Palabra de Demo "Spokestack", descargue los modelos TensorFlow Lite: Detect | codificar | filtrar
Si aún no desea molestarse con eso, simplemente deshabilite la detección de la palabra de wake y la NLU, y puede dejar de lado todas las rutas de archivo anteriores:
spokestack = Spokestack . Builder ()
.withoutWakeword()
.withoutNlu()
// ...
.build() En este caso, aún deberá start() Spokestack como se indicó anteriormente, pero también querrá crear un botón en algún lugar que llame spokestack.activate() cuando se presione; Esto comienza ASR, que transcribe el discurso del usuario.
Alternativamente, puede establecer Spokestack para comenzar ASR cada vez que detecte el habla utilizando un perfil de tubería de voz no deformado como se describe en la documentación de la tubería del habla. En este caso, querría el perfil VADTriggerAndroidASR :
// replace
.withoutWakeword()
// with
.withPipelineProfile( " io.spokestack.spokestack.profile.VADTriggerAndroidASR " ) Tenga en cuenta también la línea addListener() durante la configuración. El procesamiento del habla ocurre continuamente en un hilo de fondo, por lo que su aplicación necesita una forma de averiguar cuándo el usuario ha hablado con él. Los eventos importantes se entregan a través de eventos a una subclase de SpokestackAdapter . Su subclase puede anular tantos métodos de eventos siguientes como desee. Elegir no implementar uno no romperá nada; Simplemente no recibirá esos eventos.
speechEvent(SpeechContext.Event, SpeechContext) : esto comunica los eventos de la tubería del habla, incluidos todo, desde notificaciones de que ASR ha sido activado/desactivado hasta transcripciones parciales y completas del habla del usuario.nluResult(NLUResult) : cuando la NLU está habilitada, el discurso del usuario se envía automáticamente a través de NLU para la clasificación. Querrá los resultados de esa clasificación para ayudar a su aplicación a decidir qué hacer a continuación.ttsEvent(TTSEvent) : si está manejando la reproducción de TTS usted mismo, querrá saber cuándo el discurso que ha sintetizado está listo para jugar (el evento AUDIO_AVAILABLE ); Incluso si no lo es, el evento PLAYBACK_COMPLETE puede ser útil si desea reactivar automáticamente el micrófono después de que su aplicación lea una respuesta.trace(SpokestackModule, String) : esto combina mensajes de registro/rastreo de cada módulo de Spokestack. Algunos módulos incluyen eventos traza en sus propios métodos de eventos, pero cada uno de esos eventos también se envía aquí.error(SpokestackModule, Throwable) : esto combina errores de cada módulo de Spokestack. Algunos módulos incluyen eventos de error en sus propios métodos de eventos, pero cada uno de esos eventos también se envía aquí.La guía QuickStart contiene implementaciones de muestras de la mayoría de estos métodos.
Como mencionamos, la clasificación se maneja automáticamente si NLU está habilitada, por lo que los principales métodos que necesita saber mientras se ejecuta Spokestack son:
start()/stop() : inicia/detiene la tubería. Mientras se ejecuta, Spokestack usa el micrófono para escuchar la palabra de vigilia de su aplicación a menos que la palabra de vigilia esté deshabilitada, en cuyo caso ASR debe activarse de otra manera. La tubería debe detenerse cuando Spokestack ya no es necesaria (o cuando la aplicación está suspendida) a los recursos gratuitos.activate()/deactivate() : activa/desactiva ASR, que escucha y transcribe lo que dice el usuario.synthesize(SynthesisRequest) : envía texto al servicio TTS en la nube de Spokestack para ser sintetizado como audio. Según la configuración predeterminada, este audio se reproducirá automáticamente cuando esté disponible. Maven se utiliza para la construcción/implementación, y el paquete está alojado en Maven Central.
Este paquete requiere que se instale el NDK de Android y las variables ANDROID_HOME y ANDROID_NDK_HOME se establezcan. En OSX, ANDROID_HOME generalmente se establece en ~/Library/Android/sdk y ANDROID_NDK_HOME generalmente se establece en ~/Library/Android/sdk/ndk/<version> .
ANDROID_NDK_HOME también se puede especificar en su archivo Maven settings.xml local como la propiedad android.ndk.path .
mvn test jacoco:reportmvn checkstyle:check Asegúrese de que sus credenciales centrales Sonatype/Maven estén en su settings.xml de usuario.xml (generalmente ~/.m2/settings.xml ):
< servers >
< server >
< id >ossrh</ id >
< username >sonatype-username</ username >
< password >sonatype-password</ password >
</ server >
</ servers >En una rama no maestro, ejecute el siguiente comando. Esto le pedirá que ingrese un número de versión y etiqueta para la nueva versión, presione la etiqueta a GitHub e implementa el paquete en el repositorio de Sonatype.
mvn release:clean release:prepare release:performEl objetivo de Maven puede fallar debido a un error en el que intenta cargar los archivos dos veces, pero la versión aún ha sucedido.
Complete el proceso creando y fusionando una solicitud de extracción de la nueva rama en GitHub y actualizando las notas de versión editando la etiqueta.
Para obtener información adicional sobre la liberación, consulte http://maven.apache.org/maven-release/maven-release-plugin/
Copyright 2021 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.