Une application qui comprend vraiment un langage naturel est quelque chose dont les passionnés de science-fiction, les programmeurs et les chercheurs en IA rêvent 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 basés sur le cloud tels que Google Cloud Machine Learning ont rendu ces technologies gratuitement accessibles à tous.
Dans ce didacticiel, vous apprendrez à utiliser deux puissantes API orientées langage naturel proposées par la plate-forme Google Cloud Machine Learning: API Cloud Speech et API 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.
Conditions préalables
Pour suivre, vous aurez besoin de:
- Android Studio 2.2 ou supérieur
- une Google Cloud Platform Compte
- un appareil qui exécute Android 4.4 ou supérieur
1. Pourquoi utiliser ces API?
Une application capable de traiter la parole doit avoir les capacités suivantes:
- Il doit être capable d’extraire des mots individuels à partir de données audio brutes.
- Il doit être capable de faire des suppositions éclairées sur les relations grammaticales entre les mots qu’il a extraits.
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 reconnaissance vocale de pointe 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 du langage qui peut, avec une précision quasi humaine, déterminer les rôles que jouent les mots dans les phrases qui lui sont attribuées. Il prend actuellement en charge dix langues et propose également une analyse des entités et des sentiments.
2. Activation des API
Avant d’utiliser les API Speech et Natural Language, vous devez les activer dans Google Cloud console. Alors connectez-vous à la console et accédez à Gestionnaire d’API> Bibliothèque.

Pour activer l’API Speech, cliquez sur le API Speech lien dans le Google Cloud Machine Learning section. Dans la page qui s’ouvre ensuite, appuyez sur le Activer bouton.

Appuyez sur le bouton Retour de votre navigateur pour revenir à la page précédente.
Cette fois, activez l’API Natural Language en cliquant sur le bouton API de langage naturel lien et en appuyant sur le Activer bouton sur la page suivante.

Vous aurez besoin d’une clé API lors de l’interaction avec les API. Si vous n’en avez pas déjà, ouvrez le Identifiants onglet, appuyez sur Créer des identifiants et choisissez Clé API.
Vous verrez maintenant une fenêtre contextuelle affichant votre clé API. Notez-le pour pouvoir l’utiliser plus tard.

3. Configurer votre projet
Les deux API sont basées sur JSON et ont des points de terminaison REST avec lesquels vous pouvez interagir directement à l’aide de n’importe quelle bibliothèque réseau. Cependant, vous pouvez gagner beaucoup de temps et écrire du code plus lisible en utilisant le Client API Google bibliothèques disponibles pour eux. Alors ouvrez le build.gradle dossier de votre projet app module et ajoutez ce qui suit compile ses dépendances:
compile 'com.google.api-client:google-api-client-android:1.22.0' compile 'com.google.apis:google-api-services-speech:v1beta1-rev336-1.22.0' compile 'com.google.apis:google-api-services-language:v1beta2-rev6-1.22.0' compile 'com.google.code.findbugs:jsr305:2.0.1'
De plus, nous allons effectuer quelques opérations d’E / S de fichiers dans ce didacticiel. Pour les simplifier, ajoutez un compile dépendance pour la Commons IO bibliothèque.
compile 'commons-io:commons-io:2.5'
Enfin, n’oubliez pas de demander le INTERNET permission dans le AndroidManifest.xml fichier. Sans cela, votre application ne pourra pas se connecter aux serveurs de Google.
<uses-permission android:name="android.permission.INTERNET"/>
4. Utiliser l’API Cloud Speech
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 faire simple, nous ne transcrireons que des fichiers FLAC, des fichiers qui utilisent le format d’encodage Free Lossless Audio Codec. Vous avez peut-être déjà de tels fichiers sur votre appareil. Sinon, je vous suggère d’en télécharger quelques-uns sur Wikimedia Commons.
Étape 1: créer une mise en page
La mise en page de notre application aura un Button les utilisateurs de widgets peuvent appuyer sur pour afficher un sélecteur de fichiers, une interface dans laquelle ils peuvent parcourir et sélectionner les fichiers audio disponibles sur leurs appareils.
La mise en page aura également un TextView widget pour afficher la transcription du fichier audio sélectionné. En conséquence, ajoutez le code suivant au fichier XML de mise en page de votre activité:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:id="@+id/speech_to_text_result"
android:textSize="18sp"
android:layout_alignParentTop="true"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:id="@+id/browse_button"
android:text="Browse"/>
Étape 2: créer un sélecteur de fichiers
L’interface du sélecteur de fichiers doit être affichée lorsque l’utilisateur appuie sur le bouton que nous avons créé à l’étape précédente, alors associez un OnClickListener objet avec lui. Avant de le faire, assurez-vous d’initialiser le bouton à l’aide du findViewById() méthode.
Button browseButton = (Button)findViewById(R.id.browse_button);
browseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// More code here
}
});
Avec Storage Access Framework d’Android, disponible sur les appareils exécutant le niveau d’API 19 ou supérieur, la création d’un sélecteur de fichiers demande très peu d’effort. Tout ce que vous avez à faire est de créer une intention pour le ACTION_GET_CONTENT action et transmettez-le au startActivityForResult() méthode. Si vous le souhaitez, vous pouvez restreindre le sélecteur de fichiers pour afficher uniquement les fichiers FLAC en transmettant le type MIME approprié au setType() méthode de la Intent objet.
Intent filePicker = new Intent(Intent.ACTION_GET_CONTENT);
filePicker.setType("audio/flac");
startActivityForResult(filePicker, 1);
La sortie du sélecteur de fichiers sera une autre Intent 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 Activity classe.
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == RESULT_OK) {
final Uri soundUri = data.getData();
// More code here
}
}
Étape 3: codez le fichier
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 byte tableau et passez-le au encodeBase64String() méthode utilitaire proposée par la bibliothèque cliente des API Google.
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 transmettant au openInputStream() méthode du résolveur de 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 de la IOUtils class 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 base64EncodedData =
Base64.encodeBase64String(audioData);
// More code here
}
}
Comme vous pouvez le voir dans le code ci-dessus, nous utilisons un nouveau thread pour exécuter toutes les opérations d’E / S. Cela est important pour vous assurer que l’interface utilisateur de l’application ne se fige pas.
Étape 4: lire le fichier
À mon avis, jouer le fichier son en cours de transcription, pendant qu’il est en cours de transcription, est une bonne idée. Cela ne demande pas beaucoup d’efforts et améliore l’expérience utilisateur.
Vous pouvez utiliser le MediaPlayer classe pour lire le fichier son. Une fois que vous le pointez vers l’URI du fichier en utilisant son setDataSource() méthode, vous devez appeler sa prepare() méthode pour préparer le lecteur de manière synchrone. Lorsque le lecteur est prêt, vous pouvez appeler son start() méthode pour démarrer la lecture du fichier.
De plus, vous devez vous rappeler de libérer les ressources du lecteur une fois qu’il a terminé la lecture du fichier. Pour ce faire, attribuez un OnCompletionListener s’y opposer et appeler son release() méthode. Le code suivant vous montre comment:
MediaPlayer player = new MediaPlayer();
player.setDataSource(MainActivity.this, soundUri);
player.prepare();
player.start();
// Release the player
player.setOnCompletionListener(
new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
mediaPlayer.release();
}
});
Étape 5: Transcrire le fichier de manière synchrone
À ce stade, nous pouvons envoyer les données audio encodées en Base64 à l’API Cloud Speech pour les transcrire. Mais d’abord, je vous suggère de stocker la clé API que vous avez générée précédemment en tant que variable membre de votre Activity classe.
private final String CLOUD_API_KEY = "ABCDEF1234567890";
Pour pouvoir communiquer avec l’API Cloud Speech, vous devez créer un Speech 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é API est incluse dans chaque requête HTTP à l’API, vous devez associer un SpeechRequestInitializer objet avec le constructeur et passez-lui la clé.
Le code suivant crée un Speech objet utilisant le AndroidJsonFactory classe en tant que fabrique JSON et NetHttpTransport classe comme transport HTTP:
Speech speechService = new Speech.Builder(
AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(),
null
).setSpeechRequestInitializer(
new 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 transcrire uniquement l’anglais américain:
RecognitionConfig recognitionConfig = new RecognitionConfig();
recognitionConfig.setLanguageCode("en-US");
En outre, la chaîne encodée en Base64 doit être encapsulée dans un RecognitionAudio objet avant de pouvoir être utilisé par l’API.
RecognitionAudio recognitionAudio = new RecognitionAudio(); recognitionAudio.setContent(base64EncodedData);
Ensuite, en utilisant le RecognitionConfig et RecognitionAudio 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 l’objet créé, vous pouvez le passer en argument au syncrecognize() méthode et appelez le résultat Speech.SpeechOperations.Syncrecognize objets execute() méthode pour exécuter réellement la requête HTTP.
La valeur de retour du execute() la méthode est une SyncRecognizeResponse objet, qui peut contenir plusieurs transcriptions alternatives. Pour l’instant, nous n’utiliserons que la première alternative.
// Create request
SyncRecognizeRequest request = new SyncRecognizeRequest();
request.setConfig(recognitionConfig);
request.setAudio(recognitionAudio);
// Generate response
SyncRecognizeResponse response = speechService.speech()
.syncrecognize(request)
.execute();
// Extract transcript
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 TextView widget. Bien sûr, étant donné que les modifications apportées à l’interface utilisateur doivent toujours se produire sur le thread de l’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 des paroles en anglais américain et voir l’API Cloud Speech générer une transcription pour celui-ci.
Il est à noter que l’API Cloud Speech ne peut actuellement traiter que des fichiers audio à un seul canal. Si vous lui envoyez un fichier avec plusieurs canaux, vous obtiendrez une réponse d’erreur.
5. Utiliser l’API Cloud Natural Language
Maintenant que nous avons une transcription, nous pouvons la transmettre à l’API Cloud Natural Language pour l’analyser. Pour que ce tutoriel reste bref, nous n’exécuterons que l’analyse des entités et des sentiments sur la transcription. En d’autres termes, nous allons déterminer toutes les entités qui sont mentionnées dans la transcription, telles que les personnes, les lieux et les professions, et également dire si son sentiment général est négatif, neutre ou positif.
Étape 1: mettre à jour la mise en page
Pour permettre à l’utilisateur de démarrer l’analyse, notre mise en page doit contenir un autre Button widget. Par conséquent, ajoutez le code suivant au fichier XML de mise en page de votre activité:
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/browse_button"
android:id="@+id/analyze_button"
android:text="Analyze"/>
Étape 2: annoter la transcription
L’API REST Cloud Natural Language offre une option pratique appelée annoterText qui vous permet d’exécuter à la fois une analyse des sentiments et des entités sur un document avec une seule requête HTTP. Nous l’utiliserons pour analyser notre transcription.
Puisque l’analyse doit commencer lorsque l’utilisateur appuie sur le bouton que nous avons créé à l’étape précédente, ajoutez un OnClickListener à lui.
Button analyzeButton = (Button)findViewById(R.id.analyze_button);
analyzeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// More code here
}
});
Pour interagir avec l’API à l’aide de la bibliothèque cliente des API Google, vous devez créer un CloudNaturalLanguage objet utilisant le CloudNaturalLanguage.Builder classe. Son constructeur attend également un transport HTTP et une fabrique JSON.
De plus, en attribuant un CloudNaturalLanguageRequestInitializer instance, vous pouvez le forcer à inclure votre clé API dans toutes ses requêtes.
final CloudNaturalLanguage naturalLanguageService =
new CloudNaturalLanguage.Builder(
AndroidHttp.newCompatibleTransport(),
new AndroidJsonFactory(),
null
).setCloudNaturalLanguageRequestInitializer(
new CloudNaturalLanguageRequestInitializer(CLOUD_API_KEY)
).build();
Tout le texte que vous souhaitez analyser à l’aide de l’API doit être placé dans un Document objet. le Document L’objet doit également contenir des informations de configuration, telles que la langue du texte et s’il est formaté en texte brut ou HTML. En conséquence, ajoutez le code suivant:
String transcript =
((TextView)findViewById(R.id.speech_to_text_result))
.getText().toString();
Document document = new Document();
document.setType("PLAIN_TEXT");
document.setLanguage("en-US");
document.setContent(transcript);
Ensuite, vous devez créer un Features objet spécifiant les caractéristiques que vous souhaitez analyser. Le code suivant vous montre comment créer un Features objet indiquant que vous souhaitez extraire des entités et exécuter une analyse des sentiments uniquement.
Features features = new Features(); features.setExtractEntities(true); features.setExtractDocumentSentiment(true);
Vous pouvez maintenant utiliser le Document et Features objets pour composer un AnnotateTextRequest objet, qui peut être passé au annotateText() méthode pour générer un AnnotateTextResponse objet.
final AnnotateTextRequest request = new AnnotateTextRequest();
request.setDocument(document);
request.setFeatures(features);
AsyncTask.execute(new Runnable() {
@Override
public void run() {
AnnotateTextResponse response =
naturalLanguageService.documents()
.annotateText(request).execute();
// More code here
}
}
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 du 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. Cependant, pour obtenir le score réel du sentiment, vous devez également appeler le getScore() méthode, qui renvoie un float.
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 dépend, bien sûr, de vous. Pour l’instant, affichons-les tous les deux à l’aide d’un AlertDialog exemple.
final List<Entity> entityList = response.getEntities();
final float sentiment = response.getDocumentSentiment().getScore();
runOnUiThread(new Runnable() {
@Override
public void run() {
String entities = "";
for(Entity entity:entityList) {
entities += "n" + entity.getName().toUpperCase();
}
AlertDialog dialog =
new AlertDialog.Builder(MainActivity.this)
.setTitle("Sentiment: " + sentiment)
.setMessage("This audio file talks about :"
+ entities)
.setNeutralButton("Okay", null)
.create();
dialog.show();
}
});
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 et de les transcrire.
Conclusion
Vous savez maintenant comment utiliser ensemble les API Cloud Speech et Cloud Natural Language pour créer une application Android qui peut non seulement transcrire un fichier audio, mais également y exécuter une analyse d’entité et de sentiment. Dans ce didacticiel, vous avez également appris à utiliser Storage Access Framework d’Android et les bibliothèques d’API client Google.
Google ajoute régulièrement de nouvelles fonctionnalités intéressantes, ainsi que la prise en charge de plusieurs langues, aux deux API. Pour rester informé à leur sujet, reportez-vous au documentation officielle.
Et pendant que vous êtes ici, consultez certains de nos autres articles sur les services cloud d’applications mobiles et l’apprentissage automatique!
Soutenez notre effort ❤️
Si vous avez apprécié cet article, pensez à laisser un pourboire pour nous aider à continuer à publier du contenu de qualité.





















