یادگیری ماشین جذاب است! قسمت ششم : چگونه با یادگیری عمیق تشخیص گفتار بسازیم؟

تشخیص گفتار زندگی های ما را فراگرفته است. این تکنولوژی در داخل گوشی های ما، کنسول های بازی ما و ساعت های مچی هوشمند ما تعبیه شده است. تشخیص گفتار حتی خانه های ما را هم خودکار کرده است. فقط با ۵۰ دلار، شما می توانید یک Amazon Echo Dot  بگیرید؛ یک جعبه ی جادویی که به شما اجازه می دهد تا پیتزا سفارش دهید، گزارشی از آب و هوا بگیرید و حتی کیسه زباله خریداری کنید، فقط کافی است با صدای بلند با آن حرف بزنید:

مجموعه ی یادگیری ماشین جذاب است!

اکو دات الکسا آمازون تشخیص گفتار
الکسا، یه پیتزا سفارش بده!

دستگاه Echo Dot بسیار محبوب بوده است تا حدی که در تعطیلات پایان سالی که عرضه شد، آمازون نتوانست موجودی آن را تثبیت کند!

ولی تشخیص گفتار حدود ۱۰ سل است که وجود دارد، خب پس چرا الان در صدر بازار قرار گرفته است؟ دلیل آن این است که یادگیری عمیق نهایتا تشخیص گفتار را به حد کافی دقیق و صحیح ساخته است که خارج از محیط کنترل شده، کارآمد و مفید باشد.

اندرو انگ ( Andrew Ng ) از مدت ها پیش، پیش بینی کرده بود که دقت تشخیص گفتار از ۹۵% به ۹۹% می رسد و به یکی از راه های اولیه تبدیل خواهد شد که ما می توانیم با کامپیوتر ها تعامل داشته باشیم. مساله این است که این شکاف دقت ۴ درصدی، تفاوت بین “غیر قابل اعتماد و آزار دهنده” و “بسیار مفید” است. به لطف یادگیری عمیق، اکنون به اوج آن رسیده ایم.

بیایید یاد بگیریم که چگونه تشخیص گفتار را با یادگیری عمیق ، انجام دهیم!

یادگیری ماشین همیشه یک جعبه سیاه نیست

اگر شما بدانید که ترجمه ماشین عصبی، چگونه کار می کند، می توانید حدس بزنید که ما می توانیم به سادگی صداهای ضبط شده را در شبکه عصبی قرار دهیم و آن را آموزش دهیم تا متن را تولید  کند:

شبکه عصبی تبدیل گفتار به متن

این کار هدف والا و نهایی تشخیص گفتار با یادگیری عمیق است، ولی ما هنوز به آنجا نرسیده ایم ( حداقل در این زمان که این متن را می نویسیم به این توانایی نرسیده ایم – ولی من قول می دهم که طی سال های آینده خواهیم رسید).

مشکل بزرگ این است که سرعت در گفتار متفاوت است. یک فرد ممکن است به سرعت بگوید سلام و فرد دیگر ممکن است به آهستگی بگوید سلاااااممممممم! که یک فایل صوتی طولانی تر با جزئیات بیشتر تولید می کند.هر دوی فایل های صوتی باید دقیقا به عنوان نوشته ی یکسان باشند – سلام! تراز کردن فایل های صوتی با طول های متفاوت به متنی با طول ثابت، واقعا کار سختی است.

برای گذر از این مشکل، ما باید از یک سری ترفندهای خاص و پردازش بیشتر در کنار یک شبکه عصبی استفاده کنیم. بیایید ببینیم چگونه این کار انجام می شود.

تبدیل صدا ها به بیت ها

گام اول در تشخیص گفتار ، واضح است؛ ما نیاز داریم که امواج صوتی را به کامپیوتر وارد کنیم.

در قسمت سوم، ما یاد گرفته ایم که چگونه یک تصویر بگیریم و با آن مانند آرایشی از اعداد رفتار کنیم، به طوری که ما می توانیم آن را مستقیما در یک شبکه عصبی برای تشخیص تصویر، قرار دهیم:

یادگیری ماشین تبدیل عدد 8 به آرایه اعداد
تصاویر فقط آرایشی از اعداد هستند که شدت هر پیکسل را رمزنگاری می کنند.

ولی صدا به صورت امواج منتقل می شود. ما چگونه امواج صوتی را به اعداد تبدیل کنیم؟

موج صدا hello تشخیص گفتار
بیایید از این کلیپ صوتی من استفاده کنیم که گفته ام “Hello” :

امواج صوتی تک بعدی هستند. در هر لحظه از زمان، آن ها یک مقدار واحد بر اساس ارتفاع هر موج دارند. بیایید تا روی قسمت کوچکی از موج صوتی زوم کنیم و نگاهی بر آن بیاندازیم:

موج صدا

برای تبدیل این موج صوتی به اعداد، ما فقط ارتفاع موج در فاصله های برابر را ضبط می کنیم:

نمونه برداری موج صدا گفتار
نمونه گیری از یک موج صوتی

این کار نمونه گیری نامیده می شود. ما به اندازه ی هزاران بار در ثانیه در حال خواندن اطلاعات و ضبط یک عدد که ارتفاع  موج صوتی را در آن نقطه از زمان را نمایش می دهد، هستیم. در واقع تمام فایل های فشرده نشده ی .wav به این صورت هستند.

فایل صوتی  با کیفیت CD در واقع khz۴۴.۱ ) ۴۴۱۰۰  بار بر ثانیه ) نمونه گیری شده است. ولی برای تشخیص گفتار، یک سرعت نمونه گیری به اندازه khz۱۶ ) ۱۶۰۰۰نمونه در ثانیه) برای پوشش محدوده فرکانس گفتار بشر کافی است.

بیایید تا فایل صوتی “Hello” را به اندازه ی ۱۶۰۰۰ بار در ثانیه نمونه گیری کنیم. اینجا ۱۰۰ نمونه ی اول آن را می‌بینید:

آرایه عددی موج صدا گفتار صد عدد اول
هر عدد نشان دهنده ی دامنه موج صوتی در یکی از صد و شانزده هزار فواصل یک ثانیه می باشد.

یک توضیح انحرافی سریع درمورد نمونه گیری دیجیتالی

شاید شما فکر کنید که نمونه گیری فقط ایجاد یک تقریب سخت از موج صوتی اصلی است زیرا فقط قرائت های گاه به گاه دارد. شکاف هایی در نمونه گیری های ما وجود دارند، خب ما بخشی از داده را از دست می دهیم، درست است؟

نمونه گیری از موج صوتی گفتار
آیا نمونه های دیجیتالی می توانند به درستی امواج صوتی آنالوگ را دوباره به وجود آورند؟ شکاف ها چه می شوند؟

ولی با تشکر از قضیه نایکویست ما می دانیم که می توان از ریاضیات برای ساخت کامل و دوباره ی موج صوتی اصلی از نمونه های فاصله دار، استفاده کنیم؛ تا زمانیکه ما حداقل دو برابر سریع تر از بلندترین فرکانس که می خواهیم ضبط کنیم، نمونه گیری کنیم.

من به این نکته اشاره کردم زیرا تقریبا همه این اشتباه را می کند و فکر می کند که استفاده از بالاترین سرعت های نمونه گیری، همیشه به کیفیت بهتری می انجامد. در حالی که اینگونه نیست.

پیش پردازش نمونه داده صوتی

ما الان آرایه ای از اعداد داریم که هر عدد نشان دهنده ی دامنه موج صوتی در یکی صد شانزده هزار فواصل ثانیه است.

ما می توانیم این اعداد را مستقیما وارد شبکه عصبی کنیم. اما تلاش برای تشخیص الگوهای گفتاری با پردازش این نمونه ها به صورت مستقیم، کار دشواری است. در عوض، ما می توانیم با انجام بعضی پیش پردازش ها روی داده صوتی، این مساله را آسان تر کنیم.

بیایید شروع کنیم به گروه بندی کردن نمونه های صوتی مان به تکه هایی با طول ۲۰ میلی ثانیه. اینجا ۲۰ میلی ثانیه ی اول فایل صوتی را می‌بینید ( ۳۲۰ نمونه اول ما ) :

آرایه عددی موج صدا گفتار 320 عدد اول

رسم کردن این اعداد به صورت یک نمودار خطی ساده به ما یک تقریب گسسته از موج صوتی اصلی برای بازه زمانی ۲۰ میلی ثانیه می دهد:

نمودار موج صوتی نمونه برداری شده

این نگارش تنها ۵۰/۱م از طول یک ثانیه است. ولی همین فایل ضبط شده کوچک هم یک مخلوط پیچیده از فرکانس های مختلف از یک صدا است. مقداری صداهای کم، مقداری صداهای متوسط و حتی مقداری صداهای بلند و رسا در آن پخش شده اند. ولی با همه این ها، این فرکانس های مختلف با هم ترکیب شده اند تا صدای پیچیده ی گفتار انسان را ایجاد کنند.

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

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

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

نتیجه نهایی امتیازی است که نشان می دهد هر بازه فرکانس چقدر اهمیت دارد، از ارتفاع کم ( مانند نوت های بم ) تا ارتفاع زیاد. هر عدد زیر نشان دهنده این است که چه مقدار انرژی در هر گروه ۵۰ هرتزی از کلیپ صوتی ۲۰ میلی ثانیه ای ما وجود دارد:

آرایه عددی موج صدا گفتار تبدیل فوریه
هر عدد در لیست نشان می دهد که چه مقدار انرژی در آن گروه فرکانسی ۵۰ هرتزی وجود دارد.

ولی اگر شما داده ها را به صورت این چارت رسم کنید، بسیار واضح تر مشاهده خواهید کرد:

فرکانس موج صدا نمونه برداری شده
شما می توانید ببینید که قطعه صوتی ۲۰ میلی ثانیه ای ما مقدار زیادی انرژی فرکانس پایین دارد و در فرکانس های بالاتر انرژی چندانی ندارد. صدای مردانه معمولا به این صورت می باشد.

اگر شما این کار را هر قطعه صوتی ۲۰ میلی ثانیه تکرار کنید، ما با یک طیف نگار مواجه خواهیم شد ( هر ستون از چپ به راست، یک قطعه ۲۰ میلی ثانیه ای است ).

طیف نگار کلیپ صوتی گفتار hello
طیف نگار کامل از کلیپ صوتی “Hello”

طیف نگار ها عالی هستند زیرا شما معمولا می توانید نوت های مربوط به موسیقی و دیگر الگوهای گام صدا را در داده صوتی ببینید. یک شبکه عصبی می تواند الگوها را در این حالت از داده ها، راحت تر از امواج صوتی خام پیدا کند. خب این نمایش داده هایی است که ما به شبکه عصبی خود می دهیم.

تشخیص حروف از صداهای کوتاه

حالا که فایل صوتی را به شکلی که راحت بتوانیم پردازش کنیم، داریم، ما آن را در یک شبکه عصبی عمیق قرار خواهیم داد. ورودی شبکه عصبی همان قطعه های صوتی ۲۰ میلی ثانیه ای خواهد بود. برای هر قطعه ی کوچک صوتی، شبکه تلاش خواهد کرد تا حروفی که با صدای در حال پخش مطابقت دارد را متوجه شود.

شبکه عصبی بازگشتی برای تشخیص گفتار از موج صدا

ما از یک شبکه عصبی بازگشتی استفاده خواهیم کرد. شبکه ی عصبی بازگشتی یک شبکه عصبی است که حافظه ای دارد که پیش بینی های آینده را تحت تاثیر قرار می دهد. دلیل استفاده از شبکه های عصبی بازگشتی این است که هر حرفی که شبکه پیش بینی می کند، باید احتمال حرف بعدی شبکه می خواهد پیش بینی می کند را تحت تاثیر قرار دهد. برای مثال، اگر ما  HELرا گفته باشیم، احتمالش زیاد است که ماLO  را برای تمام کردن کلمه Hello بگوییم. احتمالش خیلی کم است که ما چیز تلفظ نشدنی مانند XYZ را بگوییم. خب پس داشتن حافظه ای از پیش بینی های قبلی به شبکه عصبی کمک می کند تا پیش بینی های دقیق تری را برای ادامه داشته باشد.

بعد از اینکه ما همه ی کلیپ صوتی خود را در شبکه عصبی وارد کردیم (هر تکه در یک مرتبه)، با نقشه ای از هر قطعه ی صوتی، از حروفی که در طول قطعه با بیشترین احتمال گفته شده اند، مواجه خواهیم شد. شما اینجا می بینید که آن نقشه در هنگام گفتن “Hello” برای من به چه شکل است.

نقشه شبکه عصبی از موج صوتی گفتار

شبکه عصبی ما حدس می زند چیزی که من احتمالا گفته ام، HHHEE-LL-LLLOOO باشد. ولی شبکه عصبی این را هم احتمال می دهد چیزی که گفته ام ممکن است HHHUU-LL-LLLOOO یا حتی AAAUU-LL-LLLOOO باشد.

ما مراحلی را در پیش رو داریم که باید برای مرتب کردن این خروجی، دنبال کنیم. در ابتدا ما هر حرف تکراری را با یک حرف تک جایگذاری خواهیم کرد:

  • HHHEE-LL-LLLOOO می شود HE_L_LO
  • HHHUU-LL-LLLOOO می شود HU_L_LO
  • AAAUU-LL-LLLOOOO می شود AU-L-LO

سپس ما هر خط فاصله را پاک می کنیم

  • HE-L-LO می شود HELLO
  • HU-L-LO می شودHULLO
  • AU-L-LO می شود AULLO

حالا ما هستیم و سه رونوشت ممکن؛ “Hello” ، Hullo”” و Aullo”” . اگر شما با صدای بلند بخوانید، همه ی آن ها صدای شبیه به Hello خواهند داشت. چون شبکه ی عصبی ما هر حرف در یک مرتبه پیش بینی می کند، شبکه عصبی این رونویسی های کاملا شبیه به هم را انجام داده است. برای مثال اگر شما بگویید “He would not go” شبکه یک رونویس ممکن مانند “He wud net go” به شما می دهد.

راه حل این است که شما این تلفظ هایی که بر پایه پیش بینی ها هستند را با امتیازهای احتمال که براساس پایگاه داده عظیم از متن های نوشته شده ( مانند کتاب ها، متن های خبری وغیره) ترکیب کنید. شما رونویس هایی که کمترین احتمال را برای واقعی بودن دارند، حذف می کنید و رونویس هایی که به نظر می رسد واقعی تر باشند را نگه می دارید.

از رونویس های ممکنی که ما داریم، یعنی”Hello”  ، “Hullo” و “Aullo”  مشخصا “Hello” در پایگاه داده متن بیشتر ظاهر خواهد شد (همچنین در داده آموزشی صوتی ما) و این احتمالا درست است. خب ما  “Hello”را به عنوان رونویس نهایی به جای بقیه، برمی داریم. انجام شد!

یک لحظه صبر کنید!

شاید به این فکر کنید که اگر کسی بگوید Hullo چه؟ این یک کلمه درست است. در این صورت شاید “Hello” رونویس اشتباه است.

گفتار جمله بریتیش
در بعضی لهجه ها ممکن است بگویند : “Hullo! Who dis?”

البته این ممکن است که بعضی ها به جای “Hello” بگویند “Hullo” ولی  یک سیستم تشخیص گفتار مانند این (که با انگلیسی آمریکایی آموزش دیده است) اساسا هیچ وقت Hullo را به عنوان یک رونویس تولید نمی کند. گفتن آن توسط کاربر در مقایسه با “Hello” یک چیز غیرممکن است، پس شبکه فکر کند شما “Hello” می گویید، مهم نیست که چقدر به صدای U تاکید می کنید.

امتحان کنید! اگر تنظیمات گوشی شما روی انگلیسی آمریکایی است، سعی کنید تا دستیار دیجیتال گوشی خود را روشن کنید تا کلمه ی “Hullo” را متوجه شود. شما نمی توانید! سیستم تشخیص گفتار مانع خواهد کرد! سیستم همیشه آن را به عنوان “Hello” متوجه می شود.

متوجه نشدن “Hullo” یک رفتار منطقی است، ولی بعضی اوقات وقتی که گوشی شما نتواند چیزهای صحیحی که شما می گویید را متوجه شود، برای شما آزار دهنده خواهد بود. به همین خاطر است که مدل های تشخیص گفتار همیشه توسط داده های بیشتری آموزش داده می شوند تا بتوانند این موارد حاشیه ای را حل کنند.

آیا من می توانم سیستم تشخیص گفتار خود را بسازم؟

یکی از بهترین چیزهایی که درمورد یادگیری ماشین وجود دارد، این است که بعضی اوقات چقدر ساده به نظر می رسد. شما تعداد زیادی داده می گیرید، وارد یک الگوریتم یادگیری ماشین می کنید و سپس به طور جادویی شما یک سیستم هوش مصنوعی در سطح جهانی دارید که روی کارت گرافیک لپ تاب خود اجرا می شود… درست است؟

این امر در بعضی موارد صحیح است ولی نه برای گفتار. تشخیص گفتار یک مساله ی دشوار است. شما باید به چالش های نامحدودی غلبه کنید: میکروفن های بی کیفیت، صدای زمینه، پیچیدن صدا و پژواک آن، لهجه های مختلف و چیزهای دیگر. لازم است که همه ی این مشکلات در داده ی آموزشی شما وجود داشته باشند تا مطمئن شویم که شبکه عصبی می تواند با آن ها درست برخورد کند.

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

برای ساخت یک سیستم تشخیص صدا که در سطح Siri یا Google Now یا Alexa اجرا شود، شما به مقدار زیادی داده آموزشی نیاز خواهید داشت؛ خیلی بیشتر از زمانی که شما از هزاران نفر از مردم بخواهید تا آن را برای شما ضبط کنند. و از آنجایی که کاربران آستانه تحمل کمی برای استفاده از سیستم های تشخیص صدا بی کیفیت دارند، شما نمی توانید روی این مسئله بی توجهی کنید. هیچ کس سیستم تشخیص صدایی که فقط ۸۰% مواقع کار می کند را نمی خواهد.

برای شرکتی مثل گوگل یا آمازون، صدها هزار ساعت از فایل های صوتی ضبط شده در شرایط زندگی واقعی، طلاست. این بزرگترین چیزی است که سیستم تشخیص گفتار جهانی آن ها را از سیستم سرگرمی گونه ی شما جدا می سازد. دلیل اصلی قرار دادن Google Now و Siri در هر تلفن های همراه به صورت رایگان و یا فروش ۵۰ دلاری دستگاه های Alaxa که هیچ هزینه اشتراک ندارند، این است که شما را به استفاده از آن ها تا حد ممکن وادار کنند. هر چیزی که شما به یکی از این سیستم ها می گویید، برای همیشه ضبط می شود و به عنوان داده آموزشی برای نسخه های آتی الگوریتم های تشخیص گفتار، استفاده می شود. این کل موضوع است!

حرف مرا باور نمی کنید؟ اگر شما یک گوشی اندروید دارید که Google Now  دارد، اینجا کلیک کنید تا فایل های صوتی ضبط شده از خودتان که شما در آن چیزهای مسخره ای گفته اید، را بشنوید:

گفتار های صوتی ذخیره شده توسط گوگل
شما می توانید به موارد مشابه در سایت آمازون از طریق اپلیکیشن الکسا دسترسی داشته باشید. متاسفانه اپل به شما دسترسی به فایل های صوتی Siri را نمی دهد.

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

از کجا بیشتر از این یاد بگیریم؟

این الگوریتمی که (مختصرا) توضیح داده شد که چگونه با صوت هایی که طول متغیر دارند، مواجه شویم، کلاسه بندی زمانی پیوندگرا ( Connectionist Temporal Classification ) یا به اختصار CTC نامیده می شود. شما می توانید مقاله ی اصلی آن را از ۲۰۰۶ بخوانید.

آدام کواتس از Baidu یک کنفرانس بسیار عالی در مورد یادگیری عمیق برای تشخیص گفتار که در Bay Area Deep Learning School ، ارائه داده است. شما می توانید این ویدیو را در یوتیوب ببینید (صحبت های او در ساعت ۳:۵۱:۰۰ شروع می شود). دیدن آن به شدت پیشنهاد می شود.

اگر شما این مقاله را دوست داشتید، برای ما نظر بگذارید تا ما را از افکار خود با خبر کنید.

بیشتر بخوانید :

منبع Medium

همچنین ببینید

فناوری تشخیص چهره و کاربردهای آن، تاریخچه تکنولوژی تشخیص چهره

فناوری تشخیص چهره و کاربردهای آن + تاریخچه

فناوری تشخیص چهره یک فناوری بیومتریک است که با استفاده از تجزیه و تحلیل الگوهایی …

4 نظر

  1. چقدر فیلم یوتیوب که معرفی کردی خوب بود
    دمت گرم

  2. خیلی مقاله خوبی نوشته بودی و نسبتا کامل بود. از سمت دیگه خیلی غمگین و ناراحت کننده بود که نمیشه خودمون یک همچین چیزی رو بسازیم. یعنی نمیشه چیزی نوشت که در حد استفاده شخصی باشه؟ منظورم از لحاظ سختی نوشتن هست. نوشتن سیستم پایه تشخیص گفتار هست.

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *