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.
Um mitzumachen, brauchst du:
Eine Anwendung, die Sprache verarbeiten kann, muss über die folgenden Funktionen verfügen:
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.
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.
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.
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.
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:
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
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.
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 ();;
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.
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.
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:
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 ListeentityList = 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.
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!