Filter by دسته‌ها
chatGTP
ابزارهای هوش مصنوعی
اخبار
گزارش
تیتر یک
چندرسانه ای
آموزش علوم داده
اینفوگرافیک
پادکست
ویدیو
دانش روز
آموزش‌های پایه‌ای هوش مصنوعی
اصول هوش مصنوعی
یادگیری بدون نظارت
یادگیری تقویتی
یادگیری عمیق
یادگیری نیمه نظارتی
آموزش‌های پیشرفته هوش مصنوعی
بینایی ماشین
پردازش زبان طبیعی
پردازش گفتار
چالش‌های عملیاتی
داده کاوی و بیگ دیتا
رایانش ابری و HPC
سیستم‌‌های امبدد
علوم شناختی
دیتاست
رویدادها
جیتکس
کاربردهای هوش مصنوعی
کتابخانه
اشخاص
شرکت‌های هوش مصنوعی
محصولات و مدل‌های هوش مصنوعی
مفاهیم
کسب‌و‌کار
تحلیل بازارهای هوش مصنوعی
کارآفرینی
هوش مصنوعی در ایران
هوش مصنوعی در جهان
مقاله
 دستیار صوتی خود را بسازید

دستیار صوتی خود را بسازید

زمان مطالعه: 3 دقیقه

دستیار گوگل، سیری (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 تا از این قطعات را به دست آوریم.

منبع: https://gist.github.com/grohith327/2f9121157039840a77b5d527e2313f06

حالا که برای هر کلاس تقریباً 220 نمونه (20 نمونه اصلی و 200 قطعه) داریم، می‌توانیم به پیش‌پردازش روی این نمونه‌های صوتی فکر کنیم.


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


دستورات صوتی ضبط‌شده با پسوند .wav ذخیره شده‌اند و اگر بتوانیم طیف‌نگار (Spectrogram) این فایل‌های صوتی را به دست آوریم، می‌توانیم هریک از آنها را یک تصویر در نظر بگیریم و با استفاده از شبکه عصبی کانولوشنی Convolutional neural network (CNN) (CNN) آنها را دسته‌بندی کنیم. خوشبختانه، کتابخانه لیبروسا (librosa) در پایتون این کار را برای ما بسیار ساده می‌کند، با استفاده از آن می‌توانیم به‌راحتی طیف‌نگار فایل‌های صوتی را تولید کنیم. کد زیر برای تولید طیف‌نگار به ما کمک می‌کند.

منبع: https://gist.github.com/grohith327/0e6b2071b8e3f57961a24d06c495fe33

برای ایجاد طیف‌نگارِ یک فایل صوتی باید تبدیل فوریه زمان کوتاهِ (Short-time Fourier transform) داده صوتی را حساب کنیم. تبدیل فوریه، سیگنال در حوزه زمان را به حوزه فرکانس انتقال می‌دهد، در واقع به‌منظور آنکه از میزان تغییرات سیگنال اطلاع پیدا کنیم، از این روش استفاده می‌کنیم. تبدیل فوریه زمان کوتاه بصورت پنجره‌های کوچکی در نظر گرفته شده و در فایل صوتی کانوالو می‌شود (Convolve) و سپس تبدیل فوریه گسسته ( DFTDiscrete Fourier Transform) بر پنجره اعمال می‌گردد، سپس این پنجره در طول سیگنال حرکت داده می‌شود و DFT مرتباً روی آن اعمال می‌شود.با استفاده از کد فوق می‌توان طیف‌نگار هر 5 دستور را بصری کرد.

همان‌طور که در شکل‌ها مشهود است، طیف‌نگار دو دستور «Increase Volume» و «Decrease Volume» شباهت زیادی به یکدیگر دارند، چون میان دو واژه «Increase» و «Decrease» تفاوت اندکی وجود دارد.
حال به کمک کد زیر می‌توانیم طیف‌نگار هریک از نمونه‌های صوتی را به دست آورده و آن را در آرایه numpy بریزیم. (نکته: ما طول طیف‌نگار‌ها با استفاده از pad به یک اندازه تبدیل کردیم، بنابراین، ابعاد آنها با یکدیگر هم‌خوانی دارد.)
حال که نمونه‌های صوتی و برچسب‌های متناظر با آنها را در فایلی با پسوند .npy ذخیره کردیم، به ‌جای آنکه هر دفعه طیف‌نگار آنها را تولید کنیم، می‌توانیم آنها را از این فایل بارگذاری کنیم.

بیشتر بخوانید: دستیار صوتی مبتنی بر هوش مصنوعی

منبع: https://gist.github.com/grohith327/ce30475cd508e0f196fb4face38f47ca

ساخت مدل

می‌توان طیف‌نگار‌ها را تصویر در نظر گرفت و با استفاده ازشناسایی ویژگی‌هایی از این تصاویر میتوان مشخص کرد که هر نمونه صوتی متعلق به چه دسته‌ای است. برای این کار می‌توان از شبکه‌های عصبی کانولوشنی استفاده کرد. ورودی این شبکه‌ها تصویر است. یک شبکه عصبی پیچشی پس از دریافت تصویر ورودی، ویژگی‌ها فضایی آن را یاد می‌گیرد و بر طبق آنها، پیش‌بینی می‌کند که تصویر متعلق به کدام دسته است. پیش از ساخت مدل، داده‌ها بر زده می‌شوند (Shuffle) و به دو مجموعه آموزش و آزمون تقسیم می‌شوند. همچنین با استفاده از کد زیر برچسب‌ها به کدبندی وان هات (one hot encoding) تبدیل می‎شوند

منبع: https://gist.github.com/grohith327/3d3ab1759f6a7a41654cbedbcd5dd7e8

حال می‌توان ساخت شبکه عصبی کانولوشنی  را آغاز کرد. برای این کار از چهارچوب TF 2.0 استفاده می‌کنیم.

منبع: https://gist.github.com/grohith327/3ff5da311fe03e0a8cc615bf7435ae83

در این مرحله مدل طی 15 دوره آموزش داده می‌شود و بر اساس تابع زیان آنتروپی متقاطع (Cross-entropy loss) ارزیابی می‌شود و از RMSProp نیز برای بهینه‌سازی استفاده می‌گردد

منبع: https://gist.github.com/grohith327/3ff5da311fe03e0a8cc615bf7435ae83

به این ترتیب مدل ویژگی‌های اصلی طیف‌نگار‌ها را یاد می‌گیرد و آنها را براساس نوع دستور صوتی از یکدیگر تمیز می‌دهد. این مدل، پس از 15 دوره آموزش، به دقت 96% در داده‌های آزمون رسید. حالا می‌توانیم مدل را ذخیره کنیم و از آن برای پیش‌بینی دسته دستورات صوتی و انجام درخواست استفاده کنیم.

خودکارکردن وظایف

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

دستور کاهش صدا

منبع: https://gist.github.com/grohith327/9192644cc40d2d1a2c0cc963dc5520ca

دستور افزایش صدا

منبع: https://gist.github.com/grohith327/5a7140d573b9416175d0b334da516260

دستور بازکردن صفحه گوگل

منبع: https://gist.github.com/grohith327/41c810a36097905747f0d5aad57c3500

دستور نشان‌دادن میزان مصرف CPU

منبع: https://gist.github.com/grohith327/102a2ec2e16a81956a7bc2a7a0a248a5

دستور گرفتن عکس


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

منبع: https://gist.github.com/grohith327/becb9a96274d04a8e97cac5a6e23abdf
منبع: https://gist.github.com/grohith327/27b51531eb7f27f3de26be4af53a45cb
منبع: https://gist.github.com/grohith327/27b51531eb7f27f3de26be4af53a45cb

                                        

نتیجه‌گیری

رویکردی که در اینجا ارائه شد، ابتدایی است، کامل نیست و همان‌طور که در ویدئو ملاحظه کردید، دو بار در تشخیص دستور صوتی موفق عمل نکرد، اما می‌توانیم آن را در زمان کوتاهی بسازیم و آزمایش کنیم و لذت ببریم.

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

میانگین امتیاز / 5. تعداد ارا :

مطالب پیشنهادی مرتبط

اشتراک در
اطلاع از
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها
[wpforms id="48325"]