جستجوی کلمات کلیدی در گفتار

تغییرات پروژه از تاریخ 1393/09/15 تا تاریخ 1393/10/13
یکی از کاربردهای مهم پردازش گفتار، یافتن کلمات کلیدی در گفتار است. به عنوان مثال یک پایگاه داده از صداهای ضبط شده را در نظر بگیرید. فرض کنید بخواهیم در این گفتارها به دنبال مجموعه ای از واژه های کلیدی بگردیم. در این صورت باید از الگوریتم های واژه‌یابی گفتار استفاده کنید. یکی از مقال هایی که این الگوریتم می تواند در آن جا مورد استفاده قرار گیرد، گفتارهای ضبط شده در یک کلاس درس است. مثلا فرض کنید که *گفتارهای درس مدارهای الکتریکی* ضبط شده باشد و ما می خواهیم بدانیم در کدامیک از قسمت های این مجموعه در مورد کلمه کلیدی *دیود* صحبت شده است.

# مقدمه
برای دهه ها تشخیص خودکار کلمات کلیدی[^ASR: Automatic Speech Recognition] به عنوان یکی از موضوعات تحقیقات علمی مطرح شده و به دلیل افزایش سرعت محاسبه و دقت سیستمهای دیجیتال، پیاده سازی این سیستم ها رشد چشمگیری داشته است[3]. حوزه ی پردازش گفتار گستره ی وسیعی از مسائلی که مرتبط با پردازش و شناسایی گفتار است را در بر می گیرد که در هر مورد صورت مسئله با توجه به فرضیاتی که برای سادگی حل اعمال می شوند متفاوت است. برای نمونه در برخی مسائل فرض بر این است که ما در یک پایگاه داده ی از پیش مشخص به دنبال یافتن برخی از کلمات کلیدی هستیم در حالی که در دسته ای دیگر از مسائل می بایست تشخیص کلمات کلیدی[^KWS: Keyword Spotting] بر روی یک جریان داده انجام گردد[^CSR: Continous Speech Recognition]. با همه این تفاوت ها هدف مشترک هر دو مسئله را می توان به شرح زیر تعریف نمود:
ساخت یک سیستم تشخیص کلمه، که قادر است تعداد محدودی از کلمات یا عبارات کلیدی از پیش تعیین شده را در گفتار گوینده تشخیص دهد در حالیکه از بقیه ی گفتار گوینده چشم پوشی می کند.
تعریف فوق هدف مشترک این دو دسته مسئله را بیان می کند در حالی که این دو دسته مسئله کاربردهای متفاوتی دارند. برای نمونه اگر هدف تشخیص کلمات کلیدی در یک جریان داده باشد و عمل تشخیص کلمات کلیدی به طور پیوسته انجام گردد کاربردهای زیادی(از جمله استفاده این سیستم ها در خانه ها هوشمند) را می توان برای آن متصور بود. اگر پایگاه داده از قبل مشخص باشد نیز کاربرد هایی چون جستجوی کلمات کلیدی در پایگاههای داده ی بزرگ را می توان برای آن برشمرد.
برای حل این دو دسته مسئله، دو نوع فیلتر مختلف طراحی و استفاده می گردد:
1. فیلتر واجی: که وظیفه ی آن تشخیص واج های مختلفی است که گوینده ادا می کند. در این نوع فیلتر هر واج مختلف فیلتر مخصوص به خود را دارد که در صورت تشخیص واج مورد نظر خروجی مطلوب را تولید می کند.
2. فیلتر بخشی: وظیفه ی این نوع فیلتر تشخیص بخش های کلمات کلیدی است و مانند فوق هر بخش دارای فیلترهای متعددی است که هر کدام وقوع بخش های مورد نظر خود را تشخیص می دهد.
در پیاده سازی چون بخش ها از نظر مدت صدا بزرگتر از واج ها هستند؛ فیلترهای واجی عملکرد بهتری دارند[4].

# کارهای مرتبط
راه حل هایی که برای تشخیص کلمات کلیدی به طور پیوسته ارائه شده به شرح زیر است:
1. تطبیق الگو[^Template Matching]. در این روش با استفاده از تکنیک های برنامه نویسی پویا؛ در هر لحظه از زمان یک فاصله نسبت به الگوی صدای هر کلمه ی کلیدی محاسبه می شود و بر اساس این فاصله ی محاسبه شده: وقوع یا عدم وقوع کلمه ی کلیدی تعیین می گردد[10].
2. مدل مخفی مارکوف[^Hidden Markov Model]. در این روش شباهت صحبت گوینده با کلمات کلیدی یا زیربخش های کلمات کلیدی طبق مدل مخفی مارکوف آن کلمه یا زیربخش سنجیده می شود. در گام بعدی؛ امتیاز شباهت بدست آمده توسط رویه ی امتیاز دهی مدل مارکوف  با یک حد آستانه مقایسه می گردد و با توجه به نتیجه مقایسه روخداد یا عدم رخداد کلمه ی کلیدی تشخیص داده می شود[5,8,9].
3. شبکه عصبی[^Neural Network]. اخیرا نوع خاصی از شبکه های عصبی در حل مسئله ی تشخیص کلمات کلیدی به کار گرفته شده اند.  شبکه های عصبی با تاخیر زمانی[^TDNN: Time Delay Neural Network] نوعی شبکه عصبی هستند که قادر به تشخیص رویدادن کلمات کلیدی هستند[6]. همچنین از شبکه های عصبی چند لایه نیز برای حل این مسئله استفاده گردیده[2].
4. روش های ترکیبی: برای نمونه مدلی مرکب ارائه گردیده که مرکب از مدل مخفی مارکوف و یک شبکه ی عصبی مصنوعی با توابع شعاعی[^Radial Basis Function] است و قادر است با عملکرد خوبی کلمات کلیدی مورد نظر را  تشخیص دهد. در این روش ها سعی بر آن است که از مزایای هر کدام از روش ها استفاده گردد تا عملکرد کلی سیستم بهتر از به کارگیری جداگانه هر یک از این روش ها باشد.
از راه های ارائه شده برای حل مسئله ی تشخیص کلمات کلیدی در گفتار، مدل مخفی مارکوف بیشتر توسعه پیدا کرده و در اغلب سیستم های پردازش پیوسته ی گفتار بکار گرفته می شود. برای نمونه مخفی مارکوف در سیستمی که علاوه بر تشخیص کلمات کلیدی، توانایی تشخیص کلمات غیر کلیدی را نیز دارد به کار گرفته می شود[7]. این کار به کمک مدل کردن واج های مختلف با فیلترهایی که از مدل مخفی مارکوف بهره می برند قابل پیاده سازی می باشد.
واج ها کوچکترین جزء زبان هستند که با کنار هم قرار گرفتن آنها کلمات تشکیل می شوند و تغییر دادن آنها موجب تغییر معنی کلمات هستند. نکته ی مورد توجه در مورد واج ها این است که هر زبان بسته به ذات خود و چگونگی تحلیل آن، تعداد واج های متفاوتی دارد. برای نمونه زبان فارسی بسته به چگونگی تحلیل آن دارای 29 تا 45 واج مختلف است در حالیکه زبان انگلیسی 31 تا 64 واج دارد. هر چندکه فیلتر های واجی بهتر از فیلتر های بخشی عمل می کنند، اما باید آنها را به طور جداگانه و برای هر زبان به صورت منحصر به فرد تعریف کرد[4].

# آزمایش‌ها
برای تشخیص گفتار از کتابخانه ی کلدی که در انتها پیوند آن قرار داده شده استفاده کردیم. این ابزار شامل پیاده سازی کتابخانه های  بسیاری می باشد که برای موضوع شناسایی گفتار کاربرد دارند. کلدی جهت پیاده سازی و ذخیره ی مدلهای مخفی مارکوف دست راستی خود از کتابخانه ی [open FST](http://www.openfst.org) استفاده می کند. یکی از فایلهای موجود در پوشه ی مثال (topo.proto) نسبت اولیه ی ماندن روی هر حالت یا گذر به حالت بعدی را تعیین می کند. سپس به ازای هر کلمه ی کلیدی،  مدلهای اولیه را توسط الگوریتم EM  آموزش می دهیم تا مدل مخفی مارکوف برای هر کلمه ی کلیدی را بدست آوریم. همچنین این ابزار برای حالت سکوت نیز یک مدل مارکوف آموزش می دهد که وظیفه ی اصلی آن شناسایی حالت سکوت قبل از ادای هر کلمه می باشد. از جمله فایلهای مورد نیاز دیگر برای این کتابخانه فایلهای متنی است که می بایست در اختیار آن قراردهیم. این فایلها می بایست کلمات کلیدی مورد استفاده و همچنین واج های به کار رفته برای تلفظ هر کلمه را مشخص کند. این فایلها به ترتیب با نام words.txt و lexicon.txt معرفی شده اند.

داده های مورد استفاده برای آموزش و تست در موسسه تگزاس اینسترومنت[^Texas Instrument] ضبط شده اند و فرکانس نمونه برداری آن ۲۰ کیلوهرتز می باشد. این مجموعه ی داده شامل تعداد زیادی فایل صوتی است که در هر فایل یک خواننده مبادرت به خواندن یک یا چند عدد پشت سر هم می کند. همچنین از هر گوینده درخواست شده تا اعداد تک رقمی را دوبار تلفظ نماید که با پسوند A, B در انتهای آن مشخص شده است. در زیر نام چند فایل در مجموعه ی داده را مشاهده می کنید:
51o7oo4A.WAV
1A.WAV
1B.WAV
خوانندگان این اعداد شامل افراد بالغ و نابالغ می باشند ولی برای مثال اجرا شده فقط داده های گویندگان بالغ مورد استفاده قرار می گیرد. نکته ی مورد توجه در مورد فایلهای مجموعه داده این است که علی رغم اینکه فایلها با پسوند .wav نمایش داده می شوند اما  در اصل این داده ها با فرمت NIST  ذخیره می شوند. فرمت NIST بدین صورت می باشد که یک هدر متنی کوتاه شرایط نمونه برداری و خواندن فایل را به طور کامل نشان می دهد و در ادامه ی آن نمونه های فایل می آیند. در زیر فرمت هدر فایلهایی که با فرمت NIST ذخیره می شوند  را مشاهده می کنید:
NIST_1A
   1024
database_id -s8 TIDIGITS
database_version -s3 1.0
utterance_id -s6 utteranceName_fileName
channel_count -i 1
sample_count -i 15872
sample_rate -i 20000
sample_min -i -1560
sample_max -i 2281
sample_n_bytes -i 2
sample_byte_format -s2 10
sample_sig_bits -i 16
speaker_id -s2 utteranceName
prompt_code -s1 1
utterance_production -s1 a
recording_date -s11 28-JUL-1982
sample_coding -s26 pcm,embedded-shorten-v2.00
sample_checksum -i 5318
end_head
نکته ی قابل ذکر دیگر در مورد داده های مورد استفاده در این آزمایش  این است که مجموعه داده های تگزاس اینسترومنت رایگان نیست و از آزمایشگاه دکتر اکبری جهت انجام این پروژه به امانت گرفته شده.(پروژه ی دیگری که داده های آن موجود باشد تشخیص کلمات بله و خیر به زبان هبری است که دقت آن ۱۰۰٪ می باشد و برای این درس کاربردی ندارد)
در مرحله ی پیش از آموزش می بایست ویژگی های هر کلمه را استخراج کنیم. چون در پردازش صوت قسمت مهمی از اطلاعات در حوزه ی فرکانس قابل مشاهده است، در این فاز، عملیات استخراج ویژگی ها به کمک [^Mel-frequency cepstral coefficients]MFCC انجام می گیرد. الگوریتم محاسبه ی MFCC برای هر کلمه به ترتیب زیر است:
1. محاسبه ی تبدیل فوریه ی سیگنال انتخاب شده: در اینجا سیگنالهایی به طول ۲۵ میلی ثانیه از سیگنال اصلی (هر کلمه) را می بریم و این پنجره را با گام ۱۰ میلی ثانیه به جلو حرکت می دهیم. سپس به ازای هر پنجره از سیگنال مورد نظر تبدیل فوریه می گیریم.
2. نگاشت کردن انرژی سیگنال بدست آمده از محور فرکانس خطی به محور فرکانس MEL
3. لگاریتم گرفتن از هر باند فرکانسی در محور فرکانسی MEL
4. گرفتن تبدیل کسینوسی گسسته: این کار نمودار cepstrum سیگنال را می دهد که حاوی اطلاعات فرکانسی قطعه سیگنال بریده شده است.
پس از انجام مرحله ی استخراج ویژگی ها، ۱۳ ضریب بزرگ  بدست آمده از تبدیل کسینوسی گسسته،‌ ویژگی های آن بخش را معرفی می کند.
برای شروع آموزش اسکریپت run.sh/. را اجرا می کنیم. این اسکریپت خود تعداد زیادی اسکریپت کوچکتر را فراخوانی می کند؛ که ابتدا  پوشه های مربوط به داده های تست و آموزش را چک می کند و لیستی از فایل های موجود در آن بر می دارد. تعداد فایلهای مورد استفاده ی آموزش 8623  و تعداد فایلهای تست 8700 عدد می باشد. همچنین در این گام لیستهای مورد نیاز دیگری مانند اینکه هر گوینده چه کلماتی را می خواند و بالعکس و یا اینکه کلمات تلفظ شده در هر فایل به ترتیب کدام کلمه ی کلیدی می باشد نیز از روی هدر فایلهای تست و آموزش استخراج می شود و در فایلهای متنی جداگانه ای ذخیره می گردد. این اسکریپت سپس به بررسی وجود فایلهای مورد نیاز دیکشنری و کلمات کلیدی می پردازد که می بایست به طور دستی تهیه شوند و در اختیار اسکریپت قرار گیرند. در مرحله ی بعد عمل استخراج ویژگی ها برای همه ی فایل های تست و آموزش انجام می گردد و نتایج آن برای استفاده در گام های بعدی در پوشه mfcc ذخیره می گردد.
در گام بعد یک زیر مجموعه ی ۱۰۰۰ تایی از فایلهای آموزش جهت آموزش دادن یک مدل مارکوف برای هر کلمه کلیدی انتخاب می شود و با کمک آن یک مدل مارکوفی تک واجی آموزش می بیند. مجددا همین اعمال برای آموزش یک مدل مارکوفی سه واجی به ازای کلمات کلیدی انجام می شود.
پس از تکمیل مرحله ی آموزش مدلها و در گام نهایی برای بدست آوردن دقت مدلهای آموزش دیده، مدلهای بدست آمده با داده های تست مورد آزمایش قرار می گیرند. مرحله ی آزمایش توسط اسکریپت decode اانجام می شود و نتایج در پوشه ی log قرار می گیرند. در این پوشه فایلهایی وجود دارند که در هر یک لیبل  بخشی از داده ی تست با لیبلی که رده بند برای آن در تعیین کرده در آن آورده شده است. مثال زیر بخشی از فایل decode.2.log را نشان می دهد:
EJ_4152A 4 o 1 5 2 o  
LOG (gmm-latgen-faster:DecodeUtteranceLatticeFaster():lattice-faster-decoder.cc:1175) Log-like per frame for utterance EJ_4152A is -7.64972 over 198 frames. 
EJ_422A 4 2 2  
LOG (gmm-latgen-faster:DecodeUtteranceLatticeFaster():lattice-faster-decoder.cc:1175) Log-like per frame for utterance EJ_422A is -7.71847 over 166 frames. 
EJ_4499A 4 4 9 9  
LOG (gmm-latgen-faster:DecodeUtteranceLatticeFaster():lattice-faster-decoder.cc:1175) Log-like per frame for utterance EJ_4499A is -8.03384 over 204 frames.

به عنوان نمونه گوینده ای که نام آن به علامت اختصار EJ ثبت شده در فایل 4152A.WAV به ترتیب اعداد 4152 را قراءت کرده که رده بند آموزش دیده ی مورد نظر  پس از مطالعه ی این فایل تشخیص خود را اینگونه اعلام کرده که گوینده به ترتیب اعداد 401520 را قراءت نموده. روشن است که مدل آموزش دیده برای کلمه ی o (صفر انگلیسی) به غلط فضای سکوت بین کلمات را صفر تشخیص داده و موجب پایین آمدن دقت شده است. در پایان برای تعیین دقت کلی رده بند می توان با اجرای اسکریپت check_result.sh/. نتایج را مشاهده نمود. این اسکریپت ها فایلهای WER را می خوانند و بهترین عدد مربوط به دقت رده بند  را  به عنوان دقت آن نمایش می دهند.



# کارهای آینده

# مراجع
[1] Mandal, Anupam, KR Prasanna Kumar, and Pabitra Mitra. "Recent developments in spoken term detection: a survey." International Journal of Speech Technology 17.2 (2014): 183-198.
[2] Chen, Guoguo, Carolina Parada, and Georg Heigold. "SMALL-FOOTPRINT KEYWORD SPOTTING USING DEEP NEURAL NETWORKS."
[3] Yong Ling. "keyword spotting in continous speech utterance." school of computer science, McGill university, 1999
[4] Javier Tejedor, Dong Wang, Joe Frankel, Simon King, Jose´ Cola´s. "A comparison of grapheme and phoneme-based units
for Spanish spoken term detection." speech communication, 2008
[5] David Grangier, Joseph Keshet, Samy Bengio. "Discriminative Keyword Spotting." speech communication, 2009
[6] Richard C. Rose. "Word Spotting from continuous speech utterance." 1996
[7] Richard C. Rose, Douglas B. Paul. "A hidden markov model based keyword recognition system." bell laboratories  1990
[8] T. Kawabata, T. Hanazawa, and K. Shikano. Word spotting method based on hmm phoneme recognition. Journal of the Acoustical Society of America (JASA), 1(84), 1988.
[9] L. Rabiner and B.H. Juang. "Fundamentals of Speech Recognition." Prentice-Hall, Upper Saddle River, NJ, USA, 1993
[10] J. S. Bridle. "An efficient elastic-template method for detecting given words in running speech. In Proceedings of the British Acoustic Society Meeting." British Acoustic Society, 1973.


# پیوندهای مفید
+ [کتابخانه پردازش گفتار](http://kaldi.sourceforge.net)