O aplicație care înțelege cu adevărat o limbă naturală este ceva entuziasm sci-fi, programatori și cercetători AI au visat de zeci de ani. Astăzi, datorită avansurilor mari în tehnologiile de învățare automată, acest vis este mai aproape ca niciodată să devină realitate. Mai mult, serviciile bazate pe cloud, cum ar fi Învățarea Google Cloud Machine, au făcut aceste tehnologii disponibile în mod liber pentru a fi utilizate de toată lumea.
În acest tutorial, veți învăța cum să utilizați două API puternice pentru limbajul natural oferite de platforma Google Cloud Learning: Cloud Speech API și Cloud Natural Language API. Folosind-le împreună, puteți crea aplicații care se pot ocupa de vorbire într-o varietate de limbi vorbite pe scară largă.
Pentru a urmări, veți avea nevoie de:
O aplicație care poate procesa vorbirea trebuie să aibă următoarele capabilități:
API-urile Cloud Speech și Cloud Natural Language vă permit să adăugați capabilitățile de mai sus la aplicația Android într-o chestiune de minute.
API-ul de vorbire cloud servește ca un recunoaștere a vorbirii de ultimă oră, care poate transcrie cu precizie vorbirea în peste 80 de limbi. De asemenea, se poate ocupa de robustețea accentelor regionale și de condițiile zgomotoase.
Într-o notă similară, API-ul Cloud Natural Language este un sistem de procesare a limbajului care poate determina, cu precizie la nivel uman, rolurile cuvintelor jucate în propozițiile date. În prezent, acceptă zece limbi și oferă, de asemenea, o analiză a entității și sentimentului.
Înainte de a utiliza API-urile Speech and Natural Language, trebuie să le activați în consola Google Cloud. Deci, conectați-vă la consola și navigați la API Manager> Bibliotecă.
Pentru a activa API-ul de vorbire, faceți clic pe Speech API link în Google Cloud Machine Learning secțiune. În pagina care se deschide în continuare, apăsați pe Permite buton.
Apăsați butonul din spate al browserului pentru a reveni la pagina anterioară.
De data aceasta, activați API-ul de limbă naturală făcând clic pe API pentru limbajul natural și apăsați pe Permite butonul din pagina următoare.
Veți avea nevoie de o cheie API în timp ce interacționați cu API-urile. Dacă nu aveți deja unul, deschideți-l scrisori de acreditare , apăsați pe Creați acreditări butonul și alegeți Cheia API.
Veți vedea acum un pop-up care afișează cheia API. Rețineți-le ca să le puteți utiliza mai târziu.
Ambele API-uri sunt bazate pe JSON și au puncte de referință REST pe care le puteți interacționa direct folosind orice bibliotecă de rețea. Cu toate acestea, puteți salva o mulțime de timp - și, de asemenea, puteți scrie coduri mai ușor de citit, utilizând bibliotecile Google API Client disponibile pentru ele. Deschide-l build.gradle fișierul proiectului dvs. aplicaţia
și adăugați următoarele compila
dependențele față de acesta:
compilați com.google.api-client: google-api-client-android: 1.22.0 compilați com.google.apis: google-api-services-speech: v1beta1-rev336-1.22.0 compilați com. google.apis: google-api-services-language: v1beta2-rev6-1.22.0 'compilați com.google.code.findbugs: jsr305: 2.0.1'
În plus, vom efectua câteva operații de I / O în acest tutorial. Pentru a le simplifica, adăugați a compila
dependență pentru biblioteca comună IO.
compile 'commons-io: commons-io: 2.5'
În cele din urmă, nu uitați să cereți INTERNET
permisiunea în AndroidManifest.xml fişier. Fără aceasta, aplicația dvs. nu se va putea conecta la serverele Google.
Este de la sine înțeles că Cloud Speech API se așteaptă ca datele audio ca una dintre intrările sale. Prin urmare, vom crea acum o aplicație Android care să poată transcrie fișiere audio.
Pentru a ne menține simplu, vom transcrie doar fișierele FLAC, fișierele care utilizează formatul de codare audio fără pierderi audio. S-ar putea să aveți deja astfel de fișiere pe dispozitiv. Dacă nu, sugerăm să descărcați câteva din Wikimedia Commons.
Aplicația aplicației noastre va avea a Buton
utilizatorii de widget-uri pot apăsa pentru a afișa un selector de fișiere, o interfață în care pot naviga și selecta fișierele audio disponibile pe dispozitivele lor.
Structura va avea, de asemenea, a TextView
widget pentru afișarea transcrierii fișierului audio selectat. În consecință, adăugați următorul cod în fișierul XML de aspect al activității dvs .:
Interfața de selectare a fișierelor ar trebui să fie afișată atunci când utilizatorul apasă butonul pe care l-am creat în etapa anterioară, asociați-o astfel OnClickListener
obiect cu el. Înainte de a face acest lucru, asigurați-vă că ați inițializat butonul folosind findViewById ()
metodă.
Butonul browseButton = (buton) findViewById (R.id.browse_button); browseButton.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) // Mai mult cod aici);
Cu ajutorul platformei Android Access Storage, care este disponibil pe dispozitive care rulează API nivel 19 sau mai mult, crearea unui dispozitiv de selectare a fișierelor necesită foarte puține eforturi. Tot ce trebuie să faceți este să creați o intenție pentru ACTION_GET_CONTENT
acțiune și să o transmită la startActivityForResult ()
metodă. Opțional, puteți restricționa selectorul de fișiere să afișeze numai fișiere FLAC prin trecerea tipului MIME corespunzător la settype ()
metodă a scop
obiect.
Intent filePicker = intenție nouă (Intent.ACTION_GET_CONTENT); filePicker.setType ( "audio / FLAC"); startActivityForResult (filePicker, 1);
Rezultatul selectorului de fișiere va fi altul scop
obiect care conține URI-ul fișierului selectat de utilizator. Pentru a putea accesa aceasta, trebuie să ignorați onActivityResult ()
metoda dvs. Activitate
clasă.
@Override protejat void onActivityResult (int requestCode, int resultCode, date intenție) super.onActivityResult (requestCode, resultCode, data); dacă (resultCode == RESULT_OK) final Uri soundUri = data.getData (); // Mai multe cod aici
Cloud Speech API se așteaptă ca datele audio să fie sub forma unui șir Base64. Pentru a genera un astfel de șir, puteți citi conținutul fișierului pe care utilizatorul la selectat octet
și transferați-l la encodeBase64String ()
utilitate oferită de biblioteca de clienți API Google.
Cu toate acestea, aveți în prezent numai URI-ul fișierului selectat, nu calea absolută. Aceasta înseamnă că, pentru a putea citi fișierul, trebuie să rezolvați mai întâi URI-ul. Puteți face acest lucru prin trecerea lui la openInputStream ()
metoda de rezolvare a conținutului activității dvs. Odată ce ați acces la fluxul de intrare al fișierului, îl puteți transfera pur și simplu la toByteArray ()
metodă a IOUtils
clasa pentru ao converti într-o serie de octeți. Următorul cod vă arată cum:
AsyncTask.execute (new Runnable) @Override public void run () InputStream stream = getContentResolver () .openInputStream (soundUri); byte [] audioData = IOUtils.toByteArray (flux); stream.close (); String base64EncodedData = Base64.encodeBase64String (audioData); // Mai mult cod aici
După cum puteți vedea în codul de mai sus, folosim un fir nou pentru a rula toate operațiile I / O. Acest lucru este important pentru a vă asigura că interfața de utilizare a aplicației nu îngheață.
În opinia mea, interpretarea fișierului de sunet care este transcris, în timp ce este transcris, este o idee bună. Nu necesită mult efort și îmbunătățește experiența utilizatorului.
Puteți utiliza funcția Media Player
pentru a reda fișierul de sunet. Odată ce ați indicat-o la URI-ul fișierului folosind setDataSource ()
metoda, trebuie să-i numiți a pregati()
pentru a pregăti sincron playerul. Când playerul este gata, îl puteți apela start()
pentru a începe redarea fișierului.
În plus, trebuie să vă amintiți să eliberați resursele playerului după finalizarea redării fișierului. Pentru a face acest lucru, atribuiți un OnCompletionListener
obiectează la el și îl numește eliberare()
metodă. Următorul cod vă arată cum:
Player MediaPlayer = MediaPlayer nou (); player.setDataSource (MainActivity.this, soundUri); player.prepare (); player.start (); // Eliberați playerul player.setOnCompletionListener (noul MediaPlayer.OnCompletionListener () @Override public void onCompletion (MediaPlayer mediaPlayer) mediaPlayer.release (););
În acest moment, putem trimite datele audio codate Base64 la API-ul de vorbire cloud pentru a le transcrie. Dar, mai întâi, vă sugerăm să stocați cheia API pe care ați generat-o mai devreme ca variabilă membru al dvs. Activitate
clasă.
finală privată finală CLOUD_API_KEY = "ABCDEF1234567890";
Pentru a putea comunica cu API-ul de vorbire cloud, trebuie să creați o Vorbire
obiect utilizând a Speech.Builder
instanță. Ca argumente, constructorul său așteaptă un transport HTTP și o fabrică JSON. În plus, pentru a vă asigura că cheia API este inclusă în fiecare solicitare HTTP către API, trebuie să asociați a SpeechRequestInitializer
obiect cu constructorul și treci cheia la el.
Următorul cod creează o Vorbire
obiect folosind AndroidJsonFactory
clasa ca fabrica JSON și NetHttpTransport
clasa ca transport HTTP:
Speech speechService = noul Speech.Builder (AndroidHttp.newCompatibleTransport (), noul AndroidJsonFactory (), null) .setSpeechRequestInitializer (noul SpeechRequestInitializer (CLOUD_API_KEY)) .build ();
API-ul de vorbire cloud trebuie să spună ce limbă conține fișierul audio. Puteți face acest lucru prin crearea unui RecognitionConfig
obiect și numirea lui setLanguageCode ()
metodă. Iată cum îl configurați pentru a transcrie numai limba engleză americană:
RecunoaștereConfig recognitionConfig = RecognitionConfig nou (); recognitionConfig.setLanguageCode ( "en-US");
În plus, șirul codat Base64 trebuie să fie înfășurat într-un a RecognitionAudio
obiecte înainte ca acestea să poată fi utilizate de API.
RecunoaștereAudio recognitionAudio = new RecognitionAudio (); recognitionAudio.setContent (base64EncodedData);
Apoi, folosind RecognitionConfig
și RecognitionAudio
obiecte, trebuie să creați o SyncRecognizeRequest
obiect. După cum sugerează și numele, vă permite să creați o solicitare HTTP pentru a transcrie sincron datele audio. Odată ce obiectul a fost creat, îl puteți transmite ca argument la syncrecognize ()
și apelați rezultatul Speech.SpeechOperations.Syncrecognize
obiecte a executa()
pentru a executa efectiv solicitarea HTTP.
Valoarea returnată a a executa()
metoda este a SyncRecognizeResponse
obiect, care poate conține mai multe transcrieri alternative. Pentru moment, vom folosi doar prima alternativă.
// Crearea cererii SyncRecognizeRequest request = new SyncRecognizeRequest (); request.setConfig (recognitionConfig); request.setAudio (recognitionAudio); // Generarea răspunsului SyncRecognizeResponse response = speechService.speech () .syncrecognize (request) .execute (); // extrageți transcrierea SpeechRecognitionResult result = response.getResults (). Get (0); fișierul final de tip String = result.getAlternatives () get (0) .getTranscript ();
În cele din urmă, pentru a afișa transcrierea către utilizator, îl puteți transfera la TextView
widget. Desigur, deoarece schimbările la interfața cu utilizatorul trebuie să se întâmple întotdeauna pe firul UI, asigurați-vă că faceți acest lucru după apelarea activității dvs. runOnUiThread ()
metodă.
runOnUiThread (noul Runnable () @Override public void run () TextView speechToTextResult = (TextView) findViewById (R.id.speech_to_text_result); speechToTextResult.setText (transcriere););
Acum puteți rula aplicația dvs., puteți selecta un fișier FLAC care să conțină vorbire în limba engleză americană și puteți vedea că API-ul vorbirii Cloud generează o transcriere pentru el.
Merită menționat faptul că API-ul Cloud Speech poate procesa în prezent numai fișiere audio cu un singur canal. Dacă trimiteți un fișier cu mai multe canale la acesta, veți primi un răspuns de eroare.
Acum, când avem o transcriere, putem să o transmitem API-ului Cloud Natural Language API pentru al analiza. Pentru a păstra scurt acest tutorial, vom rula doar analiza entității și a sentimentului pe transcriere. Cu alte cuvinte, vom determina toate entitățile care sunt menționate în procesul-verbal, cum ar fi oamenii, locurile și profesiile, și, de asemenea, să spunem dacă sentimentul general este negativ, neutru sau pozitiv.
Pentru a permite utilizatorului să înceapă analiza, aspectul nostru trebuie să conțină altul Buton
widget. Prin urmare, adăugați următorul cod în fișierul XML de aspect al activității:
REST API pentru limba limbajului natural oferă o opțiune de confort numită annotateText care vă permite să executați atât analiza sentimentului, cât și a entității pe un document cu o singură cerere HTTP. O vom folosi pentru a analiza transcrierea noastră.
Deoarece analiza trebuie să înceapă atunci când utilizatorul apasă pe butonul creat în pasul anterior, adăugați un OnClickListener
la el.
Buton analyzeButton = (buton) findViewById (R.id.analyze_button); analyzeButton.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare vizualizare) // Mai mult cod aici);
Pentru a interacționa cu API utilizând biblioteca de clienți API Google, trebuie să creați o CloudNaturalLanguage
obiect folosind CloudNaturalLanguage.Builder
clasă. Constructorul său așteaptă de asemenea un transport HTTP și o fabrică JSON.
Mai mult, prin atribuirea unui a CloudNaturalLanguageRequestInitializer
pentru aceasta, îl puteți forța să includă cheia dvs. API în toate solicitările sale.
final CloudNaturalLanguage naturalLanguageService = nou CloudNaturalLanguage.Builder (AndroidHttp.newCompatibleTransport (), noul AndroidJsonFactory (), null) .setCloudNaturalLanguageRequestInitializer (noul CloudNaturalLanguageRequestInitializer (CLOUD_API_KEY)) .build ();
Tot textul pe care doriți să îl analizați utilizând API trebuie plasat în interiorul a Document
obiect. Document
obiectul trebuie să conțină și informații de configurare, cum ar fi limba textului și dacă este formatat ca text simplu sau HTML. În consecință, adăugați următorul cod:
String transcript = ((TextView) findViewById (R.id.speech_to_text_result)) .getText () .toString (); Document document = document nou (); document.setType ( "PLAIN_TEXT"); document.setLanguage ( "en-US"); document.setContent (transcriere);
În continuare, trebuie să creați o Caracteristici
obiect specificând caracteristicile care vă interesează în analiză. Următorul cod vă arată cum să creați un Caracteristici
obiect care spune că doriți să extrageți entități și să rulați numai analiza sentimentului.
Caracteristici caracteristici = Caracteristici noi (); features.setExtractEntities (true); features.setExtractDocumentSentiment (true);
Acum puteți folosi Document
și Caracteristici
obiecte pentru a compune un AnnotateTextRequest
obiect, care poate fi trecut la annotateText ()
metoda de a genera un AnnotateTextResponse
obiect.
finală AnnotateTextRequest request = new AnnotateTextRequest (); request.setDocument (documentul); request.setFeatures (caracteristici); AsyncTask.execute (noul Runnable () @Override public void run () AnnotateTextResponse răspuns = naturalLanguageService.documents () .annotateText (cerere) .execute (); // Mai multe cod aici
Rețineți că generăm răspunsul într-un fir nou deoarece operațiile de rețea nu sunt permise pe firul UI.
Puteți extrage o listă de entități din AnnotateTextResponse
obiect prin apelarea sa getEntities ()
metodă. În mod similar, puteți extrage sentimentul general al transcrierii apelând getDocumentSentiment ()
metodă. Pentru a obține scorul real al sentimentului, totuși, trebuie să apelați și getScore ()
, care returnează a pluti
.
Așa cum vă puteți aștepta, un scor de sentiment egal cu zero înseamnă că sentimentul este neutru, un scor mai mare decât zero înseamnă că sentimentul este pozitiv și un scor mai mic decât zero înseamnă că sentimentul este negativ.
Ce faceți cu lista entităților și scorul sentimentului este, desigur, la latitudinea dvs. Pentru moment, hai să le afișăm pe amândouă folosind un AlertDialog
instanță.
lista finalăentityList = answer.getEntities (); ultimul sentiment float = response.getDocumentSentiment (). getScore (); runOnUiThread (noul Runnable () @Override public void run () entități String = ""; pentru (Entită entitate: entityList) entities + = " = new AlertDialog.Builder (MainActivity.this) .setTitle ("Sentiment:" + sentiment) .setMessage ("Acest fișier audio vorbește despre:" + entități) .setNeutralButton ("Okay", null). spectacol(); );
Cu codul de mai sus, scorul sentiment va fi afișat în titlul dialogului, iar lista entităților va fi afișată în corpul său.
Dacă rulați aplicația acum, ar trebui să puteți analiza conținutul fișierelor audio, precum și transcrierea acestora.
Acum știți cum să utilizați împreună API-urile Cloud Speech și Cloud Natural Language pentru a crea o aplicație Android care nu numai că poate transcrie un fișier audio, dar poate și să efectueze analiza entității și a sentimentului pe aceasta. În acest tutorial, de asemenea, ați învățat cum să lucrați cu bibliotecile API pentru stocare în Android și bibliotecile API pentru clienți Google.
Google a adăugat în mod regulat noi și interesante funcții - împreună cu suport pentru mai multe limbi - la ambele API-uri. Pentru a rămâne la curent cu acestea, consultați documentația oficială.
Și în timp ce sunteți aici, verificați câteva dintre celelalte postări despre serviciile cloud pentru aplicații mobile și învățarea în mașină!