Opprett en intelligent app med Google Cloud Tale og Natural Language APIs

En applikasjon som virkelig forstår et naturlig språk er noe sci-fi entusiaster, programmerere og AI-forskere har drømt om i flere tiår. I dag, takket være store fremskritt innen maskinlæringsteknologi, er drømmen nærmere enn noensinne å bli en realitet. I tillegg har skybaserte tjenester som Google Cloud Machine Learning gjort disse teknologiene fritt tilgjengelige for alle å bruke.

I denne opplæringen lærer du hvordan du bruker to kraftige naturlige språkorienterte APIer som tilbys av Google Cloud Machine Learning-plattformen: Cloud Speech API og Cloud Natural Language API. Ved å bruke dem sammen, kan du opprette apper som kan håndtere tale på mange språk.

Forutsetninger

Å følge med, du trenger:

  • Android Studio 2.2 eller høyere
  • en Google Cloud Platform-konto
  • en enhet som kjører Android 4.4 eller høyere

1. Hvorfor bruke disse APIene?

Et program som kan behandle tale må ha følgende muligheter:

  • Den må kunne trekke ut enkelte ord fra rå lyddata.
  • Det må kunne utdanne gjetninger om de grammatiske forholdene mellom ordene det har hentet ut.

API-modulene Cloud Speech and Cloud Natural Language lar deg legge til de ovennevnte funksjonene i Android-appen din i løpet av få minutter.

Cloud Speech API fungerer som en state-of-the-art tale gjenkjenning som kan nøyaktig transkribere tale på over 80 språk. Det kan også håndtere regionale aksenter og støyende forhold.

I et lignende notat er Cloud Natural Language API et språkbehandlingssystem som med nøyaktighet på nærnivå kan bestemme rollene som ord spiller i setninger som er gitt til det. Den støtter for tiden ti språk, og det tilbyr også entitet og sentimentanalyse.

2. Aktivere APIene

Før du bruker tale- og natursprog-APIer, må du aktivere dem i Google Cloud-konsollen. Så logg inn på konsollen og naviger til API Manager> Bibliotek.

For å aktivere Tale API, klikk på Tale API lenke i Google Cloud Machine Learning seksjon. På siden som åpnes neste, trykk på Aktiver knapp.

Trykk på webleserens tilbakeknapp for å gå tilbake til forrige side.

Denne gangen aktiverer du Natural Language API ved å klikke på Natural Language API lenke og trykke på Aktiver knappen på neste side.

Du trenger en API-nøkkel mens du samhandler med APIene. Hvis du ikke har en allerede, åpner du legitimasjon fanen, trykk på Opprett legitimasjon knappen, og velg API-nøkkel.

Du ser nå en popup-visning som viser API-nøkkelen din. Merk det ned slik at du kan bruke det senere.

3. Konfigurere prosjektet ditt

Begge APIene er JSON-baserte og har REST-sluttpunkter du kan kommunisere med direkte ved hjelp av et nettverksbibliotek. Du kan imidlertid spare mye tid - og skrive også mer lesbar kode - ved hjelp av Google API Client-biblioteker tilgjengelig for dem. Så åpne build.gradle fil av prosjektet ditt app modul og legg til følgende kompilere avhengigheter til det:

kompilere 'com.google.api-client: google-api-client-android: 1.22.0' compile 'com.google.apis: google-api-services-tale: v1beta1-rev336-1.22.0' compile 'com. google.apis: google-api-services-språk: v1beta2-rev6-1.22.0 'compile' com.google.code.findbugs: jsr305: 2.0.1 '

I tillegg vil vi utføre noen fil-I / O-operasjoner i denne opplæringen. For å forenkle dem, legg til en kompilere avhengighet for Commons IO biblioteket.

kompilere 'commons-io: commons-io: 2,5'

Til slutt, ikke glem å be om INTERNETT tillatelse i AndroidManifest.xml fil. Uten det er appen din ikke i stand til å koble til Googles servere.

4. Bruk av Cloud Speech API

Det er selvsagt at Cloud Speech API forventer lyddata som en av dens innganger. Derfor lager vi nå en Android-app som kan transkribere lydfiler. 

For å holde det enkelt, transkriberer vi bare FLAC-filer, filer som bruker Free Lossless Audio Codec-kodingsformatet. Du har kanskje allerede slike filer på enheten. Hvis du ikke gjør det, foreslår jeg at du laster ned noen fra Wikimedia Commons.

Trinn 1: Lag en layout

Vår apps layout vil ha en Knapp Widget-brukere kan trykke for å vise en filvelger, et grensesnitt der de kan bla gjennom og velge lydfiler som er tilgjengelige på deres enheter.

Oppsettet vil også ha en TextView widget for å vise transkripsjonen av den valgte lydfilen. Følgelig legg til følgende kode i aktivitetsens layout XML-fil:

 

Trinn 2: Opprett en filvelger

Filvelgergrensesnittet skal vises når brukeren trykker på knappen vi opprettet i forrige trinn, så forbinder en OnClickListener gjenstand med det. Før du gjør det, må du passe på at du initialiserer knappen ved hjelp av findViewById () metode.

Button browseButton = (Button) findViewById (R.id.browse_button); browseButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (View view) // Mer kode her);

Med Android's Storage Access Framework, som er tilgjengelig på enheter som kjører API-nivå 19 eller høyere, er det svært liten innsats å lage en filvelger. Alt du trenger å gjøre er å skape en hensikt for ACTION_GET_CONTENT handling og send det til startActivityForResult () metode. Eventuelt kan du begrense filvelgeren for å vise bare FLAC-filer ved å sende den aktuelle MIME-typen til setType () metode av Intent gjenstand.

Intent filePicker = ny Intent (Intent.ACTION_GET_CONTENT); filePicker.setType ( "audio / FLAC"); startActivityForResult (filePicker, 1);

Utgangen av filvelgeren vil være en annen Intent objekt som inneholder URI av filen som brukeren valgte. For å kunne få tilgang til det, må du overstyre onActivityResult () metode for din Aktivitet klasse.

@Override protected void onActivityResult (int requestCode, int resultCode, Intent data) super.onActivityResult (requestCode, resultCode, data); hvis (resultCode == RESULT_OK) endelig Uri soundUri = data.getData (); // Mer kode her

Trinn 3: Kode inn filen

Cloud Speech API forventer at lyddataene skal være i form av en Base64-streng. For å generere en slik streng kan du lese innholdet i filen som brukeren har valgt i en byte array og send det til encodeBase64String () verktøymetoden som tilbys av Google API-klientbiblioteket.

Men du har for øyeblikket bare URIen til den valgte filen, ikke den absolutte banen. Det betyr at du må løse URI først for å kunne lese filen. Du kan gjøre det ved å sende det til openInputStream () Metode for aktivitetens innholdsoppløsning. Når du har tilgang til inngangsstrømmen til filen, kan du bare sende den til toByteArray () metode av IOUtils klassen for å konvertere den til en rekke byte. Følgende kode viser deg hvordan:

AsyncTask.execute (ny Runnable () @Override public void run () InputStream stream = getContentResolver () .openInputStream (soundUri); byte [] audioData = IOUtils.toByteArray (stream); stream.close (); String base64EncodedData = Base64.encodeBase64String (audioData); // Mer kode her

Som du ser i koden ovenfor bruker vi en ny tråd for å kjøre alle I / O-operasjonene. Å gjøre det er viktig for å sikre at appens brukergrensesnitt ikke fryser.

Trinn 4: Spill filen

Etter min mening er det en god ide å spille lydfilen som transkriberes, mens den transkriberes. Det tar ikke mye innsats, og det forbedrer brukeropplevelsen.

Du kan bruke Mediaspiller klassen for å spille lydfilen. Når du peker det til URI av filen ved hjelp av dens setDataSource () Metode, du må ringe det forberede() Metode for å synkronisere forberedelsene til spilleren. Når spilleren er klar, kan du ringe den start() metode for å begynne å spille filen.

I tillegg må du huske å frigjøre spillerens ressurser når den har fullført spillingen. For å gjøre dette, tilordne en OnCompletionListener motsette seg det og ringe det utgivelse() metode. Følgende kode viser deg hvordan:

MediaPlayer player = ny MediaPlayer (); player.setDataSource (MainActivity.this, soundUri); player.prepare (); player.start (); // Slett spilleren player.setOnCompletionListener (ny MediaPlayer.OnCompletionListener () @Override public void onCompletion (MediaPlayer mediaPlayer) mediaPlayer.release (););

Trinn 5: Transkriberer filen synkront

På dette tidspunktet kan vi sende Base64-kodede lyddata til Cloud Speech API for å transkribere den. Men først foreslår jeg at du lagrer API-nøkkelen du genererte tidligere som en medlemsvariabel for din Aktivitet klasse.

privat endelig streng CLOUD_API_KEY = "ABCDEF1234567890";

For å kunne kommunisere med Cloud Speech API må du opprette en Tale objekt ved hjelp av a Speech.Builder forekomst. Som argumenter forventer konstruktøren en HTTP-transport og en JSON-fabrikk. I tillegg for å sikre at API-nøkkelen er inkludert i hver HTTP-forespørsel til API, må du knytte en SpeechRequestInitializer gjenstand med bygmesteren og pass nøkkelen til den.

Følgende kode oppretter en Tale objekt ved hjelp av AndroidJsonFactory klasse som JSON fabrikk og NetHttpTransport klasse som HTTP-transport:

Tale speechService = ny Speech.Builder (AndroidHttp.newCompatibleTransport (), ny AndroidJsonFactory (), null) .setSpeechRequestInitializer (ny SpeechRequestInitializer (CLOUD_API_KEY)) .build ();

Cloud Speech API må bli fortalt hvilket språk lydfilen inneholder. Du kan gjøre det ved å opprette en RecognitionConfig objekt og ringe det setLanguageCode () metode. Slik konfigurerer du den til å transkribe kun amerikansk engelsk:

RecognitionConfig recognitionConfig = ny RecognitionConfig (); recognitionConfig.setLanguageCode ( "no-NO");

I tillegg må den Base64-kodede strengen pakkes inn i en RecognitionAudio objekt før det kan brukes av API.

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

Deretter bruker du RecognitionConfig og RecognitionAudio objekter, du må opprette en SyncRecognizeRequest gjenstand. Som navnet antyder, kan du opprette en HTTP-forespørsel for å synkront transkribere lyddata. Når objektet er opprettet, kan du sende det som et argument til syncrecognize () metode og ring den resulterende Speech.SpeechOperations.Syncrecognize objektets henrette() metode for å faktisk utføre HTTP-forespørselen.

Returneringsverdien til henrette() metoden er a SyncRecognizeResponse objekt, som kan inneholde flere alternative transkripsjoner. For nå bruker vi bare det første alternativet.

// Opprett forespørsel SyncRecognizeRequest request = ny SyncRecognizeRequest (); request.setConfig (recognitionConfig); request.setAudio (recognitionAudio); // Generer svar SyncRecognizeResponse response = speechService.speech () .syncrecognize (request) .execute (); // Extract transkripsjon SpeechRecognitionResult result = response.getResults (). Get (0); siste String transkript = result.getAlternatives (). get (0) .getTranscript ();

Til slutt, for å vise transkripsjonen til brukeren, kan du sende den til TextView widget. Selvfølgelig, fordi endringer i brukergrensesnittet alltid må skje på brukergrensesnittet, må du sørge for at du gjør det etter at du har ringt aktiviteten din runOnUiThread () metode.

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

Du kan nå kjøre appen din, velge en FLAC-fil som inneholder tale i amerikansk engelsk, og se Cloud Speech API generere et transkripsjon for det.

 

Det er verdt å nevne at Cloud Speech API for øyeblikket bare kan behandle barekanal lydfiler. Hvis du sender en fil med flere kanaler til den, får du et feilsvar.

5. Bruk av Cloud Natural Language API

Nå som vi har et utskrift, kan vi sende det til Cloud Natural Language API for å analysere det. For å holde denne opplæringen kort, kjører vi bare enhet og følelsesanalyse på transkripsjonen. Med andre ord skal vi avgjøre alle enhetene som er nevnt i transkripsjonen, for eksempel mennesker, steder og yrker, og også fortelle om dens generelle følelse er negativ, nøytral eller positiv.

Trinn 1: Oppdater oppsettet

For å la brukeren starte analysen, må vårt layout inneholde en annen Knapp widget. Legg derfor til følgende kode i din aktivitets layout XML-fil:

Trinn 2: Merk av transkripsjonen

Cloud Natural Language REST API tilbyr et bekvemmelighetsalternativ som heter annotateText som lar deg kjøre både sentiment og enhet analyse på et dokument med bare en HTTP forespørsel. Vi bruker den til å analysere utskrift.

Fordi analysen må begynne når brukeren trykker på knappen vi opprettet i forrige trinn, legger du til en OnClickListener til det.

Knapp analyseButton = (Button) findViewById (R.id.analyze_button); analyzeButton.setOnClickListener (new View.OnClickListener () @Override public void onClick (View view) // Mer kode her);

For å samhandle med API-en ved hjelp av Google API-klientbiblioteket, må du opprette en CloudNaturalLanguage objekt ved hjelp av CloudNaturalLanguage.Builder klasse. Konstruktøren forventer også en HTTP-transport og en JSON-fabrikk.

Videre ved å tildele en CloudNaturalLanguageRequestInitializer Eksempel på det, du kan tvinge det til å inkludere API-nøkkelen i alle forespørsler.

siste CloudNaturalLanguage naturalLanguageService = ny CloudNaturalLanguage.Builder (AndroidHttp.newCompatibleTransport (), ny AndroidJsonFactory (), null) .setCloudNaturalLanguageRequestInitializer (ny CloudNaturalLanguageRequestInitializer (CLOUD_API_KEY)) .build ();

All teksten du vil analysere ved hjelp av API, må plasseres inne i a Dokument gjenstand. De Dokument Objektet må også inneholde konfigurasjonsinformasjon, for eksempel tekstens språk og om det er formatert som vanlig tekst eller HTML. Følg derfor følgende kode:

String transkripsjon = ((TextView) findViewById (R.id.speech_to_text_result)) .getText (). ToString (); Dokumentdokument = nytt dokument (); document.setType ( "PLAIN_TEXT"); document.setLanguage ( "no-NO"); document.setContent (transkript);

Deretter må du opprette en Egenskaper objekt som angir funksjonene du er interessert i å analysere. Følgende kode viser hvordan du lager en Egenskaper objekt som sier at du vil trekke ut enheter og kun kjøre sentimentanalyse.

Funksjonsfunksjoner = nye funksjoner (); features.setExtractEntities (true); features.setExtractDocumentSentiment (true);

Du kan nå bruke Dokument og Egenskaper objekter å komponere en AnnotateTextRequest objekt, som kan sendes til annotateText () metode for å generere en AnnotateTextResponse gjenstand.

siste AnnotateTextRequest request = ny AnnotateTextRequest (); request.setDocument (dokument); request.setFeatures (funksjoner); AsyncTask.execute (new Runnable () @Override public void run () AnnotateTextResponse response = naturalLanguageService.documents () .annotateText (request) .execute (); // Mer kode her

Vær oppmerksom på at vi genererer svaret i en ny tråd fordi nettverksoperasjoner ikke er tillatt på brukergrensesnittet.

Du kan trekke ut en liste over enheter fra AnnotateTextResponse objekt ved å ringe det getEntities () metode. På samme måte kan du trekke ut den generelle følelsen av transkripsjonen ved å ringe getDocumentSentiment () metode. For å få den faktiske poengsummen til følelsen, må du imidlertid også ringe getScore () metode, som returnerer a flyte

Som du kanskje forventer, er en følelsespoeng som er null, følelsen er nøytral, en poengsum større enn null betyr at følelsen er positiv, og en poengsum mindre enn null betyr at følelsen er negativ.

Hva du gjør med listen over enheter og følelsespoenget er selvfølgelig opp til deg. For nå, la oss bare vise dem begge ved hjelp av en AlertDialog forekomst.

siste liste 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 = ny AlertDialog.Builder (MainActivity.this) .setTitle ("Sentiment:" + sentiment) .setMessage ("Denne lydfilen snakker om:" + enheter) .setNeutralButton ("Okay", null) .create (); dialog. vise fram();  );

Med den ovennevnte koden vil følgescore vises i tittelen på dialogboksen, og listen over enheter vil bli vist i kroppen.

Hvis du kjører appen nå, bør du kunne analysere innholdet av lydfiler, samt transkribere dem.

 

Konklusjon

Du vet nå hvordan du bruker APIs for Cloud Tale og Cloud Natural Language til å lage en Android-app som ikke bare kan transkribere en lydfil, men også kjøre enhet og sentimentanalyse på den. I denne opplæringen lærte du også å jobbe med Android's Storage Access Framework og Google Client API-biblioteker.

Google har regelmessig lagt til nye og interessante funksjoner - sammen med støtte for flere språk - til begge APIene. For å holde seg oppdatert om dem, se den offisielle dokumentasjonen.

Og mens du er her, kan du sjekke ut noen av våre andre innlegg på mobilapps-tjenester og maskinlæring!