راهنمای طبقه بندی صوتی برای اندروید

وظیفه MediaPipe Audio Classifier به شما امکان می دهد داده های صوتی را طبقه بندی کنید. می توانید از این کار برای شناسایی رویدادهای صوتی از مجموعه ای از دسته های آموزش دیده استفاده کنید. این دستورالعمل‌ها به شما نشان می‌دهند که چگونه از Audio Classifier با برنامه‌های Android استفاده کنید.

برای اطلاعات بیشتر در مورد قابلیت‌ها، مدل‌ها و گزینه‌های پیکربندی این کار، به نمای کلی مراجعه کنید.

نمونه کد

کد مثال MediaPipe Tasks یک پیاده سازی ساده از یک برنامه Audio Classifier برای اندروید است. این مثال از میکروفون یک دستگاه اندروید فیزیکی برای طبقه‌بندی مداوم صداها استفاده می‌کند و همچنین می‌تواند طبقه‌بندی کننده را روی فایل‌های صوتی ذخیره شده در دستگاه اجرا کند.

می‌توانید از برنامه به‌عنوان نقطه شروع برای برنامه اندرویدی خود استفاده کنید یا هنگام تغییر برنامه موجود به آن مراجعه کنید. کد نمونه Audio Classifier در 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 - نتایج پیش‌بینی طبقه‌بندی‌کننده را کنترل و قالب‌بندی می‌کند.

راه اندازی

این بخش مراحل کلیدی را برای راه‌اندازی محیط توسعه و پروژه‌های کد مخصوصاً برای استفاده از Audio Classifier توضیح می‌دهد. برای اطلاعات کلی در مورد تنظیم محیط توسعه خود برای استفاده از وظایف MediaPipe، از جمله الزامات نسخه پلت فرم، به راهنمای راه اندازی برای Android مراجعه کنید.

وابستگی ها

Audio Classifier از کتابخانه com.google.mediapipe:tasks-audio استفاده می کند. این وابستگی را به فایل build.gradle پروژه توسعه برنامه اندروید خود اضافه کنید. وابستگی های مورد نیاز را با کد زیر وارد کنید:

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

مدل

وظیفه MediaPipe Audio Classifier به یک مدل آموزش دیده نیاز دارد که با این کار سازگار باشد. برای اطلاعات بیشتر در مورد مدل‌های آموزش‌دیده موجود برای طبقه‌بندی کننده صوتی، به بخش مدل‌های نمای کلی کار مراجعه کنید.

مدل را انتخاب و دانلود کنید و سپس آن را در فهرست پروژه خود ذخیره کنید:

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

از متد BaseOptions.Builder.setModelAssetPath() برای تعیین مسیر استفاده شده توسط مدل استفاده کنید. به این روش در مثال کد در قسمت بعدی اشاره شده است.

در کد نمونه Audio Classifier، مدل در فایل AudioClassifierHelper.kt تعریف شده است.

کار را ایجاد کنید

برای ایجاد کار می توانید از تابع createFromOptions استفاده کنید. تابع createFromOptions گزینه‌های پیکربندی شامل حالت اجرا، مکان نام‌های نمایشی، حداکثر تعداد نتایج، آستانه اطمینان، و فهرست مجاز یا رد دسته را می‌پذیرد. برای اطلاعات بیشتر در مورد گزینه های پیکربندی، به نمای کلی پیکربندی مراجعه کنید.

وظیفه Audio Classifier از انواع داده های ورودی زیر پشتیبانی می کند: کلیپ های صوتی و جریان های صوتی. هنگام ایجاد یک کار، باید حالت اجرای مربوط به نوع داده ورودی خود را مشخص کنید. برای مشاهده نحوه ایجاد کار و اجرای استنتاج، برگه مربوط به نوع داده ورودی خود را انتخاب کنید.

کلیپ های صوتی

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 حداکثر تعداد اختیاری نتایج طبقه بندی با امتیاز بالا را برای بازگشت تنظیم می کند. اگر < 0 باشد، تمام نتایج موجود برگردانده خواهند شد. هر عدد مثبت -1
scoreThreshold آستانه امتیاز پیش‌بینی را تنظیم می‌کند که بر آستانه ارائه‌شده در فراداده مدل (در صورت وجود) لغو می‌شود. نتایج زیر این مقدار رد می شوند. [0.0، 1.0] تنظیم نشده است
categoryAllowlist فهرست اختیاری نام‌های دسته‌بندی مجاز را تنظیم می‌کند. در صورت خالی نبودن، نتایج طبقه بندی که نام دسته آنها در این مجموعه نیست فیلتر می شود. نام‌های دسته‌بندی تکراری یا ناشناخته نادیده گرفته می‌شوند. این گزینه با categoryDenylist منحصر به فرد است و از هر دو نتیجه در یک خطا استفاده می کند. هر رشته تنظیم نشده است
categoryDenylist فهرست اختیاری نام‌های دسته‌هایی را که مجاز نیستند را تنظیم می‌کند. در صورت خالی نبودن، نتایج طبقه بندی که نام دسته آنها در این مجموعه است فیلتر می شود. نام‌های دسته‌بندی تکراری یا ناشناخته نادیده گرفته می‌شوند. این گزینه با categoryAllowlist منحصر به فرد است و از هر دو نتیجه در خطا استفاده می کند. هر رشته تنظیم نشده است
resultListener شنونده نتیجه را طوری تنظیم می‌کند که وقتی طبقه‌بندی‌کننده صوتی در حالت پخش صدا است، نتایج طبقه‌بندی را به صورت ناهمزمان دریافت کند. فقط زمانی می توان از آن استفاده کرد که حالت اجرا روی AUDIO_STREAM تنظیم شده باشد N/A تنظیم نشده است
errorListener یک شنونده خطای اختیاری را تنظیم می کند. N/A تنظیم نشده است

داده ها را آماده کنید

Audio Classifier با کلیپ های صوتی و جریان های صوتی کار می کند. این وظیفه، پیش پردازش ورودی داده، از جمله نمونه‌برداری مجدد، بافر کردن، و کادربندی را انجام می‌دهد. با این حال، باید داده‌های صوتی ورودی را به یک شی com.google.mediapipe.tasks.components.containers.AudioData تبدیل کنید قبل از اینکه آن را به وظیفه Audio Classifier ارسال کنید.

کلیپ های صوتی

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 مربوط به حالت در حال اجرا خود را برای استنتاج فراخوانی کنید. 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);
    

به موارد زیر توجه کنید:

  • هنگامی که در حالت پخش صدا اجرا می‌شود، باید وظیفه طبقه‌بندی کننده صدا را با یک مهر زمانی نیز ارائه کنید تا داده‌های صوتی در جریان برای استنتاج مورد استفاده قرار گیرد.
  • هنگام اجرا در مدل کلیپ‌های صوتی، وظیفه طبقه‌بندی کننده صدا، رشته فعلی را مسدود می‌کند تا زمانی که پردازش صدای ورودی به پایان برسد. برای جلوگیری از مسدود کردن پاسخ های رابط کاربری، پردازش را در یک رشته پس زمینه اجرا کنید.

می‌توانید نمونه‌ای از اجرای Audio Classifier با کلیپ‌های صوتی را ببینید، کلاس 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

در یک برنامه اندروید، این کار یک 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 نمونه کد مشاهده کنید.