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

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

# مقدمه
برای دهه ها تشخیص خودکار کلمات کلیدی[^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 را می خوانند و بهترین عدد مربوط به دقت رده بند  را  به عنوان دقت آن نمایش می دهند.

##بهبود نتایج
اسکریپت های اولیه ای که از روی فایل های log دقت رده بند آموزش دیده را محاسبه می کردند اطلاعات دقیقی از محل وقوع خطا را گزارش نمی دادند و به محاسبه ی یک عدد خام به عنوان دقت کلی رده بند اکتفا می کردند. برای اینکه بتوان نتایج را به طور موثرتری بهبود بخشید ابتدا لازم بود که خطای هر کدام از کلاس های اعداد را با یک برنامه به طوردقیق تری پیدا کنیم. به همین منظور برنامه پایتون ایجاد کردم که خطای هر کلاس را به طور دقیق گزارش دهد. خطای تست رده بند وقتی با مجموعه کامل یادگیری آموزش دیده بدین شرح است (خروجی برنامه wer.py):
number of files: 8700
number of samples: 28583
each digit frequency is as follow:
1's quantity: 2601
2's quantity: 2625
3's quantity: 2607
4's quantity: 2599
5's quantity: 2599
6's quantity: 2610
7's quantity: 2600
8's quantity: 2614
9's quantity: 2562
O's quantity: 2557
Z's quantity: 2609
each error digit frequency is as follow:
1's quantity: 12
2's quantity: 27
3's quantity: 9
4's quantity: 6
5's quantity: 6
6's quantity: 8
7's quantity: 6
8's quantity: 62
9's quantity: 18
O's quantity: 2381
Z's quantity: 2275
each fn error digit frequency is as follow:
1's quantity: 1
2's quantity: 3
3's quantity: 8
4's quantity: 2
5's quantity: 0
6's quantity: 0
7's quantity: 4
8's quantity: 33
9's quantity: 6
O's quantity: 2295
Z's quantity: 1
each fp error digit frequency is as follow:
1's quantity: 11
2's quantity: 24
3's quantity: 1
4's quantity: 4
5's quantity: 6
6's quantity: 8
7's quantity: 2
8's quantity: 29
9's quantity: 12
O's quantity: 86
Z's quantity: 2274
همانطور که در نتایج آمده خطای اصلی رده بند در تشخیص کلاس Zero, O رخ داده و برای بقیه ی ارقام، رده بند با دقت بسیار بالایی عدد را به درستی تشخیص می دهد. خطای false negative برای کلاس Zero برابر یک است که نشان می دهد: هر جا رده بند تشخیص داده کلاس Z  است درست تشخیص داده. این خطا برای کلاس O  رقم قابل ملاحظه ای است و برابر ۲۲۹۵ مورد می باشد. این عدد بیان می کند: در بسیاری از موارد رده بند نتوانسته کلاس O را درست تشخیص دهد و آنرا تشخیص نداده یا به اشتباه به عنوان کلاس دیگری برچسب زده. در ادامه وقتی بر چسب نمونه های اشتباه شده را بررسی می کنیم می بینیم نمونه های کلاس O به عنوان کلاس Z برچسب گذاری شده اند (برای مثال SR_2OA 2 z). پس همانطور که انتظار می رود خطای false positive برای کلاس Z نیز می بایستی عدد بالایی باشد که مطابق خروجی برنامه پایتون ای عدد برابر ۲۲۷۴ نمونه است. اما مشاهده ی نمونه های false positive کلاس O (مانند EJ_4152A 4 o 1 5 2 o)مشخص کرد که این خطا مستقل از دو خطای بحث شده ی قبلی می باشد. این نوع از خطا دقیقا بلافاصله بعد از تشخیص دو عدد ۲و ۴ رخ می دهند. به عبارت بهتر رده بند بعد از دریافت عدد ۲ یا ۴ به احتمال بالایی تلفظ 'o' انتهای این دو کلمه را  به خطا  کلاس O  برچسب می زند.
ساده ترین راه برای کاهش خطای false positive کلاس O این است که به علت خطای زیاد رده بند هرگاه رده بند بعد از کلاس ۲ یا ۴ کلاس O را تشخیص داد آنرا حذف کنیم (تشخیص کلاس O را اعلام نکنیم). این کار موجب می شود تا خطای false negative رده بند به مقدار کمی بالا رود زیرا حالاتی که گوینده اعداد 2O, 4O را تلفظ کرده و رده بند برچسب صحیحی به آنها زده نیز به خطا برچسب 2, 4 بگیرند، اما به کار گیری نظریه بیض ساده متوجه می شویم در صورتی که اعداد گفته شده به طور تصادفی انتخاب شوند (که در مورد مجموعه تست به کار رفته و در کاربرد های عادی نیز این شرط با اطمینان خوبی برقرار است) این عمل موجب بالا رفتن دقت کلی رده بند می شود. برای درک بهتر موضوع توجه کنید که احتمال وقوع کلاس O بعد از وقوع کلاس ۲و ۴ برابر ۲/۱۱ می باشد در حالیکه در هنگام برچسب زدن احتمال برچسب خوردن کلاس O بعد از کلاس ۲و ۴ برابر(۶۶+۸۶)/(۶۶) می باشد(اعداد طبق بررسی فایلهای تست بدست آمده اند). پس مطابق بررسی نمونه های تست متوجه می شویم با حذف برچسب O بعد از برچسب های کلاس ۲و ۴ دقت کلی رده بند بهبود می یابد زیرا ۸۶ نمونه از خطای false positive کم شده و فقط ۶۶ مورد به خطای false negative اضافه می شود.
برای گام دوم بهبود دادن نتایج سعی کردم تا با دستکاری پارامترهای آموزش رده بند دقت آنرا بررسی کنم. اولین و ساده ترین ایده ممکن بررسی و اطمینان از overtrain نشدن رده بند بود. به همین منظور در فایل مربوط به آموزش با نام train_mono.sh  پارامتر num_iters که تعداد تکرر آموزش مدل های مارکوف را تنظیم می کند را از ۴۰ به ۱۰ کاهش دادم. همچنین پارامتر max_iter_inc را نیز از ۳۰ به ۸ تغییر دادم. این کار موجب می شود تا از یادگیری کامل کلاس ها توسط رده بند جلوگیری به عمل بیاید. نتایج بدست آمده پس از اجرا الگوریتم یادگیری و رده بندی مجموعه تست توسط رده بند جالب بود. در نتایج بدست آمده (summaryـreduced_itteration) مشاهده شد که خطای همه کلاسها افزایش یافته اند در حالی که خطای false positive کلاس Z و false negative کلاس O هر کدام به تعداد ۱۴۱و ۱۲۱ نمونه کاهش یافت. به عبارت دیگر فرضیه ی overtrain شدن برای کلاس های Z, O درست بود. بنابر نتیجه ی آزمایش فوق با ترکیب رای رده بند اول و دوم می توان به دقت بالاتری هم برای کلاس اعداد ۱ تا ۹ و هم برای کلاس های O, Z رسید. فرآیند ترکیب نظر این دو رده بند به این صورت است که به طور پیش فرض هرگاه رده بند اول برچسب اعداد ۱ تا ۹ را ارائه داد نظر آنرا می پذیریم ولی وقتی رده بند اول رای به کلاس O یا Z داد آنگاه نظر رده بند دوم (که در رده بندی این دو کلاس دقیقتر از رده بند اول است) را بر می گزینیم.
ایده ی آخری که برای بهبود نتایج به نظرم رسید آموزش دادن دو رده بند با مجموعه تست صداهای مردان و زنان به صورت جداگانه بود. تا به حال ایده های مختلفی برای تشخیص جنسیت یک فرد از روی صدای او ارائه شده که پایه بسیاری از آنها  فرکانس پایه ی صدای آن شخص است[11]. همچنین دقت برخی از کارهای انجام شده نیز تا ۹۲ درصد می رسد[12]. فرضیه اولیه این آزمایش این بود که اگر رده بندی توسط داده های خانمها آموزش ببیند نسبت به رده بندی که با تمام مجموعه داده آموزش ببیند، دقت بالاتری روی داده های تست خانمها دارد؛ این فرضیه برای آقایان نیز در نظر گرفته شده. برای بررسی صحت فرضیه می بایست چهار آزمایش مختلف انجام دهیم. در دو آزمایش اول دقت دو رده بند که یکی با کل مجموعه آموزش آموزش دیده و دیگری با مجموعه آموزش آقایان آموزش دیده را آموزش داده و هر کدام مجموعه تست مربوط به آقایان را کلاس بندی کردند. در این آزمایش بجز کلاسهای O, Z, 8 دقت ما بقی کلاسها افزایش یافت و اگر به دلیل دقت بسیار پایین تشخیص کلاسهای Z, O آنها را مجزا در نظر بگیریم بهبود دقت رده بند امری مشهود است. در مورد خانمها نیز با در نظر نگرفتن کلاسهای O, Z دقت کلی رده بند افزایش یافته. بنابر این با کمک یک برنامه تشخیص جنسیت و برچسب زدن مورد موجود با کمک رده بندی که برای همان جنسیت آموزش دیده به دقت بالاتری نسبت به یک کلاسیفایر ساده که با کل مجموعه آموزش آموزش دیده است می رسیم.
در انتها  نتایج و فایلهای مورد استفاده در پروژه را می توانید از طریق [این پیوند](https://github.com/hajix/StaticalPatternRecognition) پیگیری نمایید.
در پوشه ی decodes فایلهای خروجی رده بندی شده را همراه با آمار خلاصه ی اشتباهات انجام شده در کلاس بندی ملاحظه می کنید. نام برخی از پوشه ها از دو بخش تشکیل شده که نام اول داده یادگیری و نام دوم داده مورد استفاده در تست را مشخص می کند. برای مثال در پوشه ی full-man خروجی دیکودر برای داده های تست مرد ها آورده شده است.


# کارهای آینده
حوزه ی تشخیص کلمات کلیدی هنوز جای زیادی برای پیشرفت دارد. برای مثال می توان به مقایسه ی استخراج ویژگی های مختلف و تست آنها روی همین کتابخانه پرداخت. همچنین در ادامه این تحقیق می توان به پیاده سازی سیستم تشخیص جنسیت با کمک صدا پرداخت و نتایج ایده ی آخر را به طور کامل تری مورد آزمایش قرار داد. همچنین استفاده از شبکه ی عصبی نیز می تواند به عنوان یک آزمایش مجزا در نظر گرفته شود و در مورد آن تحقیق گردد.

# مراجع
[1] Mandal, AnupaR 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.
[11] Kumar Rakesh, Subhangi Dutta and Kumara Shama. "GENDER RECOGNITION USING SPEECH PROCESSING 
TECHNIQUES IN LABVIEW", International Journal of Advances in Engineering & Technology, 2011
[12] Harb, Liming Chen, "Gender identification using a general audio classifier", Multimedia and Expo, 2003. 


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