دستیار صوتی خود را بسازید
دستیار گوگل، سیری (Siri)، الکسا (Alexa) و سایر دستیارهای صوتی همیشه مایه تعجب و شگفتی من بودهاند. این دستیارها با انجام خودکار برخی کارها کمک زیادی به کاربران خود میکنند. به همین دلیل، تصمیم گرفتم برای خودم یک دستیار صوتی بسازم که دستورات صوتی را از طریق میکروفن لپتاپم دریافت کند و کار خواستهشده را انجام دهد.
دیتاست
ابتدا 5 دستوری که فکر میکردم برای همه پرکاربردند، انتخاب کردم و صدایم را در حین ذکر آن دستورها ضبط کردم. فرض کردم زمانی که کاربر میخواهد دستور خود را بیان کند، هیچ صدای مختلکنندهای در پسزمینه وجود ندارد. این فرض کار مرا بسیار راحت کرد، زیرا دیگر نیازی نبود که نگران پیشپردازش (Pre-processing) دستور صوتی و جداکردن دستور اصلی از نویزها و صداهای مختلکننده باشم.
5 دستور انتخابی من عبارتند از:
- «Decrease Volume»: صدای سیستم را کم کن.
- «Increase Volume»: صدای سیستم را زیاد کن.
- «Open Google»: صفحه گوگل را در مرورگر باز کن.
- «Show CPU Utilization»: جزئیات عملکرد فرآیندهای درحال اجرا را نشان بده.
- «Take a Picture»: با استفاده از دوربین لپتاپ عکس بگیر.
از آنجا که، من از یک مدل یادگیری عمیق (Deep Learning) برای پیشبینی دستورات استفاده میکنم، برای هر دسته به مقدار زیادی داده نیاز خواهم داشت. من از کد پایتون زیر استفاده کردم، تا با استفاده از میکروفون لپتاپم، برای هر دستور 20 نمونه ضبط کنم، که در سرعت (Tempo) و لحن (Tone) تفاوتهای جزئی داشته باشند. هر نمونه 2 ثانیه طول میکشد، که قدری از میانگین زمانی معمول افراد برای گفتن این دستورات طولانیتر است.
میتوان قطعههای یکثانیهای از هریک از این 20 نمونه را بهصورت تصادفی برداشت و یک ثانیه سکوت به آن افزود. به این ترتیب، حجم دادهها در هر کلاس بهطور چشمگیری افزایش مییابد. با استفاده از کد زیر میتوانیم 200 تا از این قطعات را به دست آوریم.
حالا که برای هر کلاس تقریباً 220 نمونه (20 نمونه اصلی و 200 قطعه) داریم، میتوانیم به پیشپردازش روی این نمونههای صوتی فکر کنیم.
پیشپردازش نمونههای صوتی
دستورات صوتی ضبطشده با پسوند .wav ذخیره شدهاند و اگر بتوانیم طیفنگار (Spectrogram) این فایلهای صوتی را به دست آوریم، میتوانیم هریک از آنها را یک تصویر در نظر بگیریم و با استفاده از شبکه عصبی کانولوشنی Convolutional neural network (CNN) (CNN) آنها را دستهبندی کنیم. خوشبختانه، کتابخانه لیبروسا (librosa) در پایتون این کار را برای ما بسیار ساده میکند، با استفاده از آن میتوانیم بهراحتی طیفنگار فایلهای صوتی را تولید کنیم. کد زیر برای تولید طیفنگار به ما کمک میکند.
برای ایجاد طیفنگارِ یک فایل صوتی باید تبدیل فوریه زمان کوتاهِ (Short-time Fourier transform) داده صوتی را حساب کنیم. تبدیل فوریه، سیگنال در حوزه زمان را به حوزه فرکانس انتقال میدهد، در واقع بهمنظور آنکه از میزان تغییرات سیگنال اطلاع پیدا کنیم، از این روش استفاده میکنیم. تبدیل فوریه زمان کوتاه بصورت پنجرههای کوچکی در نظر گرفته شده و در فایل صوتی کانوالو میشود (Convolve) و سپس تبدیل فوریه گسسته ( DFTDiscrete Fourier Transform) بر پنجره اعمال میگردد، سپس این پنجره در طول سیگنال حرکت داده میشود و DFT مرتباً روی آن اعمال میشود.با استفاده از کد فوق میتوان طیفنگار هر 5 دستور را بصری کرد.
همانطور که در شکلها مشهود است، طیفنگار دو دستور «Increase Volume» و «Decrease Volume» شباهت زیادی به یکدیگر دارند، چون میان دو واژه «Increase» و «Decrease» تفاوت اندکی وجود دارد.
حال به کمک کد زیر میتوانیم طیفنگار هریک از نمونههای صوتی را به دست آورده و آن را در آرایه numpy بریزیم. (نکته: ما طول طیفنگارها با استفاده از pad به یک اندازه تبدیل کردیم، بنابراین، ابعاد آنها با یکدیگر همخوانی دارد.)
حال که نمونههای صوتی و برچسبهای متناظر با آنها را در فایلی با پسوند .npy ذخیره کردیم، به جای آنکه هر دفعه طیفنگار آنها را تولید کنیم، میتوانیم آنها را از این فایل بارگذاری کنیم.
بیشتر بخوانید: دستیار صوتی مبتنی بر هوش مصنوعی
ساخت مدل
میتوان طیفنگارها را تصویر در نظر گرفت و با استفاده ازشناسایی ویژگیهایی از این تصاویر میتوان مشخص کرد که هر نمونه صوتی متعلق به چه دستهای است. برای این کار میتوان از شبکههای عصبی کانولوشنی استفاده کرد. ورودی این شبکهها تصویر است. یک شبکه عصبی پیچشی پس از دریافت تصویر ورودی، ویژگیها فضایی آن را یاد میگیرد و بر طبق آنها، پیشبینی میکند که تصویر متعلق به کدام دسته است. پیش از ساخت مدل، دادهها بر زده میشوند (Shuffle) و به دو مجموعه آموزش و آزمون تقسیم میشوند. همچنین با استفاده از کد زیر برچسبها به کدبندی وان هات (one hot encoding) تبدیل میشوند
حال میتوان ساخت شبکه عصبی کانولوشنی را آغاز کرد. برای این کار از چهارچوب TF 2.0 استفاده میکنیم.
در این مرحله مدل طی 15 دوره آموزش داده میشود و بر اساس تابع زیان آنتروپی متقاطع (Cross-entropy loss) ارزیابی میشود و از RMSProp نیز برای بهینهسازی استفاده میگردد
به این ترتیب مدل ویژگیهای اصلی طیفنگارها را یاد میگیرد و آنها را براساس نوع دستور صوتی از یکدیگر تمیز میدهد. این مدل، پس از 15 دوره آموزش، به دقت 96% در دادههای آزمون رسید. حالا میتوانیم مدل را ذخیره کنیم و از آن برای پیشبینی دسته دستورات صوتی و انجام درخواست استفاده کنیم.
خودکارکردن وظایف
از میکروفون لپتاپ برای ذخیره مداوم فایل صوتی استفاده کردیم، سپس این فایل را به نمونههای 2 ثانیهای تقسیم کردیم و برای پیشبینی به مدل مذکور دادیم. اگر این مدل بتواند دستورات را با سطح اطمینان بالایی دستهبندی کند، ما آن دستور را اجرا میکنیم. در ادامه کدهایی برای انجام هر دستور در پایتون ارائه شده است. (نکته: کتابخانه لازم برای اجرای بعضی دستورات ممکن است در سیستمهای مختلف با یکدیگر متفاوت باشد، کدهای زیر برای سیستم عامل مک (macOS) به کار میآیند.)
دستور کاهش صدا
دستور افزایش صدا
دستور بازکردن صفحه گوگل
دستور نشاندادن میزان مصرف CPU
دستور گرفتن عکس
حالا میتوانیم کدی بنویسیم که بهطور نامحدود آماده شنیدن دستورات صوتی از طریق میکروفون لپتاپ باشد و پس از دریافت، آن را به بازههای 2 ثانیهای تقسیم کند و سپس آن نمونه را به مدل CNN بدهد تا شبکه نوع آن را پیشبینی کند. اگر شبکه CNN بتواند نمونه مذکور را با سطح اطمینان بالایی دستهبندی کند (به این خاطر که ما نمیخواهیم وقتی هیچ دستوری صادر نشده یا محتوای صوتی سکوت است کاری انجام دهیم)، ما آن دستور را اجرا میکنیم. این کد در ادامه ارائه شده است:
نتیجهگیری
رویکردی که در اینجا ارائه شد، ابتدایی است، کامل نیست و همانطور که در ویدئو ملاحظه کردید، دو بار در تشخیص دستور صوتی موفق عمل نکرد، اما میتوانیم آن را در زمان کوتاهی بسازیم و آزمایش کنیم و لذت ببریم.
آنچه ارائه شد تنها نمونهای است از کارهایی که میشود انجام داد. اگر بخواهید میتوانید وظایف دیگری را از طریق دستوارت دیگری خودکار کنید، حتی میتوانید تعداد دستورات را افزایش دهید و همچنان دقت قابل قبولی داشته باشید.