پردازش صوت یکی از حوزه های تو ظهور هوش مصنوعی است که اخیرا پیشرفت های چشم گیری داشته است. در سلسله مقالات پردازش صوت به نحوه استفاده از داده های صونی و ندل های کریوط به این حوزه می پردازیم. ابتدایی ترین بخش پردازش صوت شناخت داده های صوتی است. در این مقاله به بررسی داده های صوتی و نحوه پیش پردازش آن ها می پردازیم.????
پیش پردازش دیتاست صوتی
اگر قصد دارید یک مدل هوش مصنوی را آموزش دهید یا از آن برای گرفتن خروجی و استدلال استفاده کنید. برای این کار ابتدا باید داده ها را پیش پردازش کنید: به طور کلی این فرآیند شامل مراحل زیر است:
- نمونه برداری مجدد از داده های صوتی
- فیلتر کردن مجموعه داده
- تبدیل داده های صوتی به ورودی مورد انتظار مدل
نمونه برداری مجدد از داده های صوتی (Resampling the audio data)
برای بارگذاری داده های صوتی از تایع load_dataset استفاده می شود. این تابع داده های را با sampling rate یا نرخ نمونه برداری که داده منتشر شده است بارگذاری می کند . این sampling rate همیشه آن چیزی که مدل ما انتطار دارد نیست مثلا فرض کنید داده با نرخ نمونه برداری 16000 هرتز منتشر شده است اما مدل انتخابی ما، انتظار داده با sampling rate ، 48000 را دارد. در چنین مواردی باشد باید ابتدا داده ورودی به داده مورد انتظار مدل تبدیل شود.
داده مورد انتظار در اکثر داده های از پیش آموزش دیده موجود (pretrained ) نرخ نمونه برداری برابر با 16 کیلو هرتز دارند اما به عنوان مثال بررسی دیتاست MINDS-14 نشان میدهد نرخ نمونه برداری این داده های برابر 8 کیلوهرتز است. در چنین شرایطی تیاز به Resampling داده ها نیاز داریم.
برای انجام این کار از عملیات cast_column استفاده می کنیم. در این متد این عملیات تغییر صدا را به صورت یکجا انجام نمیشود، بلکه مجموعه دادهها علامت گذاری می شود و بدین ترنیب صداهای نمونه حین بارگذاری تغییر فرکانس می دهند. کد زیر فرکانس نمونهبرداری را به ۱۶ کیلوهرتز تنظیم میکند:
from datasets import Audio
minds = minds.cast_column('audio', Audio(sampling_rate=16_000))
حال اگر مجموعه داده MINDS-14 را دوباره بارگذاری کنیم و sample rate آن را بررسی کنیم شاهد تغییر نرخ نمونه برداری داه ها خواهیم بود.
minds[0]
خروجی
{
'path': '/root/.cache/huggingface/datasets/downloads/extracted/
f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-AU~PAY_BILL/response_4.wav',
'audio': {
'path': '/root/.cache/huggingface/datasets/downloads/extracted/
f14948e0e84be638dd7943ac36518a4cf3324e8b7aa331c5ab11541518e9368c/en-AU~PAY_BILL/response_4.wav',
'array': array(
[
2.0634243e-05,
1.9437837e-04,
2.2419340e-04,
...,
9.3852862e-04,
1.1302452e-03,
7.1531429e-04,
],
dtype=float32,
),
'sampling_rate': 16000,
},
'transcription': 'I would like to pay my
electricity bill using my card can you please assist',
'intent_class': 13,
}
ممکن است متوجه شوید که مقادیر آرایه اکنون نیز متفاوت است. این رویداد به این دلیل رخ می دهد که ما اکنون دو برابر تعداد مقادیر دامنه برای هر یک از مقادیر قبلی داریم.
نکته:
پیشینه resampling یا بازسازی نرخ نمونه برداری : اگر یک سیگنال صوتی با فرکانس ۸ کیلوهرتز نمونهبرداری شده باشد، به این معنی است که در هر ثانیه ۸۰۰۰ نمونه گرفته شده است. میدانیم که این سیگنال صوتی شامل فرکانسهایی بالاتر از ۴ کیلوهرتز نیست. این موضوع با استفاده از قضیه نمونهبرداری نایکویست تضمین شده است. به همین خاطر میتوانیم مطمئن باشیم که در بین نقاط نمونهبرداری، سیگنال اصلی همیشه یک منحنی صاف را تشکیل میدهد. افزایش نرخ نمونهبرداری به یک نرخ بالاتر، به محاسبه مقادیر نمونه اضافی که در بین نمونههای موجود قرار میگیرند، وابسته است و این کار با تقریب این منحنی صورت میگیرد. اما کاهش نرخ نمونهبرداری نیاز دارد که ابتدا هر فرکانسی که بالاتر از حد نایکویست جدید است را فیلتر کنیم، قبل از اینکه نمونههای جدید را تخمین بزنیم. به عبارت دیگر، نمیتوانیم به سادگی با حذف هر نمونه دوم، نرخ نمونهبرداری را ۲ برابر کاهش دهیم؛ زیرا این کار باعث ایجاد اعوجاجهایی در سیگنال به نام ‘انعکاس’ میشود. انجام صحیح مجدد نمونهبرداری کار دشواری است و بهتر است به کتابخانههای آزمایششدهای مانند librosa یا Datasets واگذار شود.
فیلتر کردن دیتاست
گاهی لازم است داده های صوتی را بر اساس معیار خاصی فلیتر کنیم. معیارهای فیلتر کردن داده بر اساس ورودی مدل یا پیش نیازهای مساله ای که بر روی آن کار می کینم متفاوت است. یکی از رایج ترین فیلترها، محدود کردن زمان دادههای صوتی به یک مقدار مشخص است. به عنوان مثال، ممکن است بخواهیم هر نمونه ای که بیش از 20 ثانیه است را فیلتر کنیم تا از خطاهای سرریز حافظه هنگام آموزش یک مدل جلوگیری کنیم.
برای انجام این کار از متد filter استفاده می کنیم و منطقی که بر اساس آن باید فبلتر انجام شود را به آن ارسال می کنیم. بیایید با نوشتن تابعی شروع کنیم که نشان میدهد کدام مثالها را باید نگه داشت و کدام را دور انداخت. این تابع، is_audio_length_in_range، اگر نمونه کوتاهتر از 20 ثانیه باشد True و اگر بیشتر از 20 ثانیه باشد، False را برمیگرداند.
MAX_DURATION_IN_SECONDS = 20.0
def is_audio_length_in_range(input_length):
return input_length < MAX_DURATION_IN_SECONDS
تابع فیلتر کردن بالا را می توان در ستون زمان مجموعه داده اعمال کرد، اما ما ستونی با مدت زمان صوت در این مجموعه داده نداریم. با این حال، میتوانیم یک ستون حدید با این مقادیر به مجموعه داده اضافه کرد، سپس بر اساس مقادیر موجود در آن ستون فیلتر انجام شود و بعد از آن ستون را مجددا حذف کنیم.
# use librosa to get example's duration from the audio file
new_column = [librosa.get_duration(path=x) for x in minds['path']]
minds = minds.add_column('duration', new_column)
# use ???? Datasets' `filter` method to apply the filtering function
minds = minds.filter(is_audio_length_in_range, input_columns=['duration'])
# remove the temporary helper column
minds = minds.remove_columns(['duration'])
minds
در تابع بالا مقدار مدت زمان صوت به ستون های دیتاست ما اضافه شده است. از این طریق می توان عمل فیلتر کردن داده را انجام داد. خروجی آن به شکل زیر است.
Dataset({features: ['path', 'audio', 'transcription', 'intent_class'], num_rows: 624})
بدین ترتیب مجموعه داده از 654 نمونه به 624 کاهش یافته است.
پیش پردازش دیتاست صوتی (Pre-processing audio data)
یکی از چالش برانگیزترین جنبه های کار با مجموعه داده های صوتی، آماده سازی داده ها در قالب مناسب برای آموزش مدل است. همانطور که دیدید، داده های صوتی خام به صورت آرایه ای از sample value می آیند. با این حال، مدلهای از پیش آموزشدیده ( pre-trained) ، چه از آنها برای استنتاج ( fine-tune) استفاده کنید، چه بخواهید آنها را برای کار خود تنظیم کنید، انتظار دارید دادههای خام به feature ورودی تبدیل شوند. الزامات ویژگی های ورودی ممکن است از یک مدل به مدل دیگر متفاوت باشد – آنها به معماری مدل و داده هایی که از قبل با آن آموزش داده شده است بستگی دارد. خبر خوب این است که برای هر مدل صوتی پشتیبانیشده، ???? ترانسفورماتورها یک کلاس استخراج ویژگی ارائه میکنند که میتواند دادههای صوتی خام را به feature ورودی مورد انتظار مدل تبدیل کند.
بنابراین سوال این است که یک استخراج کننده ویژگی یا feature extractor با داده های صوتی خام چه می کند؟ بیایید نگاهی به Whisper به عنوان feature extractor بیاندازیم تا برخی از تبدیلهای رایج feature extractor ها را درک کنیم. Whisper یک مدل از پیش آموزش دیده برای تشخیص خودکار گفتار (ASR) است که در سپتامبر 2022 توسط الک رادفورد و همکاران منتشر شد.
مدل Whisper ابتدا تمانی داده های موجود در دیتاست را به نمونه های با طول 30 ثانیه تبدیل می کند. اگر نمونه ای در داده صوتی موجود باشد که کمتر از 30 ثانیه زمان داشته باشد به انتهای آن مقدار صفر اضافه می شود (صفرها در سیگنال صوتی به معنای وجود نداشتن سیگنال یا سکوت هستند). در ادامه نمونه هایی که بیشتر از 30 ثانیه باشند کوتاه می شوند. حال از آنجایی که تمامی داده ها با روش padded/truncated طول مساوی 30 ثانیه پیدا کردند نیازی به attention mask یا ماسک توجه نیست. Whisper از این نظر منحصربهفرد است، اکثر مدلهای صوتی دیگر به یک ماسک توجه نیاز دارند که جزئیات مکانهایی را که دنبالهها اضافه شدهاند یعنی بخش هایی که داده کمتر از سول مورد قبول بوده است و صفر اضافه شده است، و در نتیجه مکانهایی که باید در فرآیند attention mask نادیده گرفته شوند، دارند. Whisper آموزش داده شده است که بدون ماسک توجه کار کند و مستقیماً از سیگنال های گفتاری استنباط کند که کجا باید ورودی ها را نادیده بگیرد.
دومین عملیاتی که فیچر اکسترکشن Whisper انجام میدهد، تبدیل آرایههای صوتی پرشده به log-mel spectrogram است. spectrogramها چگونگی تغییر فرکانس سیگنال در طول زمان را توصیف میکنند. فرکانسها بر روی مقیاس مل بیان میشوند و شدت صداها (آمپلیتود) نیز به دسیبل اندازهگیری میشود تا فرکانسها و شدتها به طور واقعیتری نمایانگر شنوایی انسان باشند. همه این تغییرات را می توان با چند خط کد روی داده های صوتی خام شما اعمال کرد. در ادامه feature extractor مدل از پیش آموزش دیده Whisper را بارگیری می کنیم تا برای داده های صوتی خود آماده کنیم:
from transformers import WhisperFeatureExtractor
feature_extractor = WhisperFeatureExtractor.from_pretrained('openai/whisper-small')
در مرحله بعد، میتوانید تابعی بنویسید تا یک مثال صوتی با استفاده از feature_extractor پیش پردازش کند.
def prepare_dataset(example):
audio = example['audio']
features = feature_extractor(
audio['array'], sampling_rate=audio['sampling_rate'], padding=True
)
return features
ما میتوانیم تابع آمادهسازی دادهها را برای همه نمونههای آموزشی خود و با استفاده از روش Datasets’ map اعمال کنیم:
minds = minds.map(prepare_dataset)
minds
خروجی
Dataset(
{
features: ['path', 'audio', 'transcription', 'intent_class', 'input_features'],
num_rows: 624,
}
)
به همین سادگی، ما اکنون log-mel spectrograms یا طیف داده ها را به عنوان ورودی در مجموعه داده داریم.
بیایید آن را برای یکی از نمونههای مجموعه داده ذهن تجسم کنیم:
import numpy as np
example = minds[0]
input_features = example['input_features']
plt.figure().set_figwidth(12)
librosa.display.specshow(
np.asarray(input_features[0]),
x_axis='time',
y_axis='mel',
sr=feature_extractor.sampling_rate,
hop_length=feature_extractor.hop_length,
)
اکنون می توانید ورودی صوتی مدل Whisper پس از پیش پردازش ببینید.
با هوش مصنوعی انگلیسی یاد بگیر
به فرمت مورد انتظار مدل است. با این، بسیاری از وظایف مرتبط با صدا چندحسی، مانند حال شناخته شده هستند. در چنین مواردی، ???? Transformers همچنین توکنایزرهای مدلی خاص را برای پردازش ورودیهای متنی ارائه میدهند. میتوانید استخراجکننده ویژگی و توکنایزر Whisper و سایر مدلهای چندوجهی را بهطور جداگانه بارگیری کنید، یا میتوانید هر دو را از طریق یک پردازشگر به اصطلاح بارگیری کنید. برای سادهتر کردن کارها، از AutoProcessor برای بارگیری استخراجکننده ویژگی و پردازنده یک مدل از یک نقطه بازرسی استفاده کنید، مانند کد زیر:
from transformers import AutoProcessor
processor = AutoProcessor.from_pretrained('openai/whisper-small')
در این مقاله سعی شد نحوه آماده سازی داده ثوتی توضیح داده شود. باید دقت داشته باشید که ممکن است داده های سفارشی مانند داده هایی که یک شرکت و مجموعه خاص برای وظایف منحصر به فرد مد نظر خود تهیه کرده است به پردازش های پیچیده تری نساز داشته باشد. در چنین مواردی می توانید تابع prepare_dataset را بر اساس نیاز های خود بازنویسی کتید.
نمونه استفاده از داده های شخصی سازی شده در آموزش مدل های هوش مصنوعی برای تشخیص روخوانی و روانخوانی قرآن کریم با کمک هوش مصنوعی توسط شرکت فناوری هوشمند و نرم افزار ویرا اجرا شده است.