Udhëzues për klasifikimin e audios për Android

Detyra MediaPipe Audio Classifier ju lejon të kryeni klasifikimin e të dhënave audio. Ju mund ta përdorni këtë detyrë për të identifikuar ngjarjet zanore nga një grup kategorish të trajnuara. Këto udhëzime ju tregojnë se si të përdorni Klasifikuesin e audios me aplikacionet Android.

Për më shumë informacion rreth aftësive, modeleve dhe opsioneve të konfigurimit të kësaj detyre, shihni Përmbledhjen .

Shembull kodi

Kodi i shembullit të MediaPipe Tasks është një zbatim i thjeshtë i një aplikacioni Audio Classifier për Android. Shembulli përdor mikrofonin në një pajisje fizike Android për të klasifikuar vazhdimisht tingujt, dhe gjithashtu mund të ekzekutojë klasifikuesin në skedarët e zërit të ruajtur në pajisje.

Mund ta përdorni aplikacionin si pikënisje për aplikacionin tuaj Android ose t'i referoheni kur modifikoni një aplikacion ekzistues. Shembulli i kodit të Klasifikuesit të Audios është pritur në GitHub .

Shkarkoni kodin

Udhëzimet e mëposhtme ju tregojnë se si të krijoni një kopje lokale të kodit shembull duke përdorur mjetin e linjës së komandës git .

Për të shkarkuar kodin shembull:

  1. Klononi depon e git duke përdorur komandën e mëposhtme:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. Opsionale, konfiguroni shembullin tuaj të git për të përdorur arkëtimin e rrallë, në mënyrë që të keni vetëm skedarët për shembullin e aplikacionit Audio Classifier:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

Pas krijimit të një versioni lokal të kodit shembull, mund ta importoni projektin në Android Studio dhe të ekzekutoni aplikacionin. Për udhëzime, shihni Udhëzuesin e konfigurimit për Android .

Komponentët kryesorë

Skedarët e mëposhtëm përmbajnë kodin vendimtar për këtë aplikacion shembulli të klasifikimit audio:

  • AudioClassifierHelper.kt - Inicializon klasifikuesin audio dhe trajton përzgjedhjen e modelit dhe delegatit.
  • RecorderFragment.kt - Krijon ndërfaqen e përdoruesit dhe kodin e kontrollit për regjistrim audio të drejtpërdrejtë.
  • LibraryFragment.kt - Krijon ndërfaqen e përdoruesit dhe kodin e kontrollit për zgjedhjen e skedarëve audio.
  • ProbabilitiesAdapter.kt - Trajton dhe formaton rezultatet e parashikimit të klasifikuesit.

Konfigurimi

Ky seksion përshkruan hapat kryesorë për konfigurimin e mjedisit tuaj të zhvillimit dhe projekteve të kodit në mënyrë specifike për të përdorur Klasifikuesin Audio. Për informacion të përgjithshëm mbi konfigurimin e mjedisit tuaj të zhvillimit për përdorimin e detyrave të MediaPipe, duke përfshirë kërkesat e versionit të platformës, shihni udhëzuesin e konfigurimit për Android .

varësitë

Klasifikimi i audios përdor bibliotekën com.google.mediapipe:tasks-audio . Shtoni këtë varësi në skedarin build.gradle të projektit tuaj të zhvillimit të aplikacionit Android. Importoni varësitë e kërkuara me kodin e mëposhtëm:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-audio:latest.release'
}

Model

Detyra MediaPipe Audio Classifier kërkon një model të trajnuar që është në përputhje me këtë detyrë. Për më shumë informacion mbi modelet e disponueshme të trajnuara për Klasifikuesin Audio, shihni seksionin Modelet e përmbledhjes së detyrave.

Zgjidhni dhe shkarkoni modelin dhe më pas ruajeni në direktorinë e projektit tuaj:

<dev-project-root>/src/main/assets

Përdorni metodën BaseOptions.Builder.setModelAssetPath() për të specifikuar shtegun e përdorur nga modeli. Kjo metodë është referuar në shembullin e kodit në seksionin tjetër.

kodin e shembullit të Klasifikuesit Audio, modeli përcaktohet në skedarin AudioClassifierHelper.kt .

Krijo detyrën

Ju mund të përdorni funksionin createFromOptions për të krijuar detyrën. Funksioni createFromOptions pranon opsionet e konfigurimit duke përfshirë modalitetin e ekzekutimit, vendndodhjen e emrave të shfaqur, numrin maksimal të rezultateve, pragun e besimit dhe listën e lejimit ose listës së refuzimit të kategorive. Për më shumë informacion mbi opsionet e konfigurimit, shihni Përmbledhjen e konfigurimit .

Detyra Audio Classifier mbështet llojet e mëposhtme të të dhënave hyrëse: klipet audio dhe transmetimet audio. Ju duhet të specifikoni mënyrën e ekzekutimit që korrespondon me llojin tuaj të të dhënave hyrëse kur krijoni një detyrë. Zgjidhni skedën që korrespondon me llojin tuaj të të dhënave hyrëse për të parë se si të krijoni detyrën dhe të ekzekutoni konkluzionet.

Klipe audio

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_CLIPS)
        .setMaxResults(5)
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Transmetimi i audios

AudioClassifierOptions options =
    AudioClassifierOptions.builder()
        .setBaseOptions(
            BaseOptions.builder().setModelAssetPath("model.tflite").build())
        .setRunningMode(RunningMode.AUDIO_STREAM)
        .setMaxResults(5)
        .setResultListener(audioClassifierResult -> {
             // Process the classification result here.
        })
        .build();
audioClassifier = AudioClassifier.createFromOptions(context, options);
    

Zbatimi i kodit të shembullit të Klasifikuesit Audio lejon përdoruesin të kalojë ndërmjet mënyrave të përpunimit. Qasja e bën kodin e krijimit të detyrës më të komplikuar dhe mund të mos jetë i përshtatshëm për rastin tuaj të përdorimit. Ju mund të shihni kodin e ndërrimit të modalitetit në funksionin initClassifier()AudioClassifierHelper .

Opsionet e konfigurimit

Kjo detyrë ka opsionet e mëposhtme të konfigurimit për aplikacionet Android:

Emri i opsionit Përshkrimi Gama e vlerave Vlera e paracaktuar
runningMode Vendos modalitetin e ekzekutimit për detyrën. Klasifikuesi i audios ka dy mënyra:

AUDIO_CLIPS: Mënyra për ekzekutimin e detyrës audio në klipe audio të pavarura.

AUDIO_STREAM: Modaliteti për ekzekutimin e detyrës audio në një transmetim audio, si p.sh. nga mikrofoni. Në këtë modalitet, resultListener duhet të thirret për të vendosur një dëgjues për të marrë rezultatet e klasifikimit në mënyrë asinkrone.
{ AUDIO_CLIPS, AUDIO_STREAM } AUDIO_CLIPS
displayNamesLocale Vendos gjuhën e etiketave për t'u përdorur për emrat e shfaqur të dhëna në meta të dhënat e modelit të detyrës, nëse disponohet. Parazgjedhja është en për anglisht. Ju mund të shtoni etiketa të lokalizuara në meta të dhënat e një modeli të personalizuar duke përdorur API-në e shkrimtarit metadata TensorFlow Lite Kodi lokal sq
maxResults Vendos numrin maksimal opsional të rezultateve të klasifikimit me pikët më të mira për t'u kthyer. Nëse < 0, të gjitha rezultatet e disponueshme do të kthehen. Çdo numër pozitiv -1
scoreThreshold Vendos pragun e rezultatit të parashikimit që tejkalon atë të dhënë në meta të dhënat e modelit (nëse ka). Rezultatet nën këtë vlerë refuzohen. [0.0, 1.0] Nuk është vendosur
categoryAllowlist Vendos listën opsionale të emrave të kategorive të lejuara. Nëse nuk janë bosh, rezultatet e klasifikimit emri i kategorisë së të cilave nuk është në këtë grup do të filtrohen. Emrat e kopjuar ose të panjohur të kategorive shpërfillen. Ky opsion është reciprokisht ekskluziv me categoryDenylist dhe duke përdorur të dyja rezulton në një gabim. Çdo varg Nuk është vendosur
categoryDenylist Vendos listën opsionale të emrave të kategorive që nuk lejohen. Nëse nuk janë bosh, rezultatet e klasifikimit emri i kategorisë së të cilave është në këtë grup do të filtrohen. Emrat e kopjuar ose të panjohur të kategorive shpërfillen. Ky opsion është reciprokisht ekskluziv me categoryAllowlist dhe duke përdorur të dyja rezultatet në një gabim. Çdo varg Nuk është vendosur
resultListener Vendos dëgjuesin e rezultateve që të marrë rezultatet e klasifikimit në mënyrë asinkrone kur Klasifikuesi i audios është në modalitetin e transmetimit audio. Mund të përdoret vetëm kur modaliteti i ekzekutimit është caktuar në AUDIO_STREAM N/A Nuk është vendosur
errorListener Vendos një dëgjues opsional gabimi. N/A Nuk është vendosur

Përgatitni të dhënat

Klasifikimi i audios funksionon me klipe audio dhe transmetime audio. Detyra trajton parapërpunimin e hyrjes së të dhënave, duke përfshirë rimarrjen e mostrave, buferimin dhe kornizën. Megjithatë, duhet t'i konvertoni të dhënat e hyrjes audio në një objekt com.google.mediapipe.tasks.components.containers.AudioData përpara se t'ia kaloni në detyrën "Klasifikuesi i audios".

Klipe audio

import com.google.mediapipe.tasks.components.containers.AudioData;

// Load an audio on the users device as a float array.

// Convert a float array to a MediaPipes AudioData object.
AudioData audioData =
    AudioData.create(
        AudioData.AudioDataFormat.builder()
            .setNumOfChannels(numOfChannels)
            .setSampleRate(sampleRate)
            .build(),
        floatData.length);
audioData.load(floatData);
    

Transmetimi i audios

import android.media.AudioRecord;
import com.google.mediapipe.tasks.components.containers.AudioData;

AudioRecord audioRecord =
    audioClassifier.createAudioRecord(/* numChannels= */ 1, /* sampleRate= */ 16000);
audioRecord.startRecording();

...

// To get a one second clip from the AudioRecord object:
AudioData audioData =
    AudioData.create(
        16000 /*sample counts per second*/);
        AudioData.AudioDataFormat.create(audioRecord.getFormat()),
audioData.load(audioRecord)
    

Drejtoni detyrën

Ju mund të telefononi funksionin classify që korrespondon me modalitetin tuaj të drejtimit për të shkaktuar përfundime. Audio Classifier API kthen kategoritë e mundshme për ngjarjet audio të njohura brenda të dhënave audio hyrëse.

Klipe audio

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

Transmetimi i audios

// Run inference on the audio block. The classifications results will be available
// via the `resultListener` provided in the `AudioClassifierOptions` when
// the audio classifier was created.
audioClassifier.classifyAsync(audioBlock, timestampMs);
    

Vini re sa vijon:

  • Kur ekzekutoni në modalitetin e transmetimit audio, duhet t'i jepni gjithashtu detyrës "Klasifikuesi i audios" një vulë kohore për të gjurmuar se cilat të dhëna audio brenda transmetimit janë përdorur për përfundimin.
  • Kur ekzekutohet në modelin e klipeve audio, detyra Klasifikuesi i audios bllokon fillin aktual derisa të përfundojë përpunimin e audios hyrëse. Për të shmangur bllokimin e përgjigjeve të ndërfaqes së përdoruesit, ekzekutoni përpunimin në një fill në sfond.

Ju mund të shihni një shembull të ekzekutimit të Audio Classifier me klipe audio, shikoni klasën AudioClassifierHelpershembullin e kodit .

Trajtoni dhe shfaqni rezultatet

Pas ekzekutimit të një konkluzion, detyra Audio Classifier kthen një listë të kategorive të mundshme për ngjarjet audio brenda audios hyrëse. Lista e mëposhtme tregon një shembull të të dhënave dalëse nga kjo detyrë:

AudioClassifierResult:
  Timestamp in microseconds: 100
  ClassificationResult #0:
    Timestamp in microseconds: 100  
    Classifications #0 (single classification head):
      head index: 0
      category #0:
        category name: "Speech"
        score: 0.6
        index: 0
      category #1:
        category name: "Music"
        score: 0.2
        index: 1

Në një aplikacion Android, detyra kthen një ClassificationResult i cili përmban një listë të objekteve AudioClassifierResult , që përfaqëson parashikimet për një ngjarje audio, duke përfshirë etiketën e kategorisë dhe rezultatin e besimit.

Klipe audio

// In the audio clips mode, the classification results are for the entire audio
// clip. The results are timestamped AudioClassifierResult objects, each
// classifying an interval of the entire audio clip that starts at
// ClassificationResult.timestampMs().get().

for (ClassificationResult result : audioClassifierResult.classificationResults()) {
  // Audio interval start timestamp:
  result.timestampMs().get();
  // Classification result of the audio interval.
  result.classifications();
}
    

Transmetimi i audios

// In the audio stream mode, the classification results list only contains one
// element, representing the classification result of the audio block that
// starts at ClassificationResult.timestampMs in the audio stream.

ClassificationResult result = audioClassifierResult.classificationResults().get(0);
// The audio block start timestamp
audioClassifierResult.timestampMs();
// Alternatively, the same timestamp can be retrieved from
// result.timestampMs().get();

// Classification result.
result.classifications();
    

Ju mund të shihni një shembull se si të shfaqen rezultatet e klasifikimit të kthyera nga kjo detyrë në klasën ProbabilitiesAdaptershembullit të kodit .