Un'applicazione che comprende veramente un linguaggio naturale è qualcosa di entusiasta di appassionati di fantascienza, programmatori e ricercatori di IA che sognano da decenni. Oggi, grazie ai grandi progressi nelle tecnologie di apprendimento automatico, questo sogno è più vicino che mai a diventare una realtà. Inoltre, i servizi basati sul cloud come Google Cloud Machine Learning hanno reso queste tecnologie liberamente disponibili per tutti.
In questo tutorial imparerai come utilizzare due potenti API orientate al linguaggio naturale offerte dalla piattaforma di apprendimento di Google Cloud Machine: Cloud Speech API e Cloud Natural Language API. Usandoli insieme, è possibile creare app in grado di gestire il parlato in una varietà di lingue ampiamente parlate.
Per seguire, avrai bisogno di:
Un'applicazione che può elaborare la voce deve avere le seguenti funzionalità:
Le API Cloud Speech e Cloud Natural Language ti consentono di aggiungere le funzionalità di cui sopra alla tua app Android in pochi minuti.
L'API Cloud Speech funge da riconoscimento vocale all'avanguardia in grado di trascrivere accuratamente il parlato in oltre 80 lingue. Può anche gestire in modo efficace accenti regionali e condizioni rumorose.
In una nota simile, l'API Cloud Natural Language è un sistema di elaborazione del linguaggio che può, con accuratezza quasi umana, determinare il ruolo delle parole dei ruoli nelle frasi assegnate. Attualmente supporta dieci lingue e offre anche analisi di entità e sentimento.
Prima di utilizzare le API di sintesi vocale e linguaggio naturale, devi attivarle nella console di Google Cloud. Quindi accedi alla console e vai a Gestione API> Libreria.
Per abilitare l'API vocale, fai clic su API vocale collegamento nel Google Cloud Machine Learning sezione. Nella pagina che si apre dopo, premi il tasto Abilitare pulsante.
Premi il pulsante Indietro del browser per tornare alla pagina precedente.
Questa volta, abilita l'API Natural Language facendo clic su API di linguaggio naturale link e premendo il tasto Abilitare pulsante nella pagina successiva.
Avrai bisogno di una chiave API mentre interagisci con le API. Se non ne hai già uno, apri il Credenziali scheda, premere il Crea credenziali pulsante e scegliere Chiave API.
Ora vedrai un popup che mostra la tua chiave API. Annotalo per poterlo usare più tardi.
Entrambe le API sono basate su JSON e dispongono di endpoint REST a cui è possibile interagire direttamente utilizzando qualsiasi libreria di rete. Tuttavia, puoi risparmiare molto tempo e anche scrivere codice più leggibile utilizzando le librerie client dell'API di Google disponibili per loro. Quindi apri il build.gradle file del tuo progetto App
modulo e aggiungere il seguente compilare
dipendenze ad esso:
compila 'com.google.api-client: google-api-client-android: 1.22.0' compila '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 'compila' com.google.code.findbugs: jsr305: 2.0.1 '
Inoltre, eseguiremo alcune operazioni di I / O su file in questo tutorial. Per semplificarli, aggiungi un compilare
dipendenza per la libreria IO di Commons.
compilare 'commons-io: commons-io: 2.5'
Infine, non dimenticare di richiedere il INTERNET
permesso nel AndroidManifest.xml file. Senza di esso, la tua app non sarà in grado di connettersi ai server di Google.
Inutile dire che l'API di Cloud Speech prevede che i dati audio siano uno dei suoi input. Pertanto, ora creeremo un'app Android in grado di trascrivere file audio.
Per semplificare, trascriveremo solo file FLAC, file che utilizzano il formato di codifica Free Lossless Audio Codec. Potresti già avere tali file sul tuo dispositivo. Se non lo fai, ti suggerisco di scaricare alcuni da Wikimedia Commons.
Il layout della nostra app avrà a Pulsante
gli utenti di widget possono premere per visualizzare un raccoglitore di file, un'interfaccia in cui possono sfogliare e selezionare i file audio disponibili sui loro dispositivi.
Il layout avrà anche a TextView
widget per visualizzare la trascrizione del file audio selezionato. Di conseguenza, aggiungi il seguente codice al file XML di layout della tua attività:
L'interfaccia di selezione file dovrebbe essere visualizzata quando l'utente preme il pulsante che abbiamo creato nel passaggio precedente, quindi associare un OnClickListener
oggetto con esso. Prima di farlo, assicurati di inizializzare il pulsante usando il findViewById ()
metodo.
Button browseButton = (Button) findViewById (R.id.browse_button); browseButton.setOnClickListener (new View.OnClickListener () @ Override pubblico onClick (Visualizzazione vista) // Altro codice qui);
Con Android Storage Access Framework, disponibile su dispositivi con livello API 19 o superiore, la creazione di un raccoglitore di file richiede pochissimo sforzo. Tutto quello che devi fare è creare un intento per il ACTION_GET_CONTENT
azione e passarlo al startSubActivity ()
metodo. Facoltativamente, è possibile limitare il selettore di file per visualizzare solo i file FLAC passando il tipo MIME appropriato al file setType ()
metodo del Intento
oggetto.
Intent filePicker = new Intent (Intent.ACTION_GET_CONTENT); filePicker.setType ( "audio / flac"); startActivityForResult (filePicker, 1);
L'output del selettore di file sarà un altro Intento
oggetto contenente l'URI del file selezionato dall'utente. Per essere in grado di accedervi, è necessario ignorare il onActivityResult ()
metodo del tuo Attività
classe.
@Override protetto void onActivityResult (int requestCode, int resultCode, Intent data) super.onActivityResult (requestCode, resultCode, data); if (resultCode == RESULT_OK) final Uri soundUri = data.getData (); // Più codice qui
L'API di Cloud Speech prevede che i dati audio abbiano la forma di una stringa Base64. Per generare una stringa di questo tipo, puoi leggere il contenuto del file selezionato dall'utente in a byte
array e passarlo al encodeBase64String ()
metodo di utilità offerto dalla libreria Client dell'API di Google.
Tuttavia, al momento hai solo l'URI del file selezionato, non il suo percorso assoluto. Ciò significa che, per poter leggere il file, è necessario prima risolvere l'URI. Puoi farlo passando a openInputStream ()
metodo del risolutore di contenuti della tua attività. Una volta che hai accesso al flusso di input del file, puoi semplicemente passarlo al file toByteArray ()
metodo del IOUtils
classe per convertirlo in una matrice di byte. Il seguente codice mostra come:
AsyncTask.execute (new Runnable () @Override public void run () InputStream stream = getContentResolver () .openInputStream (soundUri); byte [] audioData = IOUtils.toByteArray (stream); stream.close (); String base64EncodedData = Base64.encodeBase64String (audioData); // altro codice qui
Come puoi vedere nel codice precedente, stiamo usando un nuovo thread per eseguire tutte le operazioni di I / O. Ciò è importante per assicurarsi che l'interfaccia utente dell'applicazione non si blocchi.
Secondo me, riprodurre il file audio che viene trascritto, mentre viene trascritto, è una buona idea. Non richiede molto sforzo e migliora l'esperienza dell'utente.
Puoi usare il Media Player
classe per riprodurre il file audio. Una volta che lo si punta all'URI del file usando il suo setDataSource ()
metodo, devi chiamarlo preparare()
metodo per preparare in modo sincrono il giocatore. Quando il giocatore è pronto, puoi chiamarlo inizio()
metodo per iniziare a riprodurre il file.
Inoltre, è necessario ricordare di rilasciare le risorse del giocatore una volta completata la riproduzione del file. Per fare ciò, assegna un OnCompletionListener
obiettare e chiamarla pubblicazione()
metodo. Il seguente codice mostra come:
MediaPlayer player = new MediaPlayer (); player.setDataSource (MainActivity.this, soundUri); player.prepare (); Player.start (); // Rilascia il player player.setOnCompletionListener (new MediaPlayer.OnCompletionListener () @Override public void onCompletion (MediaPlayer mediaPlayer) mediaPlayer.release (););
A questo punto, possiamo inviare i dati audio con codifica Base64 all'API di Cloud Speech per trascriverlo. Ma prima, ti suggerisco di memorizzare la chiave API che hai generato in precedenza come variabile membro del tuo Attività
classe.
private final String CLOUD_API_KEY = "ABCDEF1234567890";
Per essere in grado di comunicare con l'API di Cloud Speech, è necessario creare un Discorso
oggetto usando a Speech.Builder
esempio. Come argomenti, il suo costruttore si aspetta un trasporto HTTP e una fabbrica JSON. Inoltre, per assicurarsi che la chiave API sia inclusa in ogni richiesta HTTP all'API, è necessario associare a SpeechRequestInitializer
oggetto con il costruttore e passare la chiave ad esso.
Il seguente codice crea a Discorso
oggetto usando il AndroidJsonFactory
classe come la fabbrica JSON e il NetHttpTransport
class come il trasporto HTTP:
Speech speechService = new Speech.Builder (AndroidHttp.newCompatibleTransport (), nuovo AndroidJsonFactory (), null) .setSpeechRequestInitializer (new SpeechRequestInitializer (CLOUD_API_KEY)) .build ();
L'API di Cloud Speech deve essere informata sulla lingua contenuta nel file audio. Puoi farlo creando un RecognitionConfig
oggetto e chiamandolo setLanguageCode ()
metodo. Ecco come lo configuri per trascrivere solo l'inglese americano:
RecognitionConfig recognitionConfig = new RecognitionConfig (); recognitionConfig.setLanguageCode ( "it-IT");
Inoltre, la stringa codificata Base64 deve essere racchiusa in a RecognitionAudio
oggetto prima che possa essere utilizzato dall'API.
Riconoscimento Riconoscimento audio Audio = nuovo RecognitionAudio (); recognitionAudio.setContent (base64EncodedData);
Quindi, utilizzando il RecognitionConfig
e RecognitionAudio
oggetti, è necessario creare a SyncRecognizeRequest
oggetto. Come suggerisce il nome, consente di creare una richiesta HTTP per trascrivere in modo sincrono i dati audio. Una volta che l'oggetto è stato creato, puoi passarlo come argomento al file syncrecognize ()
metodo e chiamare il risultato Speech.SpeechOperations.Syncrecognize
oggetto di eseguire()
metodo per eseguire effettivamente la richiesta HTTP.
Il valore di ritorno del eseguire()
il metodo è a SyncRecognizeResponse
oggetto, che può contenere diverse trascrizioni alternative. Per ora, useremo solo la prima alternativa.
// Crea richiesta SyncRecognizeRequest request = new SyncRecognizeRequest (); request.setConfig (recognitionConfig); request.setAudio (recognitionAudio); // Genera risposta SyncRecognizeResponse response = speechService.speech () .syncrecognize (request) .execute (); // Estrai trascrizione SpeechRecognitionResult result = response.getResults (). Get (0); final String transcript = result.getAlternatives (). get (0) .getTranscript ();
Infine, per visualizzare la trascrizione per l'utente, è possibile passare a TextView
widget di. Naturalmente, poiché le modifiche all'interfaccia utente devono sempre avvenire sul thread dell'interfaccia utente, assicurati di farlo dopo aver chiamato le attività runOnUiThread ()
metodo.
runOnUiThread (new Runnable () @Override public void run () TextView speechToTextResult = (TextView) findViewById (R.id.speech_to_text_result); speechToTextResult.setText (trascrizione););
Ora puoi eseguire la tua app, selezionare un file FLAC contenente parlato in inglese americano e vedere l'API Cloud Speech generare una trascrizione per esso.
Vale la pena ricordare che l'API Cloud Speech può attualmente elaborare solo file audio a singolo canale. Se si invia un file con più canali, si otterrà una risposta di errore.
Ora che abbiamo una trascrizione, possiamo passarla all'API Cloud Natural Language per analizzarla. Per mantenere questo tutorial breve, eseguiremo solo analisi di entità e sentimento sulla trascrizione. In altre parole, determineremo tutte le entità menzionate nella trascrizione, come persone, luoghi e professioni, e diremo anche se il suo sentiment complessivo è negativo, neutro o positivo.
Per consentire all'utente di avviare l'analisi, il nostro layout deve contenere un altro Pulsante
widget di. Pertanto, aggiungi il seguente codice al file XML di layout della tua attività:
L'API REST di Cloud Natural Language offre un'opzione di convenienza chiamata annotateText che consente di eseguire sia l'analisi di sentimento che di entità su un documento con una sola richiesta HTTP. Lo useremo per analizzare la nostra trascrizione.
Perché l'analisi deve iniziare quando l'utente preme il pulsante che abbiamo creato nel passaggio precedente, aggiungere un OnClickListener
ad esso.
Button analyzeButton = (Button) findViewById (R.id.analyze_button); analyzeButton.setOnClickListener (new View.OnClickListener () @ Override pubblico onClick (Visualizzazione vista) // Altro codice qui);
Per interagire con l'API utilizzando la libreria Client dell'API di Google, è necessario creare un CloudNaturalLanguage
oggetto usando il CloudNaturalLanguage.Builder
classe. Il suo costruttore si aspetta anche un trasporto HTTP e una fabbrica JSON.
Inoltre, assegnando a CloudNaturalLanguageRequestInitializer
ad esempio, puoi forzarlo a includere la tua chiave API in tutte le sue richieste.
final CloudNaturalLanguage naturalLanguageService = new CloudNaturalLanguage.Builder (AndroidHttp.newCompatibleTransport (), nuovo AndroidJsonFactory (), null) .setCloudNaturalLanguageRequestInitializer (new CloudNaturalLanguageRequestInitializer (CLOUD_API_KEY)) .build ();
Tutto il testo che vuoi analizzare usando l'API deve essere inserito all'interno di Documento
oggetto. Il Documento
l'oggetto deve contenere anche informazioni di configurazione, come la lingua del testo e se è formattato come testo normale o HTML. Di conseguenza, aggiungere il seguente codice:
String transcript = ((TextView) findViewById (R.id.speech_to_text_result)) .getText (). ToString (); Documento documento = nuovo documento (); document.setType ( "PLAIN_TEXT"); document.setLanguage ( "it-IT"); document.setContent (trascrizione);
Quindi, è necessario creare un Caratteristiche
oggetto che specifica le caratteristiche che ti interessano nell'analisi. Il codice seguente mostra come creare un Caratteristiche
oggetto che dice che vuoi estrarre entità ed eseguire solo analisi sentimentali.
Caratteristiche caratteristiche = nuove funzionalità (); features.setExtractEntities (true); features.setExtractDocumentSentiment (true);
Ora puoi usare il Documento
e Caratteristiche
oggetti da comporre AnnotateTextRequest
oggetto, che può essere passato al annotateText ()
metodo per generare un AnnotateTextResponse
oggetto.
finale AnnotateTextRequest request = new AnnotateTextRequest (); request.setDocument (documento); request.setFeatures (caratteristiche); AsyncTask.execute (new Runnable () @Override public void run () AnnotateTextResponse response = naturalLanguageService.documents () .annotateText (request) .execute (); // Altro codice qui
Si noti che stiamo generando la risposta in un nuovo thread perché le operazioni di rete non sono consentite sul thread dell'interfaccia utente.
È possibile estrarre un elenco di entità dal AnnotateTextResponse
oggetto chiamando il suo getEntities ()
metodo. Allo stesso modo, puoi estrarre il sentimento generale della trascrizione chiamando il getDocumentSentiment ()
metodo. Per ottenere il punteggio effettivo del sentimento, tuttavia, è necessario chiamare anche il getScore ()
metodo, che restituisce a galleggiante
.
Come ci si potrebbe aspettare, un punteggio di sentimento pari a zero significa che il sentimento è neutro, un punteggio maggiore di zero significa che il sentimento è positivo e un punteggio inferiore a zero significa che il sentimento è negativo.
Quello che fai con l'elenco delle entità e il punteggio di valutazione è, ovviamente, a te. Per ora, mostriamoli entrambi usando un AlertDialog
esempio.
lista finaleentityList = response.getEntities (); final float sentiment = response.getDocumentSentiment (). getScore (); runOnUiThread (new Runnable () @Override public void run () String entities = "" per (Entità entità: entityList) entity + = "\ n" + entity.getName (). toUpperCase (); AlertDialog dialog = new AlertDialog.Builder (MainActivity.this) .setTitle ("Sentiment:" + sentiment) .setMessage ("Questo file audio parla di:" + entity) .setNeutralButton ("Okay", null) .create (); dialog. mostrare(); );
Con il codice di cui sopra, il punteggio di sentimento verrà visualizzato nel titolo della finestra di dialogo e l'elenco delle entità verrà visualizzato nel suo corpo.
Se esegui l'app ora, dovresti essere in grado di analizzare il contenuto dei file audio e di trascriverli.
Ora sai come utilizzare le API Cloud Speech e Cloud Natural Language insieme per creare un'app Android che non solo possa trascrivere un file audio ma anche eseguire analisi di entità e sentimento su di esso. In questo tutorial, hai anche imparato a lavorare con Storage Access Framework di Android e le librerie API di Google Client.
Google ha aggiunto regolarmente nuove e interessanti funzionalità, insieme al supporto per più lingue, per entrambe le API. Per rimanere aggiornati su di essi, fare riferimento alla documentazione ufficiale.
E mentre sei qui, dai uno sguardo agli altri nostri post sui servizi cloud per app mobili e sull'apprendimento automatico!