دسته بندی صداها با پایتون و طبقهبندی جنسیت گویندهها با شبکههای عصبی
برای اینکه درک بهتری از اهمیت دسته بندی صداها داشته باشید، به این مثال توجه کنید. اتاق کنفرانسی را در نظر بگیرید که یک جلسه در آن درحال برگزاری است. در این اتاق آدمهای زیادی هستند که به نوبت صحبت خواهند کرد. ما میخواهیم در این جلسه هر چه آنها میگویند را به رشته تحریر درآوریم. ابزارهایی هستند که میتوانند صدا را به متن تبدیل کنند (گوشی همراه اکثر ما این ویژگی را دارد بدون آنکه ما از آن خبر داشته باشیم)، اما آیا میتوان یک مدل را به نحوی آموزش داد که صداها را یاد گرفته و با شنیدن هر صدا، گوینده آن را پیشبینی کند؟ و همچنین بتواند جنسیت گوینده را پیشبینی کند؟
ما در این مقاله، این مسئله را با استفاده از یادگیری ماشین و شبکههای عصبی حل خواهیم کرد.
خلاصهای از پروژه
قدم اول برای حل این مسئله این است که با نحوه کار با فایلهای صوتی و ساخت مدلهایی که کار دستهبندی را انجام میدهند آشنا شویم. رقابت جالبی تحت عنوان دسته بندی صدای شهری ارائه شده که در آن باید 10 صدای مختلف از قبیل صدای بازی بچهها، موسیقی خیابانی، صدای موتور ماشین و غیره را دستهبندی کنید. من برای حل این مسئله و درک راهحلهای دیگران تلاش و مطالعه زیادی کردم. در آخر روی دو رویکرد متمرکز شدم. رویکرد اول استخراج ویژگیهای عددی قطعههای صوتی با استفاده از کتابخانه پایتونی librosa بود. این ویژگیها برای آموزش مدل شبکه عصبی (NN) بهکار گرفته شدند. رویکرد دوم نیز به این ترتیب بود که قطعههای صوتی به تصویر تبدیل میشد و از آن تصاویر برای آموزش یک مدل شبکه عصبی پیچشی (CNN) استفاده میشد.
نتایج هر دو مدل NN (با دقت 93% روی دادگان آزمون Test data) و CNN (با دقت 92% روی دادگان آزمون) خوب بود. ما به منظور ترکیب این دو مدل با یکدیگر احتمال پیشبینیها را با هم ترکیب کرده و از هردو مدل استفاده کردیم. با این کار مدل ترکیبی به دقت 95% رسید.
حال میتوانستیم قدم بعدی را برداشته و آموختههای خود را برای حل مسئله دسته بندی صداها و پیشبینی جنسیت آنها به کار بگیریم.
ما برای پیشبینی جنسیت گویندهها از مدل NN استفاده کردیم و مدل توانست گویندههایی که قبلاً صدایشان را نیز شنیده بود را با دقت 99.8% براساس جنسیت دستهبندی کند. وقتی دادههای جدید و فایل صدای گویندههایی که مدل قبلاً صدای آنها را نشنیده بود به مدل دادیم، دقت پیشبینی به 95% رسید.
این آزمایش را با مدل CNN نیز انجام دادیم. دقت این مدل در پیشبینی جنسیت صداهای گویندههایی که قبلاً صدایشان را شنیده بود به 97.7% رسید و در پیشبینی صداهای گویندههایی که قبلاً صدایشان را نشنیده بود به دقت 95% رسید.
در ادامه هر پروژه با جزئیات بیشتر بررسی خواهیم کرد.
شبکه عصبی پیشخور
برای شرکت در این چالش، لینک مربوط به دادهها را میتوان از خود وبسایت دریافت کرد. ما تنها از دادگان آموزشی استفاده کردیم، زیرا میخواستم عملکرد مدل خود را براساس دادههای برچسبدار Label data بیازماییم.
این دادهها حاوی 5435 فایل صوتی برچسبدار در 10 کلاس مختلف هستند. نام این 10 کلاس عبارت است از: siren ،street music ،drilling ،engine idling ،air conditioner ،car horn ،dog bark ،drilling ،gun shot و jackhammer. اغلب این کلاسها متعادل Balanced هستند، اما در این میان، دو کلاس تعداد کمتری دارند. یعنی همه کلاسها 11% دادهها را بازنمایی میکنند، اما دو کلاس مذکور تنها 4 و 5% از داده را نمایش میدهند. ما این دو کلاس را متعادل نکردیم، زیرا به نظر کار با کلاسهای نامتعادل unbalanced و ساخت یک مدل بر پایه آنها چالش خوبی بود.
کتابخانه librosa یک کتابخانه پایتون بینظیر است و بیشتر افراد در مسائل دسته بندی صداها از این کتابخانه استفاده میکنند. ما نیز برای استخراج ویژگی فایلهای صوتی از این کتابخانه استفاده کردیم.
ما فایل csv که حاوی دادههای آموزشی است را به همراه با نام تمامی فایلهای صوتی و برچسبهای آنها، وارد یک قابداده Data frame کرده و سپس ویژگیهای آنها استخراج کردیم. برای این کار از تابعی استفاده کردیم که در هر سطر از قابداده تکرار میشود و با خواندن مسیر فایل، به فایل ذخیره شده در سیستم دسترسی پیدا میکند. در این راستا از ویژگیهای Mel-frequency Cepstral Coefficients (MFCCs) ،Chromagram،Mel-scaled Spectrogram ،Spectral Contrast و Tonal Centroid Features (tonnetz) استفاده کردیم. به این ترتیب، در آخر یک آرایه حاوی 193 ویژگی و برچسب متناظر آنها داشتیم. این دو را X و y درنظر گرفتم و آنها را به سه بخش آموزش، اعتبارسنجی Validation و آزمون تقسیم کردیم. همچنین نسبت کلاسها در کل دادهها را ثابت نگه داشتیم و سپس دادهها را افزایش دادیم. در نهایت 3425 فایل صوتی داده آموزشی، 1000 فایل صوتی داده اعتبارسنجی و 1000 فایل صوتی داده آزمون انتخاب کردیم.
در ادامه یک شبکه عصبی پیشخوری Feed forward neural network دارای چندین لایه متراکم Dense layers به همراه 2 لایه پنهانی
Hidden layers با استفاده از relu و بیشینه هموار برای 10 خروجی ساختیم. در قدم بعدی با استفاده از الگوریتم بهینهسازی adam و تابع زیان آنتروپی متقاطع گسسته Categorical crossentrophy استفاده کردیم تا مدل را کامپایل کنیم. همچنین در برخی از نورونها جستجوی شبکهای Gridsearched انجام دادیم تا بهترین پارامترهای آنها را پیدا کنیم. همچنین از تکنیک dropout لایهها استفاده کردم و درنهایت به مدل قابلقبولی رسیدیم که دادههای جدید و ناآشنا را با دقت 93% پیشبینی میکرد.
شبکه عصبی پیچشی
در این رویکرد نیز برای ساخت قابداده همان مراحل بالا را طی کرده و از دادههای یکسانی استفاده کردیم. سپس به تابعی نیاز داشتیم که فایلهای صوتی را به عکس تبدیل کند. در اینجا نیز درست همانند قبل تابع در طول هر سطر داده تکرار میشد و به کمک کتابخانه librosa تصویری از آن فایل تولید کرده و در یک پوشه ذخیره میکرد.
پس از تولید تصاویر، مجدداً دادهها را به بخشهای آموزش، آزمون و اعتبارسنجی تقسیم کردیم (تقسیمبندی دادهها در این مدل با نسبتهای مشابه مدل NN انجام شد). ما ابتدا تعادل در کلاسهای جدید را با قبل مقایسه کردیم تا مطمئن شویم تغییری نکرده و سپس نام فایلهای قابداده را از .wav به .jpg تغییر دادیم تا بتوانم از همان قابداده قبلی برای دسترسی به تصاویر ذخیرهشده در فایلهای سیستم خود استفاده کنیم.
کتابخانه Keras میتواند اطلاعات خوبی درخصوص چگونگی بارگذاری و پیشپردازش Preprocess تصاویر ذخیرهشده در سیستمتان (به ویژه .flow_from_dataframe که ما از آن استفاده کردیم) به شما بدهد. به این ترتیب، دادههای آموزش، آزمون و اعتبارسنجی را وارد مولدها Generators میکنیم و آماده ساختن مدل میشویم.
شبکه عصبی پیچشی که ساختهایم از دو لایه ورودی شامل Conv2D و MaxPooling2D ،5 لایه پنهانی (شامل 3 لایه Conv2D و لایههای MaxPooling2D متناظر با آنها) و یک لایه مسطحساز Flatten و 2 لایه متراکم تشکیل شده است. به علاوه، در آخر نیز یک لایه متراکم خروجی قرار دارد که دارای تابع فعالسازی softmax بوده و 10 کلاس خروجی دارد. در اینجا نیز برای کامپایل کردن مدل از بهینهساز adam و تابع زیان آنتروپی متقاطع گسسته استفاده کردهایم. برای این مدل از جستجوی شبکه ای استفاده نکردهایم، چرا که زمان زیادی نیاز داشت (تقریباً دو ساعت زمان میبرد) و بنابراین، مدل را در 250 دوره آموزش دادهایم. به این ترتیب، مدل در پیشبینی دادههای آزمون که قبلاً نشنیده بود، به دقت 92% رسید.
دستهبندی بر اساس رایگیری
از آنجا که دو مدل دارشتیم که هر دو یک کار را انجام میدهند، تصمیم گرفتیم این دو مدل را همزمان با هم بهکار بگیریم. به این منظور، احتمال پیشبینی تک تک کلاسها را توسط هر دو شبکه NN و CNN به دست آوردیم و با هم ترکیب کردیم تا مقدار حداکثر هر یک را پیدا کنیم. به عبارتی، اگر مدل NN با احتمال 65% یک صدا را در کلاس children playing قرار دهد و مدل CNN همان صدا را با احتمال 95% در کلاس street music بگذارد، از آنجا که احتمال محاسبهشده توسط مدل CNN بیشتر است، پیشبینی کلی و نهایی صدای مذکور را در کلاس street music قرار خواهد داد. با این کار، دقت پیشبینیهای مدل (برای دادههای جدید) به 95% رسید (درحالیکه با اجرای جداگانه دو مدل NN و CNN به ترتیب به دقت 93% و 92% رسیده بود). بنابراین، میتوان چنین نتیجه گرفت که ترکیب دو مدل راه خوبی برای به دست آوردن نتایج بهتر و پیشبینیهای دقیقتر است.
دسته بندی صداها
حال ابزاری در دست داریم که با آن میتوانیم مسئله اصلی یعنی دسته بندی صداها را حل کنیم. مشکل اولی که با آن روبهرو شدیم پیدا کردن دادههای صوتی باکیفیت و مناسب بود. پس از کمی جستجو، مجموعه داده بینظیری پیدا کردیم که حاوی کلیپهای صوتی ضبطشده از کتابهای صوتی بود. این دیتاست حاوی چندین گیگابایت داده تمیز در فرمت .flac هست که برای استفاده در سیستمعامل مک کاملاً مناسب هستند. ما برای این پروژه از زیرمجموعه train-clean-100.tar.gz با سایز 6.3 گیگ استفاده کردیم. دادهها در این دیتاست به خوبی براساس گویندهها و در فولدرهای مختلف سازماندهی شدهاند و هر فایل حاوی اطلاعاتی از قبیل شناسه گوینده، نام کتاب، شماره فصل و شماره فایل است. همچنین فایلی با فرمت .txt دریافت کردیم که حاوی اطلاعاتی از قبیل جنسیت گوینده، نام وی و طول فایل صوتی بود. مجموعه دادهای که ما از میان این دادهها برای پروژه خود انتخاب کردم حاوی 13.000 کلیپ صوتی بود که عموماً بین 12 تا 18 ثانیه بودند.
ما در این مرحله از شبکه عصبی پیشخور استفاده کردم، زیرا سرعت و دقت نتایج آن در حل مسئله دستهبندی صداهای شهری در مقایسه با سایر مدلها بالاتر بود. مراحلی که باید در اینجا طی شود نیز مشابه مراحل قبلی است و تفاوت آن در حجم بیشتر دادهها (13.000 فایل صوتی به جای 5000 فایل اولیه) و طول بیشتر فایلهای صوتی (با میانگین 14 ثانیه به جای 4 ثانیه) است. استخراج ویژگیها حدود 3 ساعت بهطول میانجامد، اما حداقل نیازی به تکرار مجدد این فرایند نیست. نتیجه استراج ویژگیها را در قالب یک آرایه numpy در فایلهای سیستم خود ذخیره کرده تا بتوانیم هر زمان که لازم شد آن را بارگذاری کنیم یا تغییر دهیم.
دادههای استفادهشده در این پروژه متشکل از صدای 115 گوینده مختلف (زن و مرد) بودند که در این میان، از هر گوینده حداقل 56 کلیپ صوتی و حداکثر 166 فایل صوتی موجود بود (که کاملاً تصادفی گزینش شده بودند). انحراف معیار تعداد کلیپهای صوتی به ازای هر گوینده نیز برابر 16 بود. کلاسهای این دیتاست را متعادل درنظر گرفتیم.
ما این دادهها را یکی از مدل های شبکه های عصبی دادیم که پیکربندی آن مشابه با مدل جستجوی شبکهای بود و در حل مسئله دستهبندی صداهای شهری استفاده کرده بودیم و بهطرز شگفتانگیزی به دقت 99% دست یافتیم. مدل ما باید 1312 نمونه صوتی را پیشبینی کرده و آنها را به 115 گوینده موجود نسبت میداد و در این میان، تنها 2 اشتباه انجام داد. همچنین، برازش مدل تنها 20 ثانیه طول کشید. بنابراین، به این نتیجه رسیدیم که برای حل این مسئله استفاده از مدل CNN ضرورتی ندارد.
دسته بندی صداها براساس جنسیت
حجم دادههایی که برای حل دسته بندی صداها براساس جنسیت استفاده کردیم با مسئله دستهبندی کلیپهای صوتی براساس گوینده برابر بود، فقط در این مسئله به کلیپهای صوتی برچسب female و male را داده و آنها را در دو پوشه مجزا تقسیم کردیم. پس از آن، قابداده هر پوشه را ایجاد کرده و سپس هر دو را در یک قابداده با هم ترکیب کردیم. بعد دادهها را با هم مخلوط کرده و اندیس را مجدداً تنظیم کردم تا یک قابداده کاملاً جدید از همه فایلهای موجود که حاوی دادههای برچسبدار (برچسب جنسیت) هستند، ایجاد شود.
برای این مسئله نیز دادهها را با همان رویکردی که در مدل NN برای حل مسئله دستهبندی صداهای شهری در پیش گرفته بودیم، تقسیم کرده و ویژگیهای یکسانی را استخراج کردیم. پیکربندی این مدل را مشابه با مدل شبکه عصبی پیشخور انجام دادیم و این بار هم برازش مدل تنها 20 ثانیه به طول انجامید. با این مدل روی مجموعه داده آزمون به دقت 99.8% دست یافتم. علیرغم آن که مدل فایلهای صوتی درون دادههای آزمون را تا پیش از مرحله تست نشنیده بود، اما چون گوینده فایلهای صوتی مجموعه داده آموزش و مجموعه داده آزمون یکسان بودند، دقت مدل به این سطح رسید. ما به مدل آموزش دادیم که در بین گویندههای مجموعه داده آموزش کدامیک زن است و کدام مرد، سپس مدل را براساس کلیپهای صوتی جدیدی که گویندههای یکسانی با دیتاست آموزشی داشتند، آزمایش کردیم و مدل نیز چون از قبل این گویندهها را میشناخت، توانست تقریباً همه را به درستی تشخیص دهد. به همین دلیل، ما دادهها بیشتری جمعآوری کردیم. این دادهها حاوی 100 کلیپ صوتی جدید بودند که مدل صدای گوینده آنها را نمیشناخت. ما دادهها را پاکسازی کرده و مدل پیشبینی را روی این دادهها انجام داد. در این آزمایش مدل توانست با دقت 97% جنسیت گویندهها را پیشبینی کند.
این مدل، مدل خوبی است، اما نه به خوبی و بی نقصی مدلی که برای دستهبندی خود گویندهها توسعه داده شد. به همین دلیل، تصمیم گرفتیم مدل CNN را نیز برای حل این مسئله امتحان کنم.
درست مثل قبل، دادههای صوتی برچسبدار را به فایل تصویری تبدیل کرده و در پوشهای در سیستم خود ذخیره کردیم. ما چند قابداده ساخته و سپس از تابعی استفاده کردیم که تصاویر را در چند پوشه قرار میداد تا بتوان از آنها در Keras Generator استفاده کرد. چون مسئله اصلی ما صوت بود، فرکانس تصاویر کلیپهای صوتی را به نحوی تنظیم کردیم که همه بین 50 تا 280 هرتز باشند. چراکه فرکانس صدای یک مرد بزرگسال معمولی بین 85 تا 180 هرتز و در بین زنان بزرگسال معمولی نیز بین 165 تا 255 هرتز است. سپس برای برازش مدل (که چندین ساعت بهطول انجامید) از پیکربندی مشابه مدلCNN قبلی استفاده کردیم و به این ترتیب، به دقت 97.7% رسیدیم. وقتی به این فکر میکردیم که با اجرای مدل شبکه عصبی پیشخور متراکم روی دیتاست آزمایشی به دقت 99.8% رسیدیم، این نتیجه به نظر ناامیدکننده میآمد. این مدل را روی 100 فایل صوتی کاملاً جدیدی که پیشتر به آن اشاره کردم نیز آزمایش کردیم و به دقت 95% رسیدیم.
ما میتوانستیم این دو مدل را با مدل دستهبندی مبتنی بر رایگیری ترکیب کنیم تا دقت مدل افزایش یافته و همچنین دادههای بیشتری برای آموزش مدل در دست داشته باشم. اما برای این پروژه محدودیت زمانی تعریف شده بود و ما هم میخواستیم این مدل به نحوی باشد که بتوان از آن در بازنمایی تعاملی Interactive demonstration استفاده کرد؛ به همین دلیل، نمیشد از مدل CNN استفاده کرد. چراکه فرآیندهای آن از قبیل ایجاد تصویر از فایلها و برازش خود مدل زمان زیادی نیاز دارد. بنابراین، تصمیم گرفتیم از مدل NN که دقتش 97% بود استفاده کنیم.
قدمهای بعدی
ما قصد داریم روی پارامترهای برتر شبکه CNN خود جستجوی شبکهای انجام دهم و ببینیم آیا نتایج آن از شبکه عصبی دارای لایه متراکم Dense Layered Neural Network بهتر خواهد شد یا نه. این را میتوان با بارگذاری دادهها و استفاده از Google Colab نیز انجام داد. زیرا این سرویس امکان استفاده از GPU را به شما میدهد که سرعت اجرای شبکه عصبی را بهطرز چشمگیری افزایش خواهد داد. اگر برازش یک مدل شبکه عصبی روی لپتاپ شما 4 ساعت طول بکشد، این عمل روی Google Colab تنها 15 دقیقه زمان خواهد برد.
علاوه براین، قصد داریم مدل CNN را روی انواع مختلف تصاویری که librosa تولید میکند آزمایش کنیم تا ببینیم پیشبینی مدل CNN در کدام حالت دقیقتر است.
همچنین برای مسئله دسته بندی صداها براساس جنسیت نیز قصد داریم بررسی کنیم که آیا میتوان با افزودن بر تعداد دادههای آموزشی نتایج بهتری به دست آورد یا خیر. در این پروژه ما باید دادهها را بهصورت دستی برچسبگذاری میکردیم که کار زمانبری بود. با داشتن دادههای بیشتر، احتمالاً دقت مدل نیز افزایش پیدا خواهد کرد.
در آخر نیز قصد داریم یک مدل شبکه های عصبی بازگشتی را برازش دهیم و میزان دقت آن را بسنجیم. زیرا این مدلها عملکرد خوبی در کار با دادههای سری زمانی time series دارند و کلیپهای صوتی نیز ذاتاً سری زمانی هستند.