Une application qui comprend véritablement un langage naturel est une idée rêvée par les passionnés de science-fiction, les programmeurs et les chercheurs en intelligence artificielle depuis des décennies. Aujourd'hui, grâce aux progrès considérables des technologies d'apprentissage automatique, ce rêve est plus proche que jamais de devenir réalité. De plus, des services en nuage tels que Google Cloud Machine Learning ont rendu ces technologies librement accessibles à tous..
Dans ce didacticiel, vous apprendrez à utiliser deux puissantes API orientées vers le langage naturel proposées par la plate-forme Google Cloud Machine Learning: les API Cloud Speech et Cloud Natural Language. En les utilisant ensemble, vous pouvez créer des applications capables de gérer la parole dans une variété de langues largement parlées..
Pour suivre, vous aurez besoin de:
Une application capable de traiter la parole doit avoir les capacités suivantes:
Les API Cloud Speech et Cloud Natural Language vous permettent d'ajouter les fonctionnalités ci-dessus à votre application Android en quelques minutes..
L'API Cloud Speech sert de système de reconnaissance vocale à la pointe de la technologie, capable de transcrire avec précision la parole dans plus de 80 langues. Il peut également gérer de manière robuste les accents régionaux et les conditions bruyantes.
Dans le même ordre d'idées, l'API Cloud Natural Language est un système de traitement de langage qui peut, avec une précision quasi humaine, déterminer le rôle que les mots jouent dans les phrases qui lui sont données. Il prend actuellement en charge dix langues et propose également une analyse des entités et des sentiments..
Avant d'utiliser les API Speech et Natural Language, vous devez les activer dans la console Google Cloud. Alors connectez-vous à la console et accédez à Gestionnaire d'API> Bibliothèque.
Pour activer l'API Speech, cliquez sur le bouton API de parole lien dans le Apprentissage de Google Cloud Machine section. Dans la page qui s'ouvre ensuite, appuyez sur le bouton Activer bouton.
Appuyez sur le bouton Retour de votre navigateur pour revenir à la page précédente..
Cette fois, activez l’API en langage naturel en cliquant sur le bouton API de langage naturel lien et en appuyant sur la Activer bouton sur la page suivante.
Vous aurez besoin d'une clé API pour interagir avec les API. Si vous n'en avez pas déjà un, ouvrez le Lettres de créance onglet, appuyez sur le Créer des identifiants bouton, et choisissez Clé API.
Vous verrez maintenant une fenêtre contextuelle affichant votre clé API. Notez-le afin que vous puissiez l'utiliser plus tard.
Les deux API sont basées sur JSON et possèdent des points de terminaison REST avec lesquels vous pouvez interagir directement à l'aide de n'importe quelle bibliothèque de réseau. Toutefois, vous pouvez gagner beaucoup de temps et écrire davantage de code lisible en utilisant les bibliothèques clientes Google API disponibles pour eux. Alors ouvrez le build.gradle fichier de votre projet app
module et ajouter ce qui suit compiler
dépendances à elle:
compiler 'com.google.api-client: google-api-client-android: 1.22.0' compiler 'com.google.apis: google-api-services-speech: v1beta1-rev336-1.22.0' compiler 'com. google.apis: google-api-services-language: v1beta2-rev6-1.22.0 'compiler' com.google.code.findbugs: jsr305: 2.0.1 '
De plus, nous allons effectuer quelques opérations d’E / S sur fichiers dans ce tutoriel. Pour les simplifier, ajoutez un compiler
dépendance pour la bibliothèque Commons IO.
compiler 'commons-io: commons-io: 2.5'
Enfin, n'oubliez pas de demander pour le L'INTERNET
permission dans le AndroidManifest.xml fichier. Sans cela, votre application ne pourra pas se connecter aux serveurs de Google..
Il va sans dire que l'API Cloud Speech attend des données audio comme l'une de ses entrées. Par conséquent, nous allons maintenant créer une application Android capable de transcrire des fichiers audio..
Pour rester simple, nous ne transcrireons que les fichiers FLAC, fichiers qui utilisent le format de codage Free Lossless Audio Codec. Vous avez peut-être déjà de tels fichiers sur votre appareil. Si vous ne le faites pas, je vous suggère d'en télécharger quelques-uns à partir de Wikimedia Commons.
La mise en page de notre application aura un Bouton
Les utilisateurs de widgets peuvent appuyer sur pour afficher un sélecteur de fichiers, une interface où ils peuvent parcourir et sélectionner des fichiers audio disponibles sur leurs appareils..
La mise en page aura également un Affichage
widget pour afficher la transcription du fichier audio sélectionné. En conséquence, ajoutez le code suivant au fichier XML de présentation de votre activité:
L’interface du sélecteur de fichiers doit être affichée lorsque l’utilisateur appuie sur le bouton créé à l’étape précédente, associez donc un OnClickListener
objet avec elle. Avant de le faire, assurez-vous d’initialiser le bouton à l’aide du bouton findViewById ()
méthode.
Bouton browseButton = (Bouton) findViewById (R.id.browse_button); browseButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (Afficher la vue) // Plus de code ici);
Avec Storage Access Framework d'Android, disponible sur les périphériques exécutant l'API de niveau 19 ou supérieur, la création d'un sélecteur de fichiers nécessite très peu d'effort. Tout ce que vous devez faire est de créer une intention pour la ACTION_GET_CONTENT
l'action et le passer à la startActivityForResult ()
méthode. Facultativement, vous pouvez limiter le sélecteur de fichiers à l’affichage des fichiers FLAC uniquement en transmettant le type MIME approprié au setType ()
méthode du Intention
objet.
Intention filePicker = new Intent (Intent.ACTION_GET_CONTENT); filePicker.setType ("audio / flac"); startActivityForResult (filePicker, 1);
La sortie du sélecteur de fichier sera un autre Intention
objet contenant l'URI du fichier sélectionné par l'utilisateur. Pour pouvoir y accéder, vous devez remplacer le onActivityResult ()
méthode de votre Activité
classe.
@Override protected void onActivityResult (int requestCode, int resultCode, données d'intention) super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) final Uri soundUri = data.getData (); // Plus de code ici
L'API Cloud Speech s'attend à ce que ses données audio se présentent sous la forme d'une chaîne Base64. Pour générer une telle chaîne, vous pouvez lire le contenu du fichier sélectionné par l'utilisateur dans un dossier. octet
tableau et le passer à la encodeBase64String ()
Méthode utilitaire proposée par la bibliothèque Google API Client.
Cependant, vous n'avez actuellement que l'URI du fichier sélectionné, pas son chemin absolu. Cela signifie que, pour pouvoir lire le fichier, vous devez d'abord résoudre l'URI. Vous pouvez le faire en le passant à la openInputStream ()
méthode de résolution du contenu de votre activité. Une fois que vous avez accès au flux d’entrée du fichier, vous pouvez simplement le transmettre au toByteArray ()
méthode du IOUtils
classe pour le convertir en un tableau d'octets. Le code suivant vous montre comment:
AsyncTask.execute (new Runnable () @Override public void run () InputStream stream = = getContentResolver () .openInputStream (soundUri); byte [] audioData = IOUtils.toByteArray (stream); stream ;close (); String Base64.encodeBase64String (audioData); // Plus de code ici
Comme vous pouvez le constater dans le code ci-dessus, nous utilisons un nouveau thread pour exécuter toutes les opérations d’E / S. Faire cela est important pour s'assurer que l'interface utilisateur de l'application ne gèle pas.
À mon avis, la lecture du fichier son en cours de transcription est une bonne idée. Cela ne demande pas beaucoup d'effort et améliore l'expérience de l'utilisateur.
Vous pouvez utiliser le Lecteur multimédia
classe pour jouer le fichier son. Une fois que vous pointez l’URI du fichier à l’aide de sa setDataSource ()
méthode, vous devez appeler sa préparer()
méthode pour préparer le joueur de manière synchrone. Lorsque le joueur est prêt, vous pouvez appeler son début()
méthode pour commencer à jouer le fichier.
De plus, vous devez vous rappeler de libérer les ressources du lecteur une fois la lecture du fichier terminée. Pour ce faire, assignez un OnCompletionListener
objecter et appeler son Libération()
méthode. Le code suivant vous montre comment:
Lecteur MediaPlayer = new MediaPlayer (); player.setDataSource (MainActivity.this, soundUri); player.prepare (); player.start (); // Libérez le lecteur player.setOnCompletionListener (nouveau MediaPlayer.OnCompletionListener () @Override public void onCompletion (MediaPlayer mediaPlayer) mediaPlayer.release (););
À ce stade, nous pouvons envoyer les données audio codées en Base64 à l'API Cloud Speech pour les transcrire. Mais d’abord, je vous suggère de stocker la clé d’API que vous avez générée précédemment en tant que variable membre de votre Activité
classe.
private final String CLOUD_API_KEY = "ABCDEF1234567890";
Pour pouvoir communiquer avec l’API Cloud Speech, vous devez créer un Discours
objet utilisant un Speech.Builder
exemple. En tant qu'arguments, son constructeur attend un transport HTTP et une fabrique JSON. De plus, pour vous assurer que la clé d’API est incluse dans chaque demande HTTP à l’API, vous devez associer un SpeechRequestInitializer
objet avec le constructeur et passe la clé.
Le code suivant crée un Discours
objet en utilisant le AndroidJsonFactory
classe comme l'usine JSON et la NetHttpTransport
classe en tant que transport HTTP:
Speech speechService = nouveau Speech.Builder (AndroidHttp.newCompatibleTransport (), nouveau AndroidJsonFactory (), null) .setSpeechRequestInitializer (nouveau SpeechRequestInitializer (CLOUD_API_KEY)) .build ();
L'API Cloud Speech doit être informée de la langue du fichier audio. Vous pouvez le faire en créant un RecognitionConfig
objet et appelant son setLanguageCode ()
méthode. Voici comment vous le configurez pour ne transcrire que l'anglais américain:
RecognitionConfig RecognizationConfig = new RecognitionConfig (); reconnaissanceConfig.setLanguageCode ("en-US");
De plus, la chaîne encodée en Base64 doit être encapsulée dans un ReconnaissanceAudio
objet avant qu'il puisse être utilisé par l'API.
RecognitionAudio RecognizationAudio = new RecognitionAudio (); reconnaissanceAudio.setContent (base64EncodedData);
Ensuite, en utilisant le RecognitionConfig
et ReconnaissanceAudio
objets, vous devez créer un SyncRecognizeRequest
objet. Comme son nom l'indique, il vous permet de créer une requête HTTP pour transcrire de manière synchrone des données audio. Une fois que l'objet a été créé, vous pouvez le transmettre en tant qu'argument au syncrecognize ()
méthode et appeler le résultat Speech.SpeechOperations.Syncrecognize
objets exécuter()
méthode pour réellement exécuter la requête HTTP.
La valeur de retour de la exécuter()
la méthode est un SyncRecognizeResponse
objet, qui peut contenir plusieurs transcriptions alternatives. Pour le moment, nous n'utiliserons que la première alternative.
// Créer une demande SyncRecognizeRequest request = new SyncRecognizeRequest (); request.setConfig (reconnaissanceConfig); request.setAudio (reconnaissanceAudio); // Génère une réponse SyncRecognizeResponse response = speechService.speech () .syncrecognize (request) .execute (); // Extraire la transcription SpeechRecognitionResult result = response.getResults (). Get (0); final String transcript = result.getAlternatives (). get (0) .getTranscript ();
Enfin, pour afficher la transcription à l'utilisateur, vous pouvez la transmettre au Affichage
widget. Bien sûr, étant donné que les modifications apportées à l'interface utilisateur doivent toujours se produire sur le thread d'interface utilisateur, assurez-vous de le faire après avoir appelé votre activité. runOnUiThread ()
méthode.
runOnUiThread (new Runnable () @Override public void run () TextView speechToTextResult = (TextView) findViewById (R.id.speech_to_text_result); speechToTextResult.setText (transcript););
Vous pouvez maintenant exécuter votre application, sélectionner un fichier FLAC contenant la parole en anglais américain et voir l'API Cloud Speech générer une transcription pour cette application..
Il est à noter que l'API Cloud Speech ne peut actuellement traiter que des fichiers audio à canal unique. Si vous envoyez un fichier avec plusieurs canaux, vous obtiendrez une réponse d'erreur..
Maintenant que nous avons une transcription, nous pouvons la transmettre à l'API Cloud Natural Language pour l'analyse. Pour que ce didacticiel soit court, nous n'exécuterons l'analyse d'entité et de sentiment que sur la transcription. En d’autres termes, nous allons déterminer toutes les entités mentionnées dans la transcription, telles que les personnes, les lieux et les professions, et indiquer si son sentiment général est négatif, neutre ou positif..
Pour permettre à l'utilisateur de démarrer l'analyse, notre mise en page doit contenir un autre Bouton
widget. Par conséquent, ajoutez le code suivant au fichier XML de présentation de votre activité:
L’API REST en langage naturel en nuage offre une option pratique appelée annotateText cela vous permet d'exécuter une analyse des sentiments et des entités sur un document avec une seule requête HTTP. Nous allons l'utiliser pour analyser notre transcription.
Comme l'analyse doit commencer lorsque l'utilisateur appuie sur le bouton créé à l'étape précédente, ajoutez un OnClickListener
à cela.
Bouton analyseButton = (Bouton) findViewById (R.id.analyze_button); analyseButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (Afficher la vue) // Plus de code ici);
Pour interagir avec l'API à l'aide de la bibliothèque Google API Client, vous devez créer un CloudNaturalLanguage
objet en utilisant le CloudNaturalLanguage.Builder
classe. Son constructeur attend également un transport HTTP et une usine JSON..
De plus, en assignant un CloudNaturalLanguageRequestInitializer
exemple, vous pouvez le forcer à inclure votre clé API dans toutes ses requêtes.
final CloudNaturalLanguage naturalLanguageService = nouveau CloudNaturalLanguage.Builder (AndroidHttp.newCompatibleTransport (), nouveau AndroidJsonFactory (), null) .setCloudNaturalLanguageRequestInitializer (nouveau CloudNaturalLanguageRequestInitializer)
Tout le texte que vous souhaitez analyser à l’aide de l’API doit être placé dans un Document
objet. le Document
object doit également contenir des informations de configuration, telles que la langue du texte et le formatage de celui-ci en texte brut ou HTML. En conséquence, ajoutez le code suivant:
Transcription de chaîne = ((TextView) findViewById (R.id.speech_to_text_result)) .getText (). ToString (); Document document = nouveau document (); document.setType ("PLAIN_TEXT"); document.setLanguage ("en-US"); document.setContent (transcription);
Ensuite, vous devez créer un Caractéristiques
objet spécifiant les fonctionnalités que vous souhaitez analyser. Le code suivant vous montre comment créer un Caractéristiques
objet qui dit que vous voulez extraire des entités et exécuter uniquement une analyse de sentiment.
Caractéristiques fonctionnalités = nouvelles fonctionnalités (); features.setExtractEntities (true); features.setExtractDocumentSentiment (true);
Vous pouvez maintenant utiliser le Document
et Caractéristiques
objets pour composer un AnnotateTextRequest
objet, qui peut être passé au annotateText ()
méthode pour générer un AnnotateTextResponse
objet.
dernière requête AnnotateTextRequest = new AnnotateTextRequest (); request.setDocument (document); request.setFeatures (fonctionnalités); AsyncTask.execute (new Runnable () @Override public void run () AnnotateTextResponse réponse = naturalLanguageService.documents () .annotateText (request) .execute (); // Plus de code ici
Notez que nous générons la réponse dans un nouveau thread car les opérations réseau ne sont pas autorisées sur le thread d'interface utilisateur..
Vous pouvez extraire une liste d’entités de la AnnotateTextResponse
objet en appelant son getEntities ()
méthode. De même, vous pouvez extraire le sentiment général de la transcription en appelant le getDocumentSentiment ()
méthode. Pour obtenir le score réel du sentiment, vous devez également appeler le getScore ()
méthode, qui retourne un flotte
.
Comme vous vous en doutez, un score de sentiment égal à zéro signifie que le sentiment est neutre, un score supérieur à zéro signifie que le sentiment est positif et un score inférieur à zéro signifie que le sentiment est négatif..
Ce que vous faites avec la liste des entités et le score de sentiment appartient bien entendu à vous. Pour le moment, affichons-les simplement à l'aide d'un AlertDialog
exemple.
liste finaleentityList = response.getEntities (); sentiment final float = response.getDocumentSentiment (). getScore (); runOnUiThread (new Runnable () @Override public void run () String entity = ""; pour (entité entité: entityList) entités + = "\ n" + entity.getName (). toUpperCase (); dialogue AlertDialog = new AlertDialog.Builder (MainActivity.this) .setTitle ("Sentiment:" + sentiment) .setMessage ("Ce fichier audio parle de:" + entités) .setNeutralButton ("OK", null) .create (); dialog. spectacle(); );
Avec le code ci-dessus, le score de sentiment sera affiché dans le titre de la boîte de dialogue et la liste des entités sera affichée dans son corps..
Si vous exécutez l'application maintenant, vous devriez être en mesure d'analyser le contenu des fichiers audio, ainsi que de les transcrire..
Vous savez maintenant comment utiliser conjointement les API Cloud Speech et Cloud Natural Language pour créer une application Android qui peut non seulement transcrire un fichier audio, mais également exécuter une analyse d'entité et de sentiment. Dans ce didacticiel, vous avez également appris à utiliser les bibliothèques de Storage Access Framework d'Android et d'API Google Client..
Google a régulièrement ajouté de nouvelles fonctionnalités intéressantes, ainsi qu'un support pour davantage de langues, aux deux API. Pour rester à jour à leur sujet, consultez la documentation officielle..
Et pendant que vous êtes ici, consultez certains de nos autres articles sur les services en nuage d'applications mobiles et l'apprentissage automatique.!