1. Prima di iniziare
TensorFlow è un framework di machine learning polivalente. Può essere utilizzato per addestrare modelli enormi su cluster nel cloud o eseguire modelli in locale su un sistema incorporato come il tuo telefono.
Questo codelab utilizza TensorFlow Lite per eseguire un modello di classificazione audio su un dispositivo Android.
Obiettivi didattici
- Come trovare un modello di machine learning preaddestrato pronto per essere utilizzato.
- Come eseguire la classificazione dell'audio acquisito in tempo reale.
- Come utilizzare la libreria di assistenza di TensorFlow Lite per precompilare l'input del modello e l'output del modello post-elaborazione.
- Come utilizzare la Raccolta di attività audio per svolgere tutte le attività relative all'audio.
Cosa devi creare
Una semplice app di riconoscimento audio che esegue un modello di riconoscimento audio di TensorFlow Lite per identificare gli audio provenienti dal microfono in tempo reale
Che cosa ti serve
- Una versione recente di Android Studio (v4.1.2+)
- Dispositivo fisico Android con versione di Android alla versione API 23 (Android 6.0)
- Codice di esempio
- Conoscenza di base dello sviluppo di Android in Kotlin
2. Recupera il codice campione
Scarica il codice
Fai clic sul seguente link per scaricare tutto il codice di questo codelab:
Apri il file ZIP scaricato. Verrà aperta una cartella principale (odml-pathways
) che conterrà tutte le risorse necessarie. Per questo codelab, avrai bisogno solo delle origini nella sottodirectory audio_classification/codelab1/android
.
Nota: se preferisci, puoi clonare il repository.
git clone https://github.com/googlecodelabs/odml-pathways.git
La sottodirectory android
nel repository audio_classification/codelab1/android
contiene due directory:
- starter: il codice di avvio sulla quale crei questo codelab.
- final: è stato completato il codice per l'app di esempio terminata.
Importare l'app iniziale
Iniziamo importando l'app iniziale in Android Studio.
- Apri Android Studio e seleziona Importa progetto (Gradle, Eclipse ADT ecc.).
- Apri la cartella
starter
(audio_classification/codelab1/android/starter
) dal codice sorgente che hai scaricato in precedenza.
Per assicurarti che tutte le dipendenze siano disponibili per la tua app, devi sincronizzare il tuo progetto con file di Gradle al termine del processo di importazione.
- Seleziona Sincronizza progetto con file Gradle ( ) dalla barra degli strumenti di Android Studio.
Esegui l'app iniziale
Ora che hai importato il progetto in Android Studio, puoi eseguire l'app per la prima volta.
Collega il dispositivo Android tramite USB al computer e fai clic su Esegui () nella barra degli strumenti di Android Studio.
3. Trova un modello preaddestrato
Per farlo, ti servirà un modello. Inizia con un modello preaddestrato per evitare di addestrarne uno tu.
Per trovare modelli preaddestrati utilizzerai TensorFlow Hub (www.tfhub.dev).
I modelli vengono classificati in base al dominio. Quello che ti serve subito è di Domini con problemi di audio.
Per la tua app, eseguirai la classificazione degli eventi con il modello AMAMNet.
YAMNet è un classificatore di eventi audio che prende la forma d'onda audio come input e fa previsioni indipendenti per ciascuno di 521 eventi audio.
Il modello yamnet/classifier è già convertito in TensorFlow Lite e ha metadati specifici che consentono alla libreria di attività TFLite for Audio di semplificare l'utilizzo del modello sui dispositivi mobili.
Scegli la scheda giusta: TFLite (yamnet/classification/tflite) e fai clic su Download. Puoi anche visualizzare i metadati del modello in basso.
Questo file modello (lite-model_yamnet_classification_tflite_1.tflite
) verrà utilizzato nel passaggio successivo.
4. Importa il nuovo modello nell'app di base
Per prima cosa, sposta il modello scaricato dal passaggio precedente alla cartella degli asset nell'app.
In Android Studio, in Esplorazione progetto, fai clic con il pulsante destro del mouse sulla cartella Asset.
Viene visualizzato un popup con un elenco di opzioni. Una delle seguenti operazioni consiste nell'aprire la cartella nel file system. Su Mac, l'app sarà Reveal in Finder, su Windows sarà Open in Explorer, mentre su Ubuntu sarà Show in Files. Trova quella più adatta al tuo sistema operativo e selezionala.
A questo punto, copia il modello scaricato.
Al termine dell'operazione, torna ad Android Studio e dovresti vedere il file nella cartella assets.
5. Carica il nuovo modello nell'app di base
Ora seguirai alcuni dei TODO e attiverai la classificazione audio con il modello che hai appena aggiunto al progetto nel passaggio precedente.
Per trovare più facilmente le TODO, in Android Studio vai al menu: Visualizza > Strumento di Windows > TODO. Si aprirà una finestra in cui potrai visualizzare l'elenco e potrai fare clic per andare direttamente al codice.
Nel file build.gradle
(la versione del modulo) troverai la prima attività.
TODO 1 consiste nell'aggiungere le dipendenze di Android:
implementation 'org.tensorflow:tensorflow-lite-task-audio:0.2.0'
Tutte le altre modifiche al codice verranno applicate al MainActivity
TODO 2.1 crea la variabile con il nome del modello da caricare nei passaggi successivi.
var modelPath = "lite-model_yamnet_classification_tflite_1.tflite"
TODO 2.2 definirai una soglia minima per accettare una previsione dal modello. Questa variabile verrà utilizzata in un secondo momento.
var probabilityThreshold: Float = 0.3f
TODO 2.3 è il punto in cui caricherai il modello dalla cartella degli asset. La classe AudioClassifier definita nella Raccolta di attività audio è pronta per caricare il modello e fornirti tutti i metodi necessari per eseguire l'inferenza e anche per creare un registratore audio.
val classifier = AudioClassifier.createFromFile(this, modelPath)
6. Acquisisci audio
L'API Audio Tasks offre alcuni metodi di supporto per creare un registratore audio con la configurazione adeguata prevista dal tuo modello (ad es. Frequenza di campionamento, Velocità in bit, numero di canali). In questo modo, non è necessario trovarlo a mano e creare oggetti di configurazione.
TODO 3.1: crea la variabile tensore che archivierà la registrazione per dedurre e creerà la specifica di formato per il registratore.
val tensor = classifier.createInputTensorAudio()
TODO 3.2: mostra le specifiche del registratore audio definite dai metadati del modello nel passaggio precedente.
val format = classifier.requiredTensorAudioFormat
val recorderSpecs = "Number Of Channels: ${format.channels}\n" +
"Sample Rate: ${format.sampleRate}"
recorderSpecsTextView.text = recorderSpecs
TODO 3.3: crea il registratore audio e inizia a registrare.
val record = classifier.createAudioRecord()
record.startRecording()
Al momento, l'app è in ascolto sul microfono del telefono, ma non sta ancora effettuando alcuna inferenza. Approfondirai questo passaggio nel passaggio successivo.
7. Aggiungi l'inferenza al modello
In questo passaggio dovrai aggiungere il codice di inferenza alla tua app e mostrarlo sullo schermo. Il codice ha già un thread del timer che viene eseguito ogni mezzo secondo ed è il punto in cui verrà eseguita l'inferenza.
I parametri del metodo scheduleAtFixedRate
sono il tempo di attesa prima di avviare l'esecuzione e il tempo tra l'esecuzione successiva dell'attività, nel codice sotto ogni 500 millisecondi.
Timer().scheduleAtFixedRate(1, 500) {
...
}
TODO 4.1 Aggiungi il codice per utilizzare il modello. Innanzitutto, carica la registrazione in un tensore audio e poi passala al classificatore:
tensor.load(record)
val output = classifier.classify(tensor)
TODO 4.2 per avere risultati migliori di inferenza, escluderai qualsiasi classificazione con una probabilità molto bassa. Qui utilizzerai la variabile creata in un passaggio precedente (probabilityThreshold
):
val filteredModelOutput = output[0].categories.filter {
it.score > probabilityThreshold
}
TODO 4.3: per semplificare la lettura del risultato, creiamo una stringa con i risultati filtrati:
val outputStr = filteredModelOutput.sortedBy { -it.score }
.joinToString(separator = "\n") { "${it.label} -> ${it.score} " }
TODO 4.4 Aggiorna la UI. In questa app molto semplice, il risultato viene mostrato soltanto in una visualizzazione di testo. Poiché la classificazione non si trova nel thread principale, per effettuare l'aggiornamento dovrai utilizzare un gestore.
runOnUiThread {
textView.text = outputStr
}
Hai aggiunto tutto il codice necessario per:
- Carica il modello dalla cartella degli asset
- Crea un registratore audio con la configurazione corretta.
- Inferenza in esecuzione
- Mostra i migliori risultati sullo schermo
Ora è tutto ciò che serve per testare l'app.
8. Esegui l'app finale
Hai integrato il modello di classificazione dell'audio nell'app, perciò testalo.
Connetti il tuo dispositivo Android e fai clic su Esegui ( ) nella barra degli strumenti di Android Studio.
Alla prima esecuzione dovrai concedere all'app le autorizzazioni per la registrazione audio.
Dopo aver concesso l'autorizzazione, l'app all'avvio utilizzerà il microfono del telefono. Per fare una prova, inizia a parlare vicino al telefono, poiché una delle lezioni che YAMNet rileva è la voce. Un altro corso facile da testare è l'agganciamento o il battito delle dita.
Puoi anche provare a rilevare il cane che abbaia e molti altri possibili eventi (521). Per un elenco completo, consulta il codice sorgente oppure puoi leggere i metadati direttamente con il file delle etichette.
9. Complimenti!
In questo codelab, hai imparato a trovare un modello preaddestrato per la classificazione audio e a eseguirne il deployment nella tua app per dispositivi mobili utilizzando TensorFlow Lite. Per scoprire di più su TFLite, dai un'occhiata ad altri esempi di TFLite.
Cosa abbiamo trattato
- Come eseguire il deployment di un modello TensorFlow Lite su un'app Android.
- Come trovare e utilizzare i modelli di TensorFlow Hub.
Passaggi successivi
- Personalizza il modello con i tuoi dati.
Ulteriori informazioni
- Documentazione di TensorFlow Lite
- Libreria dell'assistenza TensorFlow Lite
- Libreria attività di TensorFlow Lite
- Documentazione di TensorFlow Hub
- Machine learning integrato nel dispositivo con tecnologie Google