Chatbot with Voice

مقدمه

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

چکیده

 شبکه های از پیش آموزش داده شده یکی برای تبدیل صوت به متن، به نام Deepspeech، و دیگری هم برای تبدیل متن به متن از chatbot-rnn   می باشد. بطور ساده می توان گفت که تبدیل متن به متن نوعی ترجمه می باشد. با این تفاوت که خروجی مورد انتظار از همان زبان ورودی می باشد و در واقع پاسخ ورودی می باشد.  برای تبدیل متن به صوت هم از یک speech synthesizer استفاده شده است.

پیاده سازی

Deepspeech

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

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

بطور کلی می توان گفت که پیاده سازی شبکه شامل لایه های dense و همچین یک لایه Bi-directional RNN می باشد. در ابتدا سه لایه dense وجود دارد و بعد از آن شبکه Bi-directional RNN و بعد از آن هم سه لایه dense دیگر. تعداد ورودی های شبکه همان تعداد مرحله های زمانی شبکه Bi-RNN را مشخص می کند.

برای ورودی دادن به شبکه علاوه بر spectogram مربوط به همان فریم، اطلاعات چند عدد از فریم های هر دو سمت را هم به عنوان ورودی به هر مرحله زمانی می دهیم. به این فریم ها اطراف به اصطلاح context گفته می شود و در پیاده سازی مقادیر ۵ و ۷ و ۹ داشته است.

از آنجا که سه لایه اول بصورت dense می باشد، پس برای تعریف activation function این سه لایه برای هر مرحله زمانی، تاثیر بقیه ی لایه های زمانی را در نظر نمی گیریم. این امر برای سه لایه پس از شبکه Bi-RNN هم برقرار می باشد. می توان activation function سه لایه ابتدایی را بصورت زیر نمایش داد.

در Bi-RNN چون از دو جهت ورودی را بررسی می کنیم پس می توان گفت که برای محاسبه activation Bi-RNN سه وزن جدا داریم. یکی برای خروجی لایه قبلی، یکی برای feet forward و یکی برای feet backward. همچنین باید در نظر داشت که برای هر مرحله زمانی باید مقدار مرحله زمانی قبلی(t -1) را در وزن مربوط به feet forward ضرب کرد و مقدار مرحله زمانی بعدی (t + 1) را در وزن مربوط به feet backward ضرب کرد. بنابراین دو activation function متفاوت برای این لایه بدست می آید.

Activation برای دو لایه آخر هم مانند سه لایه اولیه می باشد. البته باید در نظر داشت که برای مشخص کردن مقداری که باید در وزن لایه ۵ ضرب شود از جمع activation function مربوط به feet forward و feet backward استفاده می شود.

در لایه آخر از softmax استفاده شده است. و در واقعا خروجی هر مرحله زمانی یک بردار از احتمالات است که مشخص می کند در یک مرحله زمانی مشخص به چه احتمالی ممکن است هر کاراکتر قرار بگیرد. کاراکتر ها شامل {a, …, z, A, …, Z, blank, atmosphere, space} می باشد. که atmosphere مشخص می کند که چیزی در یک فریم مشخص بیان نشده است.

برای آموزش مدل از CTC loss استفاده شده است و کاراکتر blank هم به همین دلیل به مجموعه کاراکتر ها اضافه شده است. به کمک این کاراکتر بطور مثال می توان مشخص کرد که کاراکتری دو بار در یک کلمه وجود دارد.

فرمول پایین مشخص می کند که احتمال قرار داشتن کاراکتر k در مرحله زمانی t چقدر می باشد. C همان مجموعه کاراکتر های می باشد و x ورودی را مشخص می کند. اندیس k برای (6)W همان ستون k از ماتریس W را مشخص می کند.

برای مشخص کردن خروجی نهایی از یک language model هم استفاده شده است که به کمک صوت های بدون label آموزش داده شده است. خروجی حاصل از شبکه اصلی ممکن است وجود یک کلمه خاص را در یک جمله حدس زده باشد یا اینکه چون واحد های سازنده مدل اصلی کاراکتر می باشد، کلمه ای را ایجاد کرده باشد که وجود خارجی نداشته باشد. به کمک language model بین خروجی های ممکن، بهترین و محتمل ترین خروجی انتخاب می شود.

فرمول مربوط به خروجی نهایی بصورت زیر می باشد. Plm همان خروجی language model را مشخص می کند. و word_count هم طول دنباله ای که ایجاد شده است را مشخص می کند. در فرمول ذکر شده آلفا و بتا قابل تنظیم هستند که به ترتیب میزان تاثیر خروجی مدل اصلی و میزان تاثیر خروجی language model را مشخص می کند و هر دو به کمک cross validation تنظیم می شوند.

Chat bot-rnn

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

کار کرد مدل به این شکل است که خروجی حاصل از قسمت encoder باید شبیه جوابی واقعی چت ورودی باشد. بطور مثال برای ورودی ‘اسمت چیه؟’ بتواند خروجی شبیه جواب واقعی چت را برگرداند که مثلا می تواند ‘علی هستم’ باشد.

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

Speech Synthesizer

برای تبدیل متن به صوت بطور کلی سه مرحله وجود. تقسیم بندی متن به کلمات، تبدیل کلمه به فونِم ها  و ایجاد صوت از روی فونِم ها.

تبدیل متن به کلمات با چالش هایی همراه هست. برای نمونه می توان اعداد را در نظر گرفت. ‘1997’ می تواند عدد ‘هزار نهصد و نود و هفت’ باشد یا به سال ‘1997’ اشاره کند که بیان اون دو در زبان انگلیسی متفاوت است.

مورد دیگر می تواند کلماتی باشد که با توجه به نوع کاربرد، به دو صورت متفاوت قابل خواندن باشند. مثل فعل ‘read’ که بسته به اینکه مفهوم گذشته یا حال دارد، به صورت ‘red’ یا ‘reed’ بیان می شود. برای حل این مشکل می توان از شبکه های عصبی یا  Hidden Markov Model  استفاده کرد تا با توجه به مفهوم جمله مشخص شود که چه بیانی از کلمه مناسب تر است.

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

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

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

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

Application

کد های مربوطه در آدرس Chatbot Repository قرار دارد

برای پیاده سازی اپلیکیشن موبایل از java و react native و flask استفاده شده است. 

منابع:

https://www.explainthatstuff.com/how-speech-synthesis-works.html

https://github.com/mozilla/DeepSpeech/

what-is-text-to-speech-and-how-does-it-work

https://github.com/pender/chatbot-rnn

اعضای گروه: محمد قربانی، بردیا اسمعیلی

فوتر سایت

اسلایدر سایدبار

درباره من

درباره من

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

شبکه های اجتماعی

مطالب اخیر

فیسبوک