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.
Å følge med, du trenger:
Et program som kan behandle tale må ha følgende muligheter:
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.
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.
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.
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.
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:
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
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.
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 (););
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.
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.
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:
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 listeentityList = 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.
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!