Erstellen Sie eine intelligente App mit Google Cloud Speech- und Natural-Language-APIs

Eine Anwendung, die eine natürliche Sprache wirklich versteht, ist schon seit Jahrzehnten von Science-Fiction-Enthusiasten, Programmierern und KI-Forschern geträumt. Heute ist dieser Traum dank der großen Fortschritte bei den Technologien des maschinellen Lernens der Realität näher als je zuvor. Darüber hinaus haben Cloud-basierte Dienste wie Google Cloud Machine Learning diese Technologien für jedermann frei verfügbar gemacht.

In diesem Lernprogramm erfahren Sie, wie Sie zwei leistungsstarke, natürlich sprachenorientierte APIs der Google Cloud Machine Learning-Plattform verwenden: Cloud Speech API und Cloud Natural Language API. Wenn Sie sie zusammen verwenden, können Sie Apps erstellen, die Sprache in einer Vielzahl von weit verbreiteten Sprachen verarbeiten können.

Voraussetzungen

Um mitzumachen, brauchst du:

  • Android Studio 2.2 oder höher
  • ein Google Cloud Platform-Konto
  • ein Gerät, auf dem Android 4.4 oder höher ausgeführt wird

1. Warum diese APIs verwenden??

Eine Anwendung, die Sprache verarbeiten kann, muss über die folgenden Funktionen verfügen:

  • Es muss in der Lage sein, einzelne Wörter aus rohen Audiodaten zu extrahieren.
  • Es muss in der Lage sein, fundierte Vermutungen über die grammatischen Beziehungen zwischen den extrahierten Wörtern zu treffen.

Mit den Cloud-Speech- und Cloud-APIs für natürliche Sprachen können Sie die oben genannten Funktionen in wenigen Minuten zu Ihrer Android-App hinzufügen.

Die Cloud-Sprach-API dient als hochmoderner Spracherkenner, der Sprache in über 80 Sprachen präzise transkribieren kann. Es kann auch robust mit regionalen Akzenten und lauten Verhältnissen umgehen.

In ähnlicher Weise handelt es sich bei der Cloud Natural Language-API um ein Sprachverarbeitungssystem, das mit nahezu menschlicher Genauigkeit die Rollen bestimmen kann, die Wörter in den ihr gegebenen Sätzen spielen. Es unterstützt derzeit zehn Sprachen und bietet auch eine Entitäts- und Gefühlsanalyse.

2. Aktivieren der APIs

Bevor Sie die Sprach- und Sprache-APIs verwenden, müssen Sie sie in der Google Cloud-Konsole aktivieren. Melden Sie sich also bei der Konsole an und navigieren Sie zu API Manager> Bibliothek.

Um die Sprach-API zu aktivieren, klicken Sie auf Sprach-API Link in der Google Cloud Machine Learning Sektion. Drücken Sie auf der nächsten Seite die Aktivieren Taste.

Drücken Sie die Zurück-Taste Ihres Browsers, um zur vorherigen Seite zurückzukehren.

Aktivieren Sie diesmal die Natural-Language-API, indem Sie auf klicken Natural Language API Link und drücken Sie die Aktivieren Schaltfläche auf der nächsten Seite.

Sie benötigen einen API-Schlüssel, um mit den APIs zu interagieren. Wenn Sie noch keine haben, öffnen Sie die Referenzen Registerkarte, drücken Sie die Erstellen Sie Anmeldeinformationen und wählen Sie API-Schlüssel.

Sie sehen jetzt ein Popup mit Ihrem API-Schlüssel. Notieren Sie es, damit Sie es später verwenden können.

3. Projekt konfigurieren

Beide APIs sind JSON-basiert und verfügen über REST-Endpunkte, mit denen Sie direkt mit einer beliebigen Netzwerkbibliothek interagieren können. Sie können jedoch viel Zeit sparen und lesbaren Code schreiben, indem Sie die dafür verfügbaren Google API Client-Bibliotheken verwenden. Also öffne die build.gradle Datei Ihres Projekts App Modul und fügen Sie Folgendes hinzu kompilieren Abhängigkeiten dazu:

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 '

Außerdem führen wir in diesem Lernprogramm einige Datei-E / A-Vorgänge aus. Fügen Sie zur Vereinfachung ein kompilieren Abhängigkeit für die Commons IO-Bibliothek.

'commons-io: commons-io: 2.5' kompilieren

Vergessen Sie nicht zuletzt, das zu beantragen INTERNET Erlaubnis in der AndroidManifest.xml Datei. Andernfalls kann Ihre App keine Verbindung zu den Servern von Google herstellen.

4. Verwenden der Cloud-Sprach-API

Es versteht sich von selbst, dass die Cloud-Sprach-API Audiodaten als eine ihrer Eingaben erwartet. Deshalb erstellen wir jetzt eine Android-App, die Audiodateien transkribieren kann. 

Um es einfach zu halten, werden nur FLAC-Dateien, also Dateien, die das Free Lossless Audio Codec-Kodierungsformat verwenden, transkribiert. Möglicherweise haben Sie bereits solche Dateien auf Ihrem Gerät. Wenn nicht, empfehle ich Ihnen, einige von Wikimedia Commons herunterzuladen.

Schritt 1: Erstellen Sie ein Layout

Das Layout unserer App wird eine Taste Widgetbenutzer können drücken, um eine Dateiauswahl anzuzeigen, eine Oberfläche, über die sie Audiodateien durchsuchen und auswählen können, die auf ihren Geräten verfügbar sind.

Das Layout hat auch eine Textvorschau Widget, um das Transkript der ausgewählten Audiodatei anzuzeigen. Fügen Sie der Layout-XML-Datei Ihrer Aktivität den folgenden Code hinzu:

 

Schritt 2: Erstellen Sie eine Dateiauswahl

Die Benutzeroberfläche für die Dateiauswahl sollte angezeigt werden, wenn der Benutzer die Schaltfläche drückt, die wir im vorherigen Schritt erstellt haben. Ordnen Sie also eine zu OnClickListener Objekt damit. Bevor Sie dies tun, stellen Sie sicher, dass Sie die Schaltfläche mit der Taste initialisieren findViewById () Methode.

Schaltfläche browseButton = (Schaltfläche) findViewById (R.id.browse_button); browseButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (View view) // Mehr Code hier);

Mit dem Storage Access Framework von Android, das auf Geräten mit API Level 19 oder höher verfügbar ist, ist das Erstellen einer Dateiauswahl sehr wenig Aufwand. Alles was Sie tun müssen, ist eine Absicht für die ACTION_GET_CONTENT Aktion und übergeben Sie es an die startActivityForResult () Methode. Optional können Sie die Dateiauswahl so einschränken, dass nur FLAC-Dateien angezeigt werden, indem Sie den entsprechenden MIME-Typ an den übergeben setType () Methode der Absicht Objekt.

Intent filePicker = new Intent (Intent.ACTION_GET_CONTENT); filePicker.setType ("audio / flac"); startActivityForResult (filePicker, 1);

Die Ausgabe der Dateiauswahl wird eine andere sein Absicht Objekt, das die URI der vom Benutzer ausgewählten Datei enthält. Um darauf zugreifen zu können, müssen Sie die Option überschreiben onActivityResult () Methode Ihrer Aktivität Klasse.

@Override protected void onActivityResult (int requestCode, int resultCode, Absichtsdaten) super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) final Uri soundUri = data.getData (); // Mehr Code hier

Schritt 3: Kodieren Sie die Datei

Die Cloud-Sprach-API erwartet, dass ihre Audiodaten in Form einer Base64-Zeichenfolge vorliegen. Um eine solche Zeichenfolge zu erzeugen, können Sie den Inhalt der vom Benutzer ausgewählten Datei in eine einlesen Byte Array und übergeben Sie es an die encodeBase64String () Dienstprogrammmethode, die von der Google API-Client-Bibliothek angeboten wird.

Derzeit haben Sie jedoch nur den URI der ausgewählten Datei, nicht den absoluten Pfad. Das heißt, um die Datei lesen zu können, müssen Sie zuerst den URI auflösen. Sie können dies tun, indem Sie es an den übergeben openInputStream () Methode des Inhaltsauflösers Ihrer Aktivität. Sobald Sie Zugriff auf den Eingabestrom der Datei haben, können Sie ihn einfach an den übergeben toByteArray () Methode der IOUtils Klasse, um es in ein Array von Bytes zu konvertieren. Der folgende Code zeigt Ihnen wie:

AsyncTask.execute (new Runnable () @Override public void run () InputStream stream = getContentResolver () .openInputStream (soundUri); byte [] audioData = IOUtils.toByteArray (stream); stream.close ()); Base64.encodeBase64String (audioData); // mehr Code hier

Wie Sie im obigen Code sehen können, verwenden wir einen neuen Thread, um alle E / A-Vorgänge auszuführen. Dies ist wichtig, um sicherzustellen, dass die Benutzeroberfläche der App nicht einfriert.

Schritt 4: Spielen Sie die Datei ab

Meiner Meinung nach ist es eine gute Idee, die gerade transkribierte Sounddatei während der Transkription abzuspielen. Es ist nicht sehr anstrengend und verbessert die Benutzererfahrung.

Du kannst den ... benutzen Media Player Klasse, um die Sounddatei abzuspielen. Sobald Sie es auf den URI der Datei zeigen, verwenden Sie dessen setDataSource () Methode, müssen Sie seine aufrufen bereiten() Methode, um den Player synchron vorzubereiten. Wenn der Player bereit ist, können Sie ihn anrufen Start() Methode zum Starten der Wiedergabe der Datei.

Darüber hinaus müssen Sie daran denken, die Ressourcen des Players freizugeben, sobald die Datei vollständig abgespielt wurde. Weisen Sie dazu ein OnCompletionListener widerspreche es und nenne es Veröffentlichung() Methode. Der folgende Code zeigt Ihnen wie:

MediaPlayer-Player = neuer MediaPlayer (); player.setDataSource (MainActivity.this, soundUri); player.prepare (); player.start (); // Den Player freigeben. Player.setOnCompletionListener (neuer MediaPlayer.OnCompletionListener () @Override public void onCompletion (MediaPlayer) mediaPlayer) mediaPlayer.release ();;

Schritt 5: Synchronisieren Sie die Datei synchron

An diesem Punkt können wir die Base64-codierten Audiodaten an die Cloud-Sprach-API senden, um sie zu transkribieren. Als Erstes empfehle ich Ihnen, den zuvor generierten API-Schlüssel als Member-Variable Ihres zu speichern Aktivität Klasse.

private final String CLOUD_API_KEY = "ABCDEF1234567890";

Um mit der Cloud-Sprach-API kommunizieren zu können, müssen Sie eine Rede Objekt mit einem Speech.Builder Beispiel. Als Argument erwartet der Konstruktor einen HTTP-Transport und eine JSON-Factory. Um sicherzustellen, dass der API-Schlüssel in jeder HTTP-Anforderung an die API enthalten ist, müssen Sie außerdem einen SpeechRequestInitializer Objekt mit dem Builder und übergeben Sie den Schlüssel dazu.

Der folgende Code erstellt eine Rede Objekt mit der AndroidJsonFactory Klasse wie die JSON-Fabrik und die NetHttpTransport Klasse als HTTP-Transport:

Speech speechService = new Speech.Builder (AndroidHttp.newCompatibleTransport (), neue AndroidJsonFactory (), null) .setSpeechRequestInitializer (neuer SpeechRequestInitializer (CLOUD_API_KEY)) .build ();

Der Cloud-Sprach-API muss mitgeteilt werden, welche Sprache die Audiodatei enthält. Sie können dies tun, indem Sie eine RecognitionConfig Objekt und Aufruf seiner setLanguageCode () Methode. So konfigurieren Sie es, um nur amerikanisches Englisch zu transkribieren:

RecognitionConfig recognitionConfig = new RecognitionConfig (); recognitionConfig.setLanguageCode ("en-US");

Darüber hinaus muss die Base64-codierte Zeichenfolge in eine umschlossen werden RecognitionAudio Objekt, bevor es von der API verwendet werden kann.

RecognitionAudio recognitionAudio = new RecognitionAudio (); recognitionAudio.setContent (base64EncodedData);

Als nächstes verwenden Sie die RecognitionConfig und RecognitionAudio Objekte müssen Sie ein erstellen SyncRecognizeRequest Objekt. Wie der Name vermuten lässt, können Sie eine HTTP-Anforderung erstellen, um Audiodaten synchron zu transkribieren. Nachdem das Objekt erstellt wurde, können Sie es als Argument an den übergeben syncrecognize () Methode und rufen Sie das Ergebnis auf Speech.SpeechOperations.Syncrecognize Objekt ist ausführen() Methode, um die HTTP-Anfrage tatsächlich auszuführen.

Der Rückgabewert von ausführen() Methode ist a SyncRecognizeResponse Objekt, das mehrere alternative Transkripte enthalten kann. Im Moment verwenden wir nur die erste Alternative.

// Anforderung erstellen SyncRecognizeRequest request = new SyncRecognizeRequest (); request.setConfig (recognitionConfig); request.setAudio (recognitionAudio); // Antwort generieren SyncRecognizeResponse response = speechService.speech () .syncrecognize (request) .execute (); // Transkript extrahieren SpeechRecognitionResult result = response.getResults (). Get (0); final String transcript = result.getAlternatives (). get (0) .getTranscript ();

Um das Transkript schließlich dem Benutzer anzuzeigen, können Sie es an den Benutzer übergeben Textvorschau Widget. Da Änderungen an der Benutzeroberfläche immer im UI-Thread vorgenommen werden müssen, stellen Sie sicher, dass Sie dies tun, nachdem Sie Ihre Aktivitäten aufgerufen haben runOnUiThread () Methode.

runOnUiThread (new Runnable () @Override public void run () TextView speechToTextResult = (TextView) findViewById (R.id.speech_to_text_result); speechToTextResult.setText (transcript);;

Sie können jetzt Ihre App ausführen, eine FLAC-Datei auswählen, die Sprache in amerikanischem Englisch enthält, und das Cloud Speech-API ein Transkript dafür erstellen.

 

Erwähnenswert ist, dass die Cloud-Sprach-API derzeit nur einkanalige Audiodateien verarbeiten kann. Wenn Sie eine Datei mit mehreren Kanälen senden, erhalten Sie eine Fehlerantwort.

5. Verwenden der Cloud Natural Language API

Nun, da wir ein Transkript haben, können wir es an die Cloud Natural Language API übergeben, um es zu analysieren. Um dieses Tutorial kurz zu halten, führen wir nur eine Entity- und Sentiment-Analyse für das Transkript durch. Mit anderen Worten, wir werden alle Entitäten bestimmen, die in der Abschrift erwähnt werden, wie Personen, Orte und Berufe, und auch sagen, ob das Gesamtgefühl negativ, neutral oder positiv ist.

Schritt 1: Aktualisieren Sie das Layout

Damit der Benutzer die Analyse starten kann, muss unser Layout ein anderes enthalten Taste Widget. Fügen Sie der Layout-XML-Datei Ihrer Aktivität daher folgenden Code hinzu:

Schritt 2: Kommentieren Sie das Transkript

Die Cloud Natural Language-REST-API bietet eine Komfortoption namens annotateText Auf diese Weise können Sie sowohl die Gefühls- als auch die Entitätsanalyse für ein Dokument mit nur einer HTTP-Anforderung ausführen. Wir werden es verwenden, um unser Transkript zu analysieren.

Da die Analyse beginnen muss, wenn der Benutzer auf die Schaltfläche drückt, die wir im vorherigen Schritt erstellt haben, fügen Sie eine hinzu OnClickListener dazu.

Schaltfläche analysisButton = (Schaltfläche) findViewById (R.id.analyze_button); analyseButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (View view) // Mehr Code hier);

Um mit der API über die Google API-Clientbibliothek zu interagieren, müssen Sie eine CloudNaturalLanguage Objekt mit der CloudNaturalLanguage.Builder Klasse. Sein Konstruktor erwartet außerdem einen HTTP-Transport und eine JSON-Factory.

Durch Zuweisung von a CloudNaturalLanguageRequestInitializer So können Sie ihn zwingen, Ihren API-Schlüssel in alle seine Anforderungen aufzunehmen.

final CloudNaturalLanguage naturalLanguageService = new CloudNaturalLanguage.Builder (AndroidHttp.newCompatibleTransport (), neue AndroidJsonFactory (), null) .setCloudNaturalLanguageRequestInitializer (neuer CloudNaturalLanguageRequestInitialager ().

Der gesamte Text, den Sie mit Hilfe der API analysieren möchten, muss in ein Dokumentieren Objekt. Das Dokumentieren object muss außerdem Konfigurationsinformationen enthalten, z. B. die Sprache des Textes und ob es als Nur-Text oder HTML formatiert ist. Fügen Sie dementsprechend folgenden Code hinzu:

String transcript = ((TextView) findViewById (R.id.speech_to_text_result)) .getText (). ToString (); Dokument Dokument = neues Dokument (); document.setType ("PLAIN_TEXT"); document.setLanguage ("en-US"); document.setContent (Transkript);

Als Nächstes müssen Sie ein erstellen Eigenschaften Objekt, das die Merkmale angibt, die Sie analysieren möchten. Der folgende Code zeigt Ihnen, wie Sie eine Eigenschaften Objekt, das besagt, dass Sie Entitäten extrahieren und nur die Sentiment-Analyse ausführen möchten.

Features Features = neue Features (); features.setExtractEntities (true); features.setExtractDocumentSentiment (true);

Sie können jetzt die Dokumentieren und Eigenschaften Objekte zum Verfassen eines AnnotateTextRequest Objekt, das an den übergeben werden kann annotateText () Methode zur Erzeugung eines AnnotateTextResponse Objekt.

final AnnotateTextRequest request = new AnnotateTextRequest (); request.setDocument (Dokument); request.setFeatures (Funktionen); AsyncTask.execute (new Runnable () @Override public void run () Antwort von AnnotateTextResponse = naturalLanguageService.documents () .annotateText (request) .execute (); // hier mehr Code)

Beachten Sie, dass wir die Antwort in einem neuen Thread generieren, da Netzwerkoperationen im UI-Thread nicht zulässig sind.

Sie können eine Liste von Entitäten aus dem Ordner extrahieren AnnotateTextResponse Objekt durch Aufrufen seiner getEntities () Methode. Auf ähnliche Weise können Sie das Gesamtgefühl des Transkripts extrahieren, indem Sie die getDocumentSentiment () Methode. Um die tatsächliche Punktzahl des Gefühls zu erhalten, müssen Sie jedoch auch die getScore () Methode, die a zurückgibt schweben

Wie zu erwarten, bedeutet ein Sentiment-Score gleich Null, dass das Sentiment neutral ist, ein Score über Null bedeutet, dass das Sentiment positiv ist, und ein Score unter Null bedeutet, dass das Sentiment negativ ist.

Was Sie mit der Liste der Entitäten und der Sentiment-Bewertung tun, liegt natürlich bei Ihnen. Lassen Sie uns jetzt beide mit einem anzeigen AlertDialog Beispiel.

endgültige Liste entityList = response.getEntities (); final float sentiment = response.getDocumentSentiment (). getScore (); runOnUiThread (new Runnable () @Override public void run () String Entities = ""; für (Entity Entity: EntityList) Entities + = "\ n" + Entity.getName (). toUpperCase (); AlertDialog (AlertDialog) = new AlertDialog.Builder (MainActivity.this) .setTitle ("Sentiment:" + Sentiment) .setMessage ("Diese Audiodatei spricht über:" + Entitäten) .setNeutralButton ("Okay", null) .create (); Show();  );

Mit dem obigen Code wird die Stimmungsbewertung im Titel des Dialogs angezeigt, und die Liste der Entitäten wird im Hauptteil angezeigt.

Wenn Sie die App jetzt ausführen, sollten Sie den Inhalt von Audiodateien analysieren und transkribieren können.

 

Fazit

Sie wissen jetzt, wie Sie die Cloud Speech- und Cloud Natural Language-APIs zusammen verwenden, um eine Android-App zu erstellen, die nicht nur Audiodateien transkribieren, sondern auch Entity- und Sentiment-Analysen ausführen kann. In diesem Lernprogramm haben Sie außerdem gelernt, wie Sie mit Android Storage Access Framework und Google Client API-Bibliotheken arbeiten.

Google hat den beiden APIs regelmäßig neue und interessante Funktionen hinzugefügt und zusätzlich mehr Sprachen unterstützt. Um auf dem Laufenden zu bleiben, lesen Sie bitte die offizielle Dokumentation.

Und während Sie hier sind, lesen Sie einige unserer anderen Beiträge zu mobilen App-Cloud-Diensten und maschinellem Lernen!