![]() |
کتابخانهی تشخیص گوینده
۱- کتابخانهی تشخیص صحبت – گویندهی جیالانگ هی۱
کتابخانهی مزبور که از طریق مرجع شمارهی ۱ قابل دستیابی است به زبان C++ نوشته شده و شامل حدود ۲۰ کلاس است که الگوریتمهای رایج استخراج خصیصهها و تکنیکهای رایج برای تشخیص صحبت و تأیید هویت گوینده را پیادهسازی مینماید. محتویات این کتابخانه امکان پردازش صحبت به صورت بدون سرباره۲ و با سرباره در فرمتی خاص را به کاربر میدهد و امکانات مختلفی را برای کار با فایلهای حاصل که حاصل اعمال یک الگوریتم به صورت یک الگو و یا یک مدل بر دادههای ورودی است فراهم میآورد. در بحث مدلسازی سیگنال استخراج خصیصهها خصیصههای مبتنی بر الگوریتم فوریهی سریع با اندازهی مل۳، خصیصههای به دست آمده از روش پیشگویانهی خطی۴، خصایص پویای مبتنی (دلتاها که در فصل ششم توضیح داده شد) را به همراه زیری و بمی۵ صدا را با استفاده از این کتابخانه به دست آورد. روشهای متداول مدلسازی صحبت شامل چندین روش مبتنی بر مدل نهان مارکف۶، مدل مقدارگزینی برداری۷، مدل گاوسی۸ و مدلسازی به شیوهی چشمپوشی زمانی پویا۹ نیز در این کتابخانه وجود دارند. این موارد در کنار امکانات اولیهی پیادهسازی شده در این کتابخانه شامل تبدیل سریع فوریه و عکس آن، تبدیل کسینوسی گسستهی فوریه، تحلیل پیشگویانهی خطی، امکانات طراحی فیلتر، توابع پنجرهای (هنینگ، همینگ و …) و چندین تابع ابتدایی دیگر این کتابخانه را یک نقطهی آغاز مناسب برای طراحی برنامههای کامپیوتری تشخیص صحبت و یا گوینده نموده است. با وجود آن که این کتابخانه به صورت رایگان قابل دستیابی است کد آن در دسترس قرار ندارد و این نکته باعث بروز مشکلاتی در تطبیق آن با انتخابهای برنامهنویسی کاربر میگردد. در ضمن با وجود یک سری مستندات ناقص و ارجاعهای متعدد منابع مرتبط با پردازش کامپیوتری صحبت به این کتابخانه مسألهی درک چگونگی کارکرد و استفادهی درست از این کتابخانه به طور کامل نیازمند پیشزمینهی قوی در زمینهی پردازش صحبت است و مستندات آن برای درک روش عملکرد آن کافی نیست. در هر صورت ما از این کتابخانه برای مدلسازی سیگنال به شیوهی استخراج خصیصههای مبتنی بر الگوریتم فوریهی سریع با اندازهی مل از این کتابخانه بهره جستهایم و برای مقایسهی الگوهای به دست آمده نیز از شیوهی چشمپوشی زمانی پویای پیادهسازی شده در این کتابخانه استفاده کردهایم که کارایی سیستم وابسته به متن به دست آمده میتواند گویای تواناییهای این کتابخانه باشد. ۲- پایگاه دادههای عبارتهای عبور- شمای کلی۱۰ ما برای پردازش عبارتهای عبور ایجاد شده از یک ساختار پایگاه دادهها استفاده میکنیم که در آن الگوهای به دست آمده از عبارتهای عبور به همراه نام کاربران را ذخیره مینماییم. برای سادهتر شدن نحوهی پردازش عبارتهای مختلف برای یک کاربر آنها را به صورت تکراری با نام یکسان ذخیره میکنیم و کار طبقهبندی آنها تحت نام یک کاربر را در هنگام بازیابی آنها انجام میدهیم. برای نیل به هدف یاد شده ما کلاسی به نام HSpeaker برای نمایش هر عبارت گفته شده توسط کاربر خاص تعریف کردهایم و وظیفهی پردازش دستهای از اشیاء از نوع این کلاس را به کلاسی به نام HSpeakersDB واگذار نمودهایم که البته این کلاس از یک کلاس و دو ساختار میانی برای پردازش اعمال مورد نظر استفاده مینماید. برنامهی نهایی از کلاس HSpeakersDB برای پردازش نهایی استفاده میکند هر چند در بعضی موقعیتها ارجاعهای مستقیمی نیز به کلاس HSpeaker صورت پذیرفته است. بخشهای بعدی ساختار درونی کلاسهای یاد شده را توضیح میدهد. ۳- عبارت عبور و پردازشهای مربوط به آن هر عبارت عبور به همراه نام گویندهی آن توسط شیئی از نوع کلاس HSpeaker قابل نمایش است: كد:
class HSpeaker کلاس SV_Data یکی از کلاسهای کتابخانهی SVLib۱۱ است که نمایشگر یک ماتریس میباشد. نتیجهی پردازشها و الگوهای به دست آمده از آنها در نهایت به دادههایی از این نوع تبدیل میشوند. عضو دادهی m_pPassphrase الگوی به دست آمده یا ذخیره شده را که اعمال مقایسهای روی آن صورت میپذیرد نشان میدهد. علت تعریف این عضو به صورت اشارهگر آن است که مقدار خروجی متدهای استخراج خصیصه اشارهگر به این کلاس است و در ضمن در خود این متدها فضای حافظهی لازم به دادهی مورد نظر تخصیص داده میشود. کلاس SV_Model_DTW عمل مقایسهی دو الگو را که به صورت اشیائی از نوع SV_Data نمایش داده میشوند انجام میدهد و عضو دادهی مورد نظر برای چنین امری در نظر گرفته شده است. علت تعریف این عضو داده به صورت اشارهگر و اختصاص فضای حافظه بدون آزاد کردن آن مشکلی بود که در استفاده از این عضو داده در محیط برنامهنویسی غیر متنی به واسطهی خطای مراجعه به فضای حافظهی غیر مجاز به وجود میآمد که به نظر میرسد ناشی از تلاش برای آزاد کردن حافظهای که قبلاً آزاد شده در متد ویرانگر این کلاس میباشد و به لحاظ عدم وجود کد کتابخانه به این صورت رفع شده است.۱۲ عضو دادهی m_strName نام گویندهی عبارت را ذخیره میکند که توسط متدهای SetUserName و GetUserName اعمال مقدارگذاری و دریافت مقدار آن صورت میپذیرد: كد:
void HSpeaker::SetUserName(CString strName) قبل از هر گونه عمل مقایسه بایستی عبارت عبور الگویابی شود این عمل با دریافت دادههای صوتی که به صورت یک آرایه از نوع short دریافت میشود و تبدیل آن به الگوی مورد نظر در متد SetPassphrase صورت میپذیرد: كد:
void HSpeaker::SetPassphrase(int nSamples, short* pSamples) کلاس SV_Feature_MFCC نیز مربوط به کتابخانهی SVLib است و پردازشهای لازم برای استخراج الگوهای MFCC از سیگنال صوت در آن قرار داده شده است. قبل از فراخوانی متدهای آن میبایست انتخابهای لازم انجام شود و این عمل با استفاده از متد PrepareFeature صورت میپذیرد: كد:
void HSpeaker::PrepareFeature(SV_Feature_MFCC &Feature) در این متد انتخابهای مربوط به نوع پنجرهبندی (همینگ یا پنجرهبندی مستطیلی)، اندازهی پنجره، اندازهی بازهی fft ، انتخاب این که آیا انرژی سیگنال هم به الگو ضمیمه شود یا نه، انتخاب این که آیا سکوت از سیگنال حذف شود یا نه و… با مقدارگذاری اعضای دادهی عمومی کلاس SV_Feature انجام میپذیرد. پس از مقدارگذاری موارد یاد شده متد CopySignal برای ورود سیگنال به شیء استخراج کنندهی الگو فراخوانی میشود. از آنجا که این متد و سایر متدهای مشابه کلاس SV_Featue_MFCC (وکلاسهای مشابه برای استخراج خصیصهها از روشهای دیگر) یک آرایه از نوع short را به عنوان سیگنال ورودی میپذیرند همچنان که در فصل چهارم اشاره شد اعضای دادهی کلاسهای پردازش صوت را از این گونه انتخاب نمودیم. لذا در این مرحله نیازی به هیچ گونه تغییر نداریم. بعد از انجام تمامی مقدار گذاریها متد ExtractFeature الگوهای خواسته شده را استخراج نموده حاصل را به صورت اشارهگر بازمیگرداند. همچنان که قبلاً اشاره شد اختصاص حافظه به صورت درونی صورت میپذیرد و نیازی به انجام این کار پیش از فراخوانی این متد وجود ندارد. بعد از استخراج الگوها یا فراخوانی یک متد ساده از کلاس SV_Model_DTW میتوان عمل مقایسه را انجام داد و حاصل را که یک عدد اعشاری نشان دهندهی میزان فاصلهی دو الگو از یک دیگر است به محل فراخوانی بازگرداند: كد:
double HSpeaker::Verify(HSpeaker* pSpeaker) برای بازیابی نیز ابتدا نام کاربر، سپس اندازهی الگو و در نهایت خود الگو با استفاده از یک فایل موقتی بازیابی میگردد: كد:
BOOL HSpeaker::LoadFrom(CFile* pFile) برای فایلی که در آن ذخیره با بازیابی صورت میگیرد اعمال باز کردن و بستن انجام نمیشود زیرا نحوهی استفاده از این متدها معمولاً شامل چندین فراخوانی متوالی است که یک بار بازکردن فایل و در نهایت یک بار بستن آن به ازای کلیهی فراخوانیها کافی است. ۴- چند عبارت عبور برای یک کاربر و پردازشهای مربوط به آن هر کاربر میتواند چندین کلمهی عبور داشته باشد، برای پردازش این حالت ساختار زیر یک لیست پیوندی از کلمهی عبورهای یک کاربر تشکیل میدهد: كد:
struct SpeakerPasses متد Verify متد هم نام خود را متعلق به عضو دادهی pSpeaker فراخوانی میکند و مقدار بازگشتی آن را میگرداند و با فراخوانی مستقیم این متد چندان تفاوتی ندارد. با استفاده از ساختار فوق و با استفاده از زنجیرهای از دادههای از این نوع میتوان لیست عبارات عبور مربوط به یک کاربر را نگهداری نمود. ایجاد زنجیرهای از کاربران با استفاده از ساختار زیر صورت میگیرد: كد:
struct SpeakersPasses متدهای این ساختار روشهایی برای مقایسهی اجزای داخلی فراهم میآورد. متد Identify به سادگی مینیمم فاصلهی اجزای لیست با یک عبارت داده شده را به دست میدهد: كد:
double SpeakersPasses::Identify(HSpeaker* pSpeaker) در بخشهایی از کار ما میدانیم که یک عبارت متعلق به یک کاربر است و نیاز به این داریم که بدانیم دقیقاُ کدام عبارت متعلق به کاربر است. مثلاً زمانی که بخواهیم یک عبارت پذیرفته شده از یک کاربر را از لیست عبارتهای مورد نظر او حذف کنیم به چنین امکانی نیاز داریم. متد زیر چنین امکانی را فراهم میآورد: كد:
double SpeakersPasses::Find(HSpeaker* pSpeaker, int &Index) اگر به مقدار بازگشتی متدهایی که به نحوی با تأیید هویت یا بازشناسی هویت یک کاربر ربط دارند توجه شود مشخص میگردد که همواره یک مقدار اعشاری بازگردانده میشود و هیچگاه یک نتیجهی منطقی (که یکسان هستند با نه) بر نمیگردد. این به دلیل آن است که برنامه قابلیت آن را دارد که طبق خواستهی کاربر آستانهی مورد استفاده برای یکسان بودن عبارات عبور را تغییر میدهد (که ممکن است باعث کاهش درصد خطای برنامه و در نتیجهی افزایش امنیت یا کاهش میزان سختگیری برتامه و در نتیجه کاهش تعداد تلاشهای لازم برای گرفتن جواب شود). از این رو عمل مقایسه با آستانه در کلاسهای کنترل کنندهی تشخیص کاربر انجام میگیرد. ۵- ایجاد یک جدول از کاربران در مرحلهی بعد نیاز به آن داریم که کلیهی پردازشهای اشاره شده برای کاربران منفرد را در کنار هم قرار دهیم و به مجموعهی کاربران به عنوان یک کل نگاه کنیم. به این منظور کلاسی به نام HSpeakersTable با ساختار زیر طراحی شد: كد:
class HSpeakersTable تنها عضو دادهی این کلاس اشارهگر به آغاز لیست کاربران است که در حالتی که لیست خالی است مقدار آن برابر با NULL خواهد بود. متدهای بعدی اعمال کار با لیست کاربران را پیادهسازی مینمایند. عملی که متد Insert انجام میدهد شامل مقایسهی نام کاربران با نام وارد شده برای عبارت مورد نظر است. در صورتی که لیست تهی باشد مقایسهای انجام نمیشود و تنها نود ابتدایی ایجاد میگردد: كد:
void HSpeakersTable::Insert(HSpeaker* pSpeaker) كد:
int HSpeakersTable::GetIndex(CString str) كد:
int HSpeakersTable::GetNum() عمل حذف یک کاربر که اندیس آن را در آرایهی لیست کاربران میدانیم نیز یک عمل سادهی پردازش لیست است: كد:
void HSpeakersTable::RemoveUser(int nIndex) متد Identify عمل بازشناسی کاربر را انجام میدهد. برای بازشناسی یک کاربر عبارت عبور داده شده به کمک متد Verify ساختار SpeakersPasses با تمامی لیست کاربران مقایسه میشود و مقدار تفاوت نزدیکترین کاربر با مقدار آستانهی داده شده مقایسه میگردد و در صورتی که از آن میزان کمتر باشد اندیس کاربر و در غیر این صورت مقدار -1 به محل فراخوانی بازگردانده میشود: كد:
int HSpeakersTable::Identify(HSpeaker* pSpeaker, double fThreshold) متد RemPass متدی است که به وسیلهی آن برنامهنویس میتواند کاربری را که دارای عبارت عبور داده شده است حذف کند. در صورتی که عمل موفقیتآمیز باشد یعنی کاربری با عبارت داده شده یافته شود و حذف گردد مقدار منطقی TRUE و در غیر این صورت مقدار FALSE به محل فراخوانی بازگردانده میشود. ملاحظهی این که عبارت مزیور از ابتدای لیست حذف میشود یا نه از پردازشهای این متد است. همچنین فرض بر این است که هیچگاه تقاضای حذف عبارت عبور کاربری که تنها یک عبارت عبور دارد نخواهد شد. این متد برای یافتن عبارت مزبور از متد Find ساختار SpeakersPasses سود میجوید: كد:
BOOL HSpeakersTable::RemPass(int nIndex, HSpeaker* pSpeaker, double fThreshold) ۶- تشکیل و کار با پایگاه دادهها پایگاه دادههای کاربران معمولاُ تعداد عنصرهای محدودی دارد و پردازشهای آن نیز مختص به خود است. لذا استفاده از یک پایگاه دادههای تخت مبتنی بر یک فایل مناسب به نظر میرسد. مزید بر این انتخابهای کاربر را نیز میتوان در این ساختار ذخیره نمود. اعمال کار با فایل که نهایت استفاده از این کتابخانه است در کلاس HSpeakersDB انجام میشود: كد:
class HSpeakersDB هفت متد ابتدایی تنها متدهای متناظر خود در عضو دادهی m_pTable را فراخوانی میکنند و دو متد آخر مقدار پارامتر fThreshold در متدهای متناظر را با عضو دادهی m_fThreshold که توسط متد SetSecurityLevel مقدار گذاری میشود جایگزین میکنند: كد:
int HSpeakersDB::GetUsersNum() متد SetSecurityLevel مقدار m_fThreshold را با انتخاب آن از یک لیست از مقادیر به دست آمده از تجربه مقدارگزینی مینماید و متد GetSecurityLevel عکس این عمل را انجام میدهد: كد:
void HSpeakersDB::SetSecurityLevel(int nLevel) اعضای دادهی m_nRepetitions و m_fMinPassLength در هیچکدام از متدهای کلاس (به غیر از متدهای مقدارگذار و بازگردانندهی مقدار آنها) کاربرد عملی ندارند و تنها برای آن که در متدهای ذخیره و بازیابی در پایگاه دادههای عبارات رمز ذخیره و یا از آن بازیابی شوند عضو این کلاس هستند. متد StoreUsers کاربران و انتخابهای مربوط به آنها را درپایگاه دادهها ثبت مینماید: كد:
void HSpeakersDB::StoreUsers() متد LoadUsrers کاربران ذخیره شده را بارگذاری میکند و در صورت عدم وجود، آن را به وجود میآورد: كد:
void HSpeakersDB::LoadUsers() مجموعه کلاسهای فوق یک کتابخانهی ایستا به نام HSpeakersDBLib را تشکیل میدهند که میتوان با استفاده از آن یک سیستم تشخیص گویندهی وابسته به متن ساده را پیادهسازی نمود. همچنانکه اشاره شد کتابخانهی اصلی مورد استفاده تواناییهای گستردهای برای کار با انواع روشها و الگوریتمها دارد که میتوان با کار روی آنها سیستمهای تشخیص گوینده با تشخیص صحبت با کارایی عملی ایجاد نمود. فرضیات ما در نحوهی استفاده از این کلاس نحوهی پیادهسازی این کلاس مؤثر بوده و برای به وجود آوردن یک مجموعهی دارای کاربرد کلیتر باید بیشتر روی این کتابخانه کار شود اما به نظر میرسد همچنان که از عملکرد برنامهی پیادهسازی شده قابل مشاهده است حتی این استفادهی ساده از این کتابخانه نیز میتواند برطرف کنندهی نیازهای یک برنامهنویس در زمینهی طراحی یک سیستم تشخیص گوینده میباشد. ۷- منابع فصل 1) Jialong He, SVLib Library, downloadable from http://tiger.la.asu.edu/personal.htm *Jialong He *raw *Mel-scaled FFT based cepstrum [MFCC] *LPC based cepstrum [LPCC] *pitch *Hidden Markov Model [HMM] *Vector Quantization *Gaussian Model *Dynamic Time Wrapping *pass phrase *نامی که جیالانگ هی برای کتابخانهاش انتخاب کرده و ما از این پس با این نام از آن یاد خواهیم کرد. *البته تلاش شد که با تماس با به وجود آوردندهی این کتابخانه از خود وی برای رفع این مشکل کمک گرفته شود که متأسفانه پاسخی از ایشان دریافت نشد. |
زمان محلي شما با تنظيم GMT +3.5 هم اکنون ۰۹:۲۰ بعد از ظهر ميباشد. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.1.0 ©2007, Crawlability, Inc.