Android के लिए, ऑडियो क्लासिफ़िकेशन गाइड

MediaPipe ऑडियो क्लासिफ़ायर टास्क की मदद से, ऑडियो डेटा को कैटगरी में बांटा जा सकता है. आप इस टास्क का इस्तेमाल, ट्रेन की गई कैटगरी में से साउंड इवेंट की पहचान करने के लिए करें. ये निर्देशों में बताया गया है कि Android ऐप्लिकेशन के साथ ऑडियो क्लासिफ़ायर का इस्तेमाल कैसे किया जाए.

क्षमताओं, मॉडल, और कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानकारी पाने के लिए इस टास्क की खास जानकारी देखें.

कोड का उदाहरण

MediaPipe Tasks के उदाहरण कोड से, ऑडियो क्लासिफ़ायर को आसानी से लागू किया जा सकता है Android के लिए ऐप. इस उदाहरण में, फ़िज़िकल Android डिवाइस के माइक्रोफ़ोन का इस्तेमाल इन कामों के लिए किया गया है आवाज़ों को लगातार कैटगरी में बांटता है और ऑडियो फ़ाइलों की कैटगरी तय करने की सुविधा भी चला सकता है डिवाइस पर सेव हुआ हो.

इस ऐप्लिकेशन का इस्तेमाल, अपने Android ऐप्लिकेशन को शुरू करने के लिए किया जा सकता है. इसके अलावा, इसे रेफ़रंस के तौर पर भी इस्तेमाल किया जा सकता है को अपडेट करें. ऑडियो क्लासिफ़ायर का उदाहरण कोड यहां होस्ट किया गया है GitHub.

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में आपको उदाहरण की स्थानीय कॉपी बनाने का तरीका बताया गया है git कमांड लाइन टूल का इस्तेमाल करके कोड बनाना और उसमें बदलाव करना.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए कमांड का इस्तेमाल करके git रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपना git इंस्टेंस कॉन्फ़िगर करें, इसलिए आपके पास ऑडियो क्लासिफ़ायर के उदाहरण ऐप्लिकेशन की सिर्फ़ फ़ाइलें होती हैं:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/audio_classifier/android
    

उदाहरण के तौर पर दिए गए कोड का लोकल वर्शन बनाने के बाद, प्रोजेक्ट को इंपोर्ट किया जा सकता है और इस ऐप्लिकेशन को चलाएं. निर्देशों के लिए, इसे देखें Android के लिए सेटअप गाइड.

मुख्य कॉम्पोनेंट

इन फ़ाइलों में इस ऑडियो का ज़रूरी कोड शामिल है क्लासिफ़िकेशन का उदाहरण:

  • AudioClassifierHelper.kt - यह ऑडियो की कैटगरी तय करने वाले टूल को शुरू करता है. साथ ही, मॉडल और डेलिगेट को हैंडल करता है चुनें.
  • RecorderFragment.kt - लाइव ऑडियो रिकॉर्डिंग के लिए यूज़र इंटरफ़ेस और कंट्रोल कोड बनाता है.
  • LibraryFragment.kt - ऑडियो फ़ाइलें चुनने के लिए, यूज़र इंटरफ़ेस और कंट्रोल कोड बनाता है.
  • ProbabilitiesAdapter.kt - क्लासिफ़ायर के अनुमान के नतीजों को हैंडल और फ़ॉर्मैट करता है.

सेटअप

इस सेक्शन में, आपके डेवलपमेंट एनवायरमेंट को सेट अप करने और कोड प्रोजेक्ट का इस्तेमाल किया जा सकता है. इस पर सामान्य जानकारी के लिए MediaPipe के टास्क इस्तेमाल करने के लिए डेवलपमेंट एनवायरमेंट सेट अप करना. इसमें ये भी शामिल हैं प्लैटफ़ॉर्म वर्शन की ज़रूरी शर्तें पूरी करते हैं. इसके बारे में ज़्यादा जानने के लिए, Android के लिए सेटअप गाइड.

डिपेंडेंसी

ऑडियो क्लासिफ़ायर com.google.mediapipe:tasks-audio लाइब्रेरी का इस्तेमाल करता है. इसे जोड़ें आपकी build.gradle फ़ाइल पर निर्भरता Android ऐप्लिकेशन डेवलपमेंट प्रोजेक्ट. इसके साथ ज़रूरी डिपेंडेंसी इंपोर्ट करें यह कोड डालें:

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

मॉडल

MediaPipe ऑडियो क्लासिफ़ायर टास्क के लिए एक प्रशिक्षित मॉडल की ज़रूरत है, जो इसके साथ काम कर सके टास्क. ऑडियो क्लासिफ़ायर के लिए तैयार किए गए उपलब्ध मॉडल के बारे में ज़्यादा जानकारी के लिए, देखें टास्क की खास जानकारी मॉडल सेक्शन.

मॉडल चुनें और डाउनलोड करें, और फिर उसे अपनी प्रोजेक्ट डायरेक्ट्री में सेव करें:

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

पाथ की जानकारी देने के लिए, BaseOptions.Builder.setModelAssetPath() तरीके का इस्तेमाल करें इस्तेमाल किया जाता है. यह विधि अगले अगले सेक्शन में जाएं.

इस ऑडियो क्लासिफ़ायर उदाहरण कोड, मॉडल की जानकारी AudioClassifierHelper.kt में दी गई है फ़ाइल से लिए जाते हैं.

टास्क बनाएं

टास्क बनाने के लिए, createFromOptions फ़ंक्शन का इस्तेमाल किया जा सकता है. कॉन्टेंट बनाने createFromOptions फ़ंक्शन, कॉन्फ़िगरेशन के विकल्प भी स्वीकार करता है, जैसे कि 'रनिंग' मोड मोड, डिसप्ले नेम की स्थान-भाषा, नतीजों की ज़्यादा से ज़्यादा संख्या, कॉन्फ़िडेंस थ्रेशोल्ड, और अनुमति वाली सूची या ब्लॉकलिस्ट. कॉन्फ़िगरेशन के बारे में ज़्यादा जानकारी पाने के लिए विकल्पों के लिए, कॉन्फ़िगरेशन की खास जानकारी देखें.

ऑडियो क्लासिफ़ायर का टास्क इन इनपुट डेटा टाइप के साथ काम करता है: ऑडियो क्लिप और ऑडियो स्ट्रीम. आपको इससे जुड़ा दौड़ने मोड तय करना होगा आपके इनपुट डेटा टाइप को टास्क बनाते समय इस्तेमाल किया जाता है. इससे जुड़ा टैब चुनें अपने इनपुट डेटा टाइप को देखें, ताकि टास्क बनाने और अनुमान लगाने का तरीका देखा जा सके.

ऑडियो क्लिप

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

ऑडियो स्ट्रीम

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);
    

ऑडियो क्लासिफ़ायर के उदाहरण कोड को लागू करने की मदद से, उपयोगकर्ता अलग-अलग कोड के बीच स्विच कर सकता है प्रोसेस मोड. इस तरीके से टास्क बनाने का कोड ज़्यादा मुश्किल हो जाता है और आपके इस्तेमाल के उदाहरण के लिए सही नहीं हो सकती है. आपको मोड स्विच करने का कोड दिखेगा के initClassifier() फ़ंक्शन में AudioClassifierHelper.

कॉन्फ़िगरेशन विकल्प

इस टास्क में Android ऐप्लिकेशन के लिए, नीचे दिए गए कॉन्फ़िगरेशन के विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा मान की सीमा डिफ़ॉल्ट मान
runningMode टास्क के लिए रनिंग मोड सेट करता है. ऑडियो क्लासिफ़ायर के दो मोड हैं:

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है AUDIO_CLIPS: स्वतंत्र ऑडियो क्लिप पर ऑडियो टास्क चलाने का मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है AUDIO_STREAM: किसी ऑडियो स्ट्रीम पर ऑडियो टास्क चलाने का मोड, जैसे कि माइक्रोफ़ोन से. इस मोड में, resultListener होना चाहिए क्लासिफ़िकेशन के नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale यह नीति, दिए गए डिसप्ले नेम के लिए लेबल की भाषा सेट करती है अगर उपलब्ध हो, तो टास्क के मॉडल का मेटाडेटा. इसके लिए डिफ़ॉल्ट en है अंग्रेज़ी. आप कस्टम मॉडल के मेटाडेटा में स्थानीय जगह के अनुसार लेबल जोड़ सकते हैं TensorFlow Lite Metadata Writer API का इस्तेमाल करें स्थान-भाषा कोड en
maxResults सबसे ज़्यादा स्कोर वाले क्लासिफ़िकेशन नतीजों की वैकल्पिक ज़्यादा से ज़्यादा संख्या को इस पर सेट करता है वापसी. यदि < कोई समस्या नहीं है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे. कोई भी धनात्मक संख्या -1
scoreThreshold अनुमान के लिए स्कोर का थ्रेशोल्ड सेट करता है, जो इसमें दिए गए स्कोर को ओवरराइड करता है मॉडल मेटाडेटा (अगर कोई है). इस वैल्यू से कम के नतीजे अस्वीकार कर दिए जाते हैं. [0.0, 1.0] सेट नहीं है
categoryAllowlist अनुमति वाली कैटगरी के नामों की वैकल्पिक सूची सेट करता है. अगर खाली नहीं है, ऐसे वर्गीकरण परिणाम होंगे जिनका श्रेणी नाम इस सेट में नहीं है फ़िल्टर करके बाहर किया गया. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता. यह विकल्प, categoryDenylist और इसका इस्तेमाल करने वाले उपयोगकर्ताओं के लिए अलग-अलग है दोनों में गड़बड़ी होती है. कोई भी स्ट्रिंग सेट नहीं है
categoryDenylist ऐसी कैटगरी के नामों की वैकल्पिक सूची सेट करता है जिनकी अनुमति नहीं है. अगर आपने खाली नहीं है, इसलिए डेटा को अलग-अलग ग्रुप में बांटने के ऐसे नतीजे फ़िल्टर कर दिए जाएंगे जिनकी कैटगरी का नाम इस सेट में होगा बाहर. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता. यह विकल्प म्यूचुअली है सिर्फ़ categoryAllowlist इस्तेमाल करने पर, दोनों नतीजे इस्तेमाल करने में गड़बड़ी होती है. कोई भी स्ट्रिंग सेट नहीं है
resultListener यह नीति, क्लासिफ़िकेशन के नतीजे पाने के लिए, रिज़ल्ट लिसनर को सेट करती है जब ऑडियो क्लासिफ़ायर, ऑडियो स्ट्रीम में हो, तब एसिंक्रोनस तरीके से मोड. इसका इस्तेमाल सिर्फ़ तब किया जा सकता है, जब रनिंग मोड को AUDIO_STREAM पर सेट किया गया हो लागू नहीं सेट नहीं है
errorListener गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. लागू नहीं सेट नहीं है

डेटा तैयार करें

ऑडियो क्लासिफ़ायर, ऑडियो क्लिप और ऑडियो स्ट्रीम के साथ काम करता है. टास्क यह डेटा इनपुट की प्री-प्रोसेसिंग को मैनेज करता है. इसमें रीसैंपलिंग, बफ़रिंग, और फ़्रेमिंग शामिल है. हालांकि, आपको इनपुट ऑडियो डेटा को ऑडियो क्लासिफ़ायर टास्क में पास करने से पहले com.google.mediapipe.tasks.components.containers.AudioData ऑब्जेक्ट.

ऑडियो क्लिप

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);
    

ऑडियो स्ट्रीम

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)
    

टास्क को पूरा करें

अपने रनिंग मोड से जुड़े classify फ़ंक्शन को कॉल किया जा सकता है ट्रिगर का अनुमान लगाता है. ऑडियो क्लासिफ़ायर एपीआई, इन चीज़ों के लिए संभावित कैटगरी दिखाता है इनपुट ऑडियो डेटा में पहचाने गए ऑडियो इवेंट.

ऑडियो क्लिप

AudioClassifierResult classifierResult = audioClassifier.classify(audioData);
    

ऑडियो स्ट्रीम

// 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);
    

निम्न पर ध्यान दें:

  • ऑडियो स्ट्रीम मोड में चलाते समय, आपको किस तरह का ऑडियो डेटा है, यह ट्रैक करने के लिए टाइमस्टैंप के साथ ऑडियो की कैटगरी तय करने वाला टास्क इसका इस्तेमाल अनुमान लगाने के लिए किया गया था.
  • ऑडियो क्लिप मॉडल में इस्तेमाल करते समय, ऑडियो क्लासिफ़ायर टास्क ब्लॉक होता है मौजूदा थ्रेड को तब तक सबमिट नहीं किया जाता, जब तक कि इनपुट ऑडियो की प्रोसेस पूरी नहीं हो जाती. यूज़र इंटरफ़ेस के जवाबों को ब्लॉक होने से बचाने के लिए, बैकग्राउंड थ्रेड.

ऑडियो क्लिप के साथ ऑडियो क्लासिफ़ायर चलाने का एक उदाहरण देखा जा सकता है, AudioClassifierHelper क्लास कोड का उदाहरण.

नतीजों को हैंडल करना और दिखाना

अनुमान चलाने के बाद, ऑडियो क्लासिफ़ायर टास्क संभावित नतीजों की सूची दिखाता है इनपुट ऑडियो में ऑडियो इवेंट की कैटगरी. निम्न सूची इस टास्क के आउटपुट डेटा का उदाहरण दिखाता है:

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

Android ऐप्लिकेशन में, यह टास्क ClassificationResult दिखाता है, जिसमें AudioClassifierResult ऑब्जेक्ट की सूची, जो ऑडियो इवेंट, जिसमें कैटगरी लेबल और कॉन्फ़िडेंस स्कोर भी शामिल है.

ऑडियो क्लिप

// 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();
}
    

ऑडियो स्ट्रीम

// 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();
    

क्लासिफ़िकेशन दिखाने का तरीका, आपके लिए एक उदाहरण है इस टास्क से मिले नतीजे की ProbabilitiesAdapter क्लास में कोड का उदाहरण.