پردازش صوت درس سوم: Streaming mode در تشخیص صوت
در مقاله قبلی در خصوص نحوه پیش پردازش داده های صوتی برای آماده سازی داده ورودی مدل های هوش مثنوعی یادگرفتیم. در مقاله امروز با مفهوم استریم کردن داده های صوتی (Streaming mode در تشخیص صوت) آشنا می شویم. یکی از چالش های پیش روی متخصصان در حوزه داده های صوتی، حجم زیاد آن ها است. به عنوان مثال تنها یک دقیقه صوت غیر فشرده با کیفیت CD-quality، 5 کگابایت حافظه ذخیره سازی اشغال می کند.
حالا شما فرض کنید که عموما داده های صوتی مورد نیاز برای پردازش های هوش مصنوعی، چندین ساعت هستند. بناربراین برای نگه داری و پردازش آنها به چه میزان حافظه نیاز خواهیم داشت؟
در آموزش قبل ما از بخش کوچکی از دیتاست MINDS-14 استفاده کردیم، با این وجود حجم داده بزرگی رو به رو بودیم. برای مثال، کوچکترین نسخهی مجموعهداده GigaSpeech از SpeechColab که با برچسب xs شناخته میشود و ۱۰ ساعت دادهی آموزشی دارد، اما برای ذخیره و آماده سازی به ۱۳ گیگابایت حافظه نیاز دارد. تصور کنید بخواهیم از نسخهی بزرگتری استفاده کنیم چه اتفاقی می افتد؟ نسخهی کامل این مجموعهداده با برچسب xl، شامل ۱۰٬۰۰۰ ساعت دادهی آموزشی است. این حجم از داده به بیش از ۱ ترابایت فضای ذخیرهسازی نیاز دارد. این مقدار فراتر از ظرفیت یک هارد معمولی است. خب در این حالت باید هزینه کنیم و فضای ذخیرهسازی بیشتری بخریم؟ یا راهی وجود دارد که بتوانیم بدون نگرانی از فضای دیسک، از این نوع محموعه داده ها برای آموزش مدل های پردازش صوت استفاده کنیم؟
نحوه به کارگیری و مزایای stream mode
باز هم قرار است کتابخانه Datasets به کمک ما بیاید. این کتابخانه با فراهم کردن حالت “جریانسازی” (streaming mode) این مشکل را تا حدودی برطرف کرده است. با بهره گیری از این روش، دادهها بهصورت تدریجی و همزمان با پیمایش مجموعهداده در حافظه بارگذاری میشوند. به جای اینکه کل مجموعهداده را یکباره دانلود کنیم، هر بار فقط یک نمونه را بارگذاری میکنیم. در واقع همزمان با پیمایش مجموعهداده، نمونهها در همان لحظهای که به آنها نیاز داریم بارگذاری و آماده میشوند. به این ترتیب، فقط نمونههایی را که واقعاً استفاده میکنیم بارگذاری میکنیم و نمونههای دیگر را نه! وقتی کارمان با یک نمونه تمام شد، به سراغ نمونهی بعدی میرویم و آن را بارگذاری میکنیم. عالیه نه؟!!
استفاده از حالت streaming mode سه مزیت اصلی نسبت به دانلود کامل مجموعهداده دارد:
- فضای دیسک: از آنجایی نمونهها یکییکی و در زمان پیمایش به حافظه بارگذاری میشوند ( برخط)، نیازی به فضای دیسک نیست؛ بنابراین میتوانید از مجموعهدادههایی با هر اندازهای استفاده کنید.
- زمان دانلود و پردازش: چند ساعت داده صوتی را که به یاد دارید؟ قاعدتا دانلود و پردازش این حجم از مجموعهدادههای صوتی زمان زیادی نیاز دارند. مزیت دیگر streaming mode، این است که بارگذاری و پردازش بهصورت لحظهای انجام میشود، یعنی میتوانید بهمحض آماده شدن اولین نمونه، استفاده از مجموعهداده را شروع کنید و نیازی نیست برای دانلود همه آن صبر کنید. ( البته می دونم سرعت اینترنت و قطعی و وصلی و اینا رو اما خب مزیتیه که کل دنیا داره ما یه کم داریم :))
- آزمایش آسان: میتوانید روی چند نمونه محدود آزمایش انجام دهید تا مطمئن شوید اسکریپتتان درست کار میکند، بدون اینکه نیازی به دانلود کامل مجموعهداده باشد.
این نکته مهم در استفاده از حالت streaming mode رو یادت نره:
وقتی یک مجموعهداده را بهطور کامل و بدون استفاده از حالت جریانسازی دانلود میکنیم، هم دادههای خام و هم دادههای پردازششده روی دیسک ذخیره میشوند. در این حالت اگر بخواهیم دوباره از این مجموعهداده استفاده کنیم، میتوانیم مستقیماً و بدون نیاز به پردازش از داده ها استفاده کنیم و مراحل دانلود و پردازش را نادیده بگیریم. بنابراین، اگر قصد دارید از داده ها چندین بار استفاده کنید، حتما آن ها را یکبار دانلود و پردازش کنید. چون در غیر اینصورت در هر بار نیاز به استفاده مجدد لازم است مراحل دانلود لحظه ای و پردازش (on fly) دوباره انجام شود.
چطور میتوان حالت جریانسازی را فعال کرد؟ خیلی ساده! کافیست هنگام بارگذاری مجموعهداده، گزینهی streaming=True
را تنظیم کنید. باقی کارها بهصورت خودکار انجام میشود:
gigaspeech = load_dataset("speechcolab/gigaspeech", "xs", streaming=True)
همانطور که مراحل پیشپردازش را روی یک زیرمجموعهی دانلودشده از مجموعهدادهی MINDS-14 اعمال کردیم، میتوانید دقیقاً به همان شکل، همان مراحل پیشپردازش را روی یک مجموعهدادهی در استریم مود نیز انجام دهید.
اگر داده را در حالت استریم مود استفاده کنید، نمیتوانید با استفاده از اندیسگذاری پایتونی (مثلاً `gigaspeech[“train”][sample_idx]`) به نمونههای خاص دسترسی پیدا کنید. در عوض باید روی مجموعهداده پیمایش (iterate) انجام داد. در ادامه نخوه دسترسی به یم نمونه داده در حالت stream mode را یاد میگیریم:
next(iter(gigaspeech["train"]))
خروجی مورد انتظار:
{
"segment_id": "YOU0000000315_S0000660",
"speaker": "N/A",
"text": "AS THEY'RE LEAVING <COMMA> CAN KASH PULL ZAHRA ASIDE REALLY QUICKLY <QUESTIONMARK>",
"audio": {
"path": "xs_chunks_0000/YOU0000000315_S0000660.wav",
"array": array(
[0.0005188, 0.00085449, 0.00012207, ..., 0.00125122, 0.00076294, 0.00036621]
),
"sampling_rate": 16000,
},
"begin_time": 2941.89,
"end_time": 2945.07,
"audio_id": "YOU0000000315",
"title": "Return to Vasselheim | Critical Role: VOX MACHINA | Episode 43",
"url": "https://www.youtube.com/watch?v=zr2n1fLVasU",
"source": 2,
"category": 24,
"original_full_path": "audio/youtube/P0004/YOU0000000315.opus",
}
اگر میخواهید به چند نمونه از یک مجموعهدادهی بزرگ ئسترسی داشته باشید، میتوانید از تابع `take()` استفاده کنید. در این حالت اولین n نمونه ابتدای دیتاست را دریافت می کنید. مثلاً برای گرفتن دو نمونهی اول از مجموعهدادهی gigaspeech میتوانید به شکل زیر عمل کنید:
gigaspeech_head = gigaspeech["train"].take(2)
list(gigaspeech_head)
خروجی:
[
{
"segment_id": "YOU0000000315_S0000660",
"speaker": "N/A",
"text": "AS THEY'RE LEAVING <COMMA> CAN KASH PULL ZAHRA ASIDE REALLY QUICKLY <QUESTIONMARK>",
"audio": {
"path": "xs_chunks_0000/YOU0000000315_S0000660.wav",
"array": array(
[
0.0005188,
0.00085449,
0.00012207,
...,
0.00125122,
0.00076294,
0.00036621,
]
),
"sampling_rate": 16000,
},
"begin_time": 2941.89,
"end_time": 2945.07,
"audio_id": "YOU0000000315",
"title": "Return to Vasselheim | Critical Role: VOX MACHINA | Episode 43",
"url": "https://www.youtube.com/watch?v=zr2n1fLVasU",
"source": 2,
"category": 24,
"original_full_path": "audio/youtube/P0004/YOU0000000315.opus",
},
{
"segment_id": "AUD0000001043_S0000775",
"speaker": "N/A",
"text": "SIX TOMATOES <PERIOD>",
"audio": {
"path": "xs_chunks_0000/AUD0000001043_S0000775.wav",
"array": array(
[
1.43432617e-03,
1.37329102e-03,
1.31225586e-03,
...,
-6.10351562e-05,
-1.22070312e-04,
-1.83105469e-04,
]
),
"sampling_rate": 16000,
},
"begin_time": 3673.96,
"end_time": 3675.26,
"audio_id": "AUD0000001043",
"title": "Asteroid of Fear",
"url": "http//www.archive.org/download/asteroid_of_fear_1012_librivox/asteroid_of_fear_1012_librivox_64kb_mp3.zip",
"source": 0,
"category": 28,
"original_full_path": "audio/audiobook/P0011/AUD0000001043.opus",
},
]
حالت stream mode میتواند پژوهش شما را متحول کند؛ در این حالت شما می توانید بدون دغدغهی فضای ذخیرهسازی،بهصورت همزمان روی چندین مجموعهداده ارزیابی کنید. بدیهی است ارزیابی همزمان روی چندین مجموعهداده، شاخص دقیقتری از توانایی تعمیم و عملکرد واقعی یک سیستم تشخیص گفتار ایحاد می کند. نمونهی برجستهای از این رویکرد، «معیار جامع تشخیص گفتار» یا End-to-end Speech Benchmark (ESB) است.
منتظر مقاله بعدی ما باشید. هر هفته یک مقاله در حوزه پردازش صوت و منتشر می شود.
مطالب مرتبط:
درس اول: مقدمات آموزش پردازش صوت و تشخیص گفتار
درس دوم: آشنایی با کتابخانه Datasets در پردازش های هوش مصنوعی داده های صوتی