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

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

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

कोड का उदाहरण

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

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

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

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

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

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

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

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

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

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

सेटअप

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

डिपेंडेंसी

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

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

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

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

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

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

AUDIO_CLIPS: इंडिपेंडेंट ऑडियो क्लिप पर ऑडियो टास्क चलाने के लिए मोड.

AUDIO_STREAM: यह मोड किसी ऑडियो स्ट्रीम पर ऑडियो टास्क चलाने का मोड है, जैसे कि माइक्रोफ़ोन से. इस मोड में, resultListener को कॉल करना चाहिए, ताकि वह क्लासिफ़िकेशन के नतीजों को एसिंक्रोनस तरीके से पाने वाले को सेट अप कर सके.
{AUDIO_CLIPS, AUDIO_STREAM} AUDIO_CLIPS
displayNamesLocale अगर यह उपलब्ध हो, तो टास्क के मॉडल के मेटाडेटा में दिए गए डिसप्ले नेम के लिए, लेबल की भाषा सेट करता है. अंग्रेज़ी के लिए डिफ़ॉल्ट रूप से en है. TensorFlow Lite Metadata Writer API का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के हिसाब से लेबल जोड़े जा सकते हैं स्थान-भाषा का कोड en
maxResults यह विकल्प, टॉप-स्कोर किए गए क्लासिफ़िकेशन के नतीजों की ज़्यादा से ज़्यादा संख्या को सेट करता है, ताकि नतीजे दिखाए जा सकें. अगर < 0 है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे. कोई भी पॉज़िटिव नंबर -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 user’s device as a float array.

// Convert a float array to a MediaPipe’s 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 फ़ंक्शन को कॉल किया जा सकता है. Audio Classifier API इनपुट ऑडियो डेटा में पहचाने गए ऑडियो इवेंट के लिए, संभावित कैटगरी दिखाता है.

ऑडियो क्लिप

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 क्लास में, इस टास्क से मिले, क्लासिफ़िकेशन के नतीजों को दिखाने के तरीके का उदाहरण देखा जा सकता है.