وظیفه MediaPipe Audio Classifier به شما امکان می دهد داده های صوتی را طبقه بندی کنید. می توانید از این کار برای شناسایی رویدادهای صوتی از مجموعه ای از دسته های آموزش دیده استفاده کنید. این دستورالعملها به شما نشان میدهند که چگونه از Audio Classifier با برنامههای Android استفاده کنید.
برای اطلاعات بیشتر در مورد قابلیتها، مدلها و گزینههای پیکربندی این کار، به نمای کلی مراجعه کنید.
نمونه کد
کد مثال MediaPipe Tasks یک پیاده سازی ساده از یک برنامه Audio Classifier برای اندروید است. این مثال از میکروفون یک دستگاه اندروید فیزیکی برای طبقهبندی مداوم صداها استفاده میکند و همچنین میتواند طبقهبندی کننده را روی فایلهای صوتی ذخیره شده در دستگاه اجرا کند.
میتوانید از برنامه بهعنوان نقطه شروع برای برنامه اندرویدی خود استفاده کنید یا هنگام تغییر برنامه موجود به آن مراجعه کنید. کد نمونه Audio Classifier در GitHub میزبانی می شود.
کد را دانلود کنید
دستورالعمل های زیر به شما نشان می دهد که چگونه با استفاده از ابزار خط فرمان git یک کپی محلی از کد مثال ایجاد کنید.
برای دانلود کد نمونه:
- با استفاده از دستور زیر مخزن git را کلون کنید:
git clone https://github.com/google-ai-edge/mediapipe-samples
- به صورت اختیاری، نمونه 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 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);
به موارد زیر توجه کنید:
- هنگامی که در حالت پخش صدا اجرا میشود، باید وظیفه طبقهبندی کننده صدا را با یک مهر زمانی نیز ارائه کنید تا دادههای صوتی در جریان برای استنتاج مورد استفاده قرار گیرد.
- هنگام اجرا در مدل کلیپهای صوتی، وظیفه طبقهبندی کننده صدا، رشته فعلی را مسدود میکند تا زمانی که پردازش صدای ورودی به پایان برسد. برای جلوگیری از مسدود کردن پاسخ های رابط کاربری، پردازش را در یک رشته پس زمینه اجرا کنید.
میتوانید نمونهای از اجرای 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
نمونه کد مشاهده کنید.