
Spokestack est une solution tout-en-un pour les interfaces vocales mobiles sur Android. Il fournit chaque morceau du puzzle de traitement de la parole, y compris la détection d'activité vocale, la détection de wakeword, la reconnaissance de la parole, la compréhension du langage naturel (NLU) et la synthèse de la parole (TTS). Selon sa configuration par défaut (sur les nouveaux appareils Android), tout sauf TTS se produit directement sur l'appareil mobile - aucune communication avec le cloud signifie des résultats plus rapides et une meilleure confidentialité.
Et Android n'est pas la seule plate-forme qu'il prend en charge!
La création d'un compte gratuit sur SpokeStack.io vous permet de former vos propres modèles NLU et de tester TTS sans ajouter de code à votre application. Nous pouvons même entraîner une voix de wakeword et TTS personnalisée pour vous, en vous assurant que la voix de votre application est unique et mémorable.
Pour une brève introduction, lisez la suite, mais pour des guides plus détaillés, consultez ce qui suit:
Remarque : Spokestack était hébergé sur JCenter, mais depuis l'annonce de son arrêt, nous avons déménagé la distribution à Maven Central. Veuillez vous assurer que votre fichier build.gradle au niveau de la racine comprend mavenCentral() dans son bloc repositories afin d'accéder aux versions> = 11.0.2.
La version minimale Android SDK répertoriée dans le manifeste de SpoKestack est de 8, car c'est tout ce dont vous devriez avoir besoin pour exécuter la détection des mots de Wake et la reconnaissance de la parole. Pour utiliser d'autres fonctionnalités, il est préférable de cibler au moins le niveau de l'API 21.
Si vous incluez Exoplayer pour TTS Playback (voir ci-dessous), vous pourriez avoir du mal à fonctionner sur les versions d'Android plus anciennes que l'API Le niveau 24. Si vous rencontrez ce problème, essayez d'ajouter la ligne suivante à votre fichier gradle.properties :
android.enableDexingArtifactTransform=false
Ajoutez ce qui suit à build.gradle de votre application.gradle:
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 '
}Voir le guide QuickStart pour plus d'informations, mais voici la version de 30 secondes de la configuration:
RECORD_AUDIO au moment de l'exécution. Voir notre projet squelette pour un exemple de cela. L'autorisation INTERNET est également requise mais est incluse par le manifeste de la bibliothèque par défaut.Activity si vous débutez: 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()Cet exemple suppose que vous stockez les modèles Wakeword et NLU dans le répertoire de cache de votre application; Encore une fois, voyez le projet Skeleton pour un exemple de décompression de ces fichiers à partir du bundle des actifs dans ce répertoire.
Pour utiliser la démo "Spokestack" Wakeword, téléchargez les modèles TensorFlow Lite: Detect | Encoder | filtre
Si vous ne voulez pas encore vous soucier de cela, désactivez simplement la détection de wakeword et NLU, et vous pouvez laisser de côté tous les chemins de fichier ci-dessus:
spokestack = Spokestack . Builder ()
.withoutWakeword()
.withoutNlu()
// ...
.build() Dans ce cas, vous devrez toujours start() SpokeStack comme ci-dessus, mais vous voudrez également créer un bouton quelque part qui appelle spokestack.activate() lorsque vous appuyez sur; Cela démarre ASR, qui transcrit la parole utilisateur.
Alternativement, vous pouvez définir Spokestack pour démarrer ASR chaque fois qu'il détecte la parole en utilisant un profil de pipeline de discours non défaut comme décrit dans la documentation du pipeline de la parole. Dans ce cas, vous souhaitez le profil VADTriggerAndroidASR :
// replace
.withoutWakeword()
// with
.withPipelineProfile( " io.spokestack.spokestack.profile.VADTriggerAndroidASR " ) Remarque également la ligne addListener() lors de la configuration. Le traitement de la parole se produit en continu sur un fil d'arrière-plan, donc votre application a besoin d'un moyen de savoir quand l'utilisateur lui a parlé. Des événements importants sont livrés via des événements à une sous-classe de SpokestackAdapter . Votre sous-classe peut remplacer autant des méthodes d'événements suivantes que vous le souhaitez. Choisir de ne pas implémenter un ne brisera rien; Vous ne recevrez tout simplement pas ces événements.
speechEvent(SpeechContext.Event, SpeechContext) :nluResult(NLUResult) : Lorsque le NLU est activé, le discours utilisateur est automatiquement envoyé via NLU pour la classification. Vous voudrez que les résultats de cette classification aident votre application à décider quoi faire ensuite.ttsEvent(TTSEvent) : Si vous gérez vous-même la lecture TTS, vous voudrez savoir quand le discours que vous avez synthétisé est prêt à jouer (l'événement AUDIO_AVAILABLE ); Même si vous ne l'êtes pas, l'événement PLAYBACK_COMPLETE peut être utile si vous souhaitez réactiver automatiquement le microphone après que votre application ait lu une réponse.trace(SpokestackModule, String) : Cela combine des messages Journal / Trace à partir de chaque module Spokestack. Certains modules incluent des événements traces dans leurs propres méthodes d'événements, mais chacun de ces événements est également envoyé ici.error(SpokestackModule, Throwable) : Cela combine des erreurs de chaque module Spokestack. Certains modules incluent des événements d'erreur dans leurs propres méthodes d'événements, mais chacun de ces événements est également envoyé ici.Le guide QuickStart contient des exemples d'implémentations de la plupart de ces méthodes.
Comme nous l'avons mentionné, la classification est gérée automatiquement si NLU est activée, de sorte que les principales méthodes que vous devez connaître pendant que Spokestack s'exécute sont:
start()/stop() : démarre / arrête le pipeline. Pendant l'exécution, Spokestack utilise le microphone pour écouter le wakeword de votre application à moins que Wakeword ne soit désactivé, auquel cas ASR doit être activé d'une autre manière. Le pipeline doit être arrêté lorsque Spokestack n'est plus nécessaire (ou lorsque l'application est suspendue) sur des ressources gratuites.activate()/deactivate() : active / désactive ASR, qui écoute et transcrit ce que l'utilisateur dit.synthesize(SynthesisRequest) : envoie du texte au service TTS Cloud de Spokestack à synthétiser en audio. Selon la configuration par défaut, cet audio sera lu automatiquement lorsqu'il sera disponible. Maven est utilisé pour la construction / déploiement, et le package est hébergé à Maven Central.
Ce package nécessite l'installation d'Android NDK et les variables ANDROID_HOME et ANDROID_NDK_HOME sont définies. Sur OSX, ANDROID_HOME est généralement défini sur ~/Library/Android/sdk et ANDROID_NDK_HOME est généralement défini sur ~/Library/Android/sdk/ndk/<version> .
ANDROID_NDK_HOME peut également être spécifié dans votre fichier Maven settings.xml local comme la propriété android.ndk.path .
mvn test jacoco:reportmvn checkstyle:check Assurez-vous que vos informations d'identification centrales sonatype / maven sont dans votre utilisateur settings.xml (généralement ~/.m2/settings.xml ):
< servers >
< server >
< id >ossrh</ id >
< username >sonatype-username</ username >
< password >sonatype-password</ password >
</ server >
</ servers >Sur une branche non-maître, exécutez la commande suivante. Cela vous invitera à saisir un numéro de version et une balise pour la nouvelle version, pousser la balise vers GitHub et déployer le package dans le référentiel sonatype.
mvn release:clean release:prepare release:performL'objectif Maven peut échouer en raison d'un bogue où il essaie de télécharger les fichiers deux fois, mais la version s'est toujours produite.
Terminez le processus en créant et en fusionnant une demande de traction pour la nouvelle branche sur GitHub et en mettant à jour les notes de version en modifiant la balise.
Pour plus d'informations sur la publication, voir http://maven.apache.org/maven-release/maven-release-plugin/
Copyright 2021 Spokestack, Inc.
Licencié sous la licence Apache, version 2.0 (la "licence"); Vous ne pouvez pas utiliser ce fichier sauf conforme à la licence. Vous pouvez obtenir une copie de la licence à
http://www.apache.org/licenses/LICENSE-2.0
Sauf exiger la loi applicable ou convenu par écrit, les logiciels distribués en vertu de la licence sont distribués sur une base «tel quel», sans garantie ou conditions d'aucune sorte, expresse ou implicite. Voir la licence pour la langue spécifique régissant les autorisations et les limitations sous la licence.