طراحی و ساخت دستیار شخصی مجهز به هوش مصنوعی به زبان پایتون
یک دستیار شخصی مجهز به هوش مصنوعی درواقع نرمافزاری است که دستورات گفتاری و نوشتاری شما را متوجه میشود و کاری که به آن محول کردهاید را به انجام میرساند. این دستیار در حقیقت نمونهای از هوش مصنوعی ضعیف weak AI بهشمار میآید زیرا تنها خواستههای کاربر را انجام میدهد.
آیا قصد دارید یک دستیار شخصی مثل سیری Siri شرکت اپل، کورتانای Cortana شرکت مایکروسافت یا دستیار صوتی گوگل بسازید؟
با دنبال کردن این مقاله میتوانید در چند مرحله ساده یک دستیار شخصی بسازید. زبان برنامهنویسی پایتون که در این مقاله مورد استفاده قرار میگیرد، پرکاربردترین زبان مورد استفاده برنامهنویسان است که میتوان با استفاده از آن دستیار شخصی مجهز به هوش مصنوعی ساخت که مسائل طرح شده توسط کاربر را اجرا کند. درادامه نحوه ساخت یک دستیار شخصی صوتی را با استفاده از پایتون شرح خواهیم داد.
قابلیتهای دستیار شخصی:
دستیار صوتی که طی این آموزش طراحی خواهد شد دارای تواناییها زیر است:
- باز کردن برنامههایی از قبیل یوتیوب، جیمیل، گوگل کروم و stack overflow
- اعلام ساعت
- گرفتن عکس
- جستجو در وبسایت ویکیپدیا و جمعآوری داده از آن
- پیشبینی آب و هوای شهرهای مختلف
- نشان دادن سر خط خبرهای وبسایت Times of India
- پاسخ دادن به سوالات محاسباتی و جغرافیایی
پکیجهای موردنیاز:
برای ساخت یک دستیار شخصی صوتی لازم است پکیجهای زیر را به کمک pip نصب کنید.
- Speech recognition: تشخیص گفتار یکی از مهمترین مولفههایی مورد استفاده در دستگاههای هوش مصنوعی و خانههای خودکار است. تابع اصلی این کتابخانه زمانی که یک صدا شنیده شود، این کتابخانه سعی میکند صدای انسان را در آن میان شناسایی کرده و گفتار را به نوشتار تبدیل کند.
- pyttsx3 :pyttsx3 کتابخانهای پایتونی است که نوشتار را به گفتار تبدیل میکند. این پکیج از موتورهای تبدیل نوشتار به گفتار در سیستمعاملهای Mac os x، ویندوز و لینوکس پشتیبانی میکند.
- wikipedia: ویکیپدیا یک دایرهالمعارف آنلاین و چندزبانه است که در میان افراد تحصیلکرده از دانشآموزان گرفته تا اساتید دانشگاه بسیار پرکاربرد است. این پکیج در پایتون دادههای موردنیاز ما را از ویکیپدیا استخراج میکند.
- ecapture: این ماژول برای اجرای دستورات مبنی گرفتن عکس توسط دوربین دستگاه مدنظر لازم است.
- datetime datetime نیز یک ماژول تعبیهشده در پایتون است که با تاریخ و زمان کار میکند.
- os: این ماژول یک کتابخانه استاندارد در پایتون است که امکان تعامل با سیستمعامل را فراهم میآورد.
- time: ماژول time برای نشان دادن زمان بهکار گرفته میشود.
- Web browser :Web browser یک پکیج تعبیهشده در پایتون است که دادهها را از صفحات وب استخراج میکند.
- Subprocess :Subprocess یک کتابخانه استاندارد است که دستورات مختلف سیستم همچون خاموش کردن یا راهاندازی مجدد سیستم را پردازش میکند.
- Json: ماژول Json نیز برای مرتبسازی و ردوبدل کردن دادهها مورداستفاده قرار میگیرد.
- request: ماژول request برای ارسال انواع درخواستهای HTTP استفاده میشود. این ماژول یک URL را بهعنوان پارامتر میگیرد و سپس امکان دسترسی به آن را فراهم میکند.
- wolfram alpha :wolfram alpha یک رابط برنامهنویسی کاربردی است که میتواند با استفاده از الگوریتمهای wolfram پاسخهای مناسب را آماده کند.
اجرا:
ابتدا کتابخانههای ذکرشده در بالا را وارد کنید:
import speech_recognition as sr import pyttsx3 import datetime import wikipedia import webbrowser import os import time import subprocess from ecapture import ecapture as ec import wolframalpha import json import requests
تنظیم موتور گفتار:
ماژول pyttsx3 را در یک متغیر به نام engine ذخیره میکنیم. Sapi5 نیز یک موتور تبدیل نوشتار به گفتار متعلق به شرکت مایکروسافت است که برای تشخیص صدا استفاده میشود. آیدی voice را میتوان برابر 0 یا 1 گذاشت که 0 به معنای صدای مردانه و 1 نشاندهنده صدای زنانه است.
1engine=pyttsx3.init('sapi5') 2voices=engine.getProperty('voices') 3engine.setProperty('voice','voices[0].id')
حالا یک تابع به نام speak تعریف میکنیم که نوشتار را به گفتار را تبدیل کند. تابع speak، متن را به عنوان آرگومان دریافت کرده و به علاوه تابع engine را تعریف میکند.
runAndWait: این تابع در زمانی که دستورات جاری در حال پردازش هستند، غیرفعال است. تابع runAndWait در ازای هر پردازش برای تابع engine یک اعلان ارسال میکند و زمانی برمیگردد که همه دستوراتی که در صف اجرا قرار گرفته بودند، به انجام برسند.
def speak(text): engine.say(text) engine.runAndWait()
تعریف یک تابع برای خوشآمدگویی به کاربر:
یک تابع به نام wishMe برای دستیار هوش مصنوعی تعریف میکنیم که به کاربر خوشآمد بگوید. تابع now().hour ساعتی از روز که در آن هستیم را مشخص میکند. اگر ساعت بزرگتر از عدد صفر و کوچکتر از 12 باشد، دستیار صوتی به کاربر «Good Morning» میگوید، اگر ساعت بین عدد 12 و 18 باشد، دستیار پیام «Good Afternoon» را به کاربر نمایش میدهد و در غیر اینصورت پیام «Good evening» را نشان خواهد داد.
def wishMe(): hour=datetime.datetime.now().hour if hour>=0 and hour<12: speak("Hello,Good Morning") print("Hello,Good Morning") elif hour>=12 and hour<18: speak("Hello,Good Afternoon") print("Hello,Good Afternoon") else: speak("Hello,Good Evening") print("Hello,Good Evening")
تنظیم تابع command برای دستیار هوش مصنوعی:
تابع takecommand را برای دستیار هوش مصنوعی خود تعریف میکنیم تا بتواند زبان انسانها را درک کرده و دریافت کند. میکروفن دستگاه گفتار انسان را دریافت میکند و شناساگر این گفتار را شناسایی میکند تا بتواند به آن پاسخ دهد. فرایند مدیریت استثنا نیز برای مدیریت خطاهایی استفاده میشود که در زمان اجرای برنامه در اثر مواجهه با موارد استثنا پیش میآیند. تابع recognize_google نیز از google audio برای تشخیص گفتار استفاده میکند.
def takeCommand(): r=sr.Recognizer() with sr.Microphone() as source: print("Listening...") audio=r.listen(source) try: statement=r.recognize_google(audio,language='en-in') print(f"user said:{statement}\n") except Exception as e: speak("Pardon me, please say that again") return "None" return statement print("Loading your AI personal assistant G-One") speak("Loading your AI personal assistant G-One") wishMe()
تابع Main:
کار تابع main از اینجا شروع میشود و دستوراتی که کاربر میدهد در متغیر statement ذخیره خواهند شد.
1if __name__=='__main__': while True: speak("Tell me how can I help you now?") statement = takeCommand().lower() if statement==0: continue
اگر کلمات فعالکننده زیر در دستوراتی باشند که توسط کاربر گفته شده و در متغیر ذخیره شدهاند، دستیار مجازی جملات زیر را بیان خواهد کرد:
if "good bye" in statement or "ok bye" in statement or "stop" in statement: speak('your personal assistant G-one is shutting down,Good bye') print('your personal assistant G-one is shutting down,Good bye') break
قابلیت اول: گرفتن دادهها از ویکیپدیا
دستور زیر برای استخراج داده از ویکیپدیا استفاده میشود. تابع wikipedia.summary() دو آرگومان میگیرد:
1. متغیر statement که محتویات آن توسط کاربر داده شده و 2. تعداد جملاتی که باید از ویکیپدیا دریافت کرده و در متغیر result ذخیره کند.
if "good bye" in statement or "ok bye" in statement or "stop" in statement: speak('your personal assistant G-one is shutting down,Good bye') print('your personal assistant G-one is shutting down,Good bye') break
قابلیت دوم: دسترسی دادن به مرورگرها از قبیل گوگل کروم، سامانه GMail و سایت یوتیوب
مرورگر دادهها را از صفحات وب استخراج میکند. تابع open_new_tab،URL که میخواهیم به آن دسترسی داشته باشیم را به عنوان پارامتر دریافت میکند. تابع Python time sleep نیز تعریف میشود تا در اجرای برنامهها تأخیر ایجاد کند. درواقع میتوان با استفاده از این تابع زمانی مشخص (برحسب ثانیه) برای توقف اجرای برنامه تعیین کرد.
elif 'open youtube' in statement: webbrowser.open_new_tab("https://www.youtube.com") speak("youtube is open now") time.sleep(5) elif 'open google' in statement: webbrowser.open_new_tab("https://www.google.com") speak("Google chrome is open now") time.sleep(5) elif 'open gmail' in statement: webbrowser.open_new_tab("gmail.com") speak("Google Mail open now") time.sleep(5)
قابلیت سوم: نشان دادن زمان
تابع datetime.now() زمان را در هر لحظه با گفتن ساعت، دقیقه و ثانیه نشان میدهد و آن را در متغیری به نام strTime ذخیره میکند.
elif 'time' in statement: strTime=datetime.datetime.now().strftime("%H:%M:%S") speak(f"the time is {strTime}")
قابلیت چهارم: نمایش دادن سر خط خبرها
اگر کاربر از دستیار صوتی خود بخواهد که وی را از جدیدترین اخبار روز مطلع سازد، دستیار صوتی به این صورت برنامهریزی شده که با استفاده از تابع web browser جدیدترین سرتیترهای سایت Time of India را برای کاربر به نمایش درآورد.
قابلیت پنجم: عکس گرفتن
تابع ec.capture() برای گرفتن عکس توسط دوربین دستگاه شما استفاده میشود. این تابع 3 پارامتر دارد.
- اندیس دوربین (Camera index): اندیس اولین دوربینی که متصل میشود 0 و اندیس دوربین بعدی 1 خواهد بود.
- نام پنجره (Window name): این پارامتر میتواند یک متغیر یا یک رشته باشد. اگر نمیخواهید پنجرهای ببینید، مقدار این پارامتر را False تعریف کنید.
- نام فایل (Save name): نامی است که تصویر گرفته شده توسط دوربین با آن ذخیره خواهد شد. اگر نمیخواهید عکسی ذخیره شود، مقدار این پارامتر را False تعریف کنید.
elif 'news' in statement: news = webbrowser.open_new_tab("https://timesofindia.indiatimes.com/home/headlines”) speak('Here are some headlines from the Times of India,Happy reading') time.sleep(6) elif "camera" in statement or "take a photo" in statement: ec.capture(0,"robo camera","img.jpg")
قابلیت ششم: جستوجو در اینترنت
به کمک تابع web browser میتوانید اطلاعات موردنیاز را جستوجو کنید. تنها کافی است دستورات کاربر را به تابع open_new_tab() بدهید. برای مثال، اگر کاربر بگوید:«سلام جیوان، لطفاً چندتا عکس از پروانه برای من پیدا کن.»، دستیار صوتی پنجره گوگل را باز میکند و تصاویری از پروانهها که پیشتر در صفحات وب منتشر شده را به کاربر نمایش میدهد.
elif 'search' in statement: statement = statement.replace("search", "") webbrowser.open_new_tab(statement) time.sleep(5)
قابلیت هفتم: تنظیمات لازم برای پاسخگو بودن دستیار هوش مصنوعی به سوالات جغرافیایی و محاسباتی
در این بخش میتوانیم با استفاده از یک API دیگر به نام Wolfram alpha API دستیار هوشمند خود را بهنحوی تنظیم کنیم که بتواند به سوالات جغرافیایی و محاسباتی نیز پاسخ دهد. درواقع زبان Wolfram این امکان را برای برنامه ما فرآهم میآورد. در کد پایین client یک نمونه (کلاس) است که برای wolfram alpha ساخته شده است. متغیر res نیز مسئول ذخیرهسازی پاسخ دادهشده توسط wolfram alpha میباشد.
elif 'ask' in statement: speak('I can answer to computational and geographical questions and what question do you want to ask now') question=takeCommand() app_id="Paste your unique ID here " client = wolframalpha.Client('R2K75H-7ELALHR35X') res = client.query(question) answer = next(res.results).text speak(answer) print(answer)
برای آن که به wolfram alpha API دسترسی پیدا کنید، باید یک App ID منحصربهفرد داشته باشید که از روش زیر میتوانید آن را بسازید:
1. وارد وبسایت رسمی wolfram alpha شوید و در صورتی که حساب کاربری ندارید، یک حساب برای خود بسازید.
2. با استفاده از wolfram ID خود وارد سایت شوید.
3. حالا میتوانید صفحه اصلی سایت را ملاحظه فرمایید. از لیست کشویی گوشه سمت راست و بالای صفحه میتوانید به بخشهای مختلف حساب کاربری خود دسترسی داشته باشید. در این فهرست گزینه My Apps (API) را انتخاب کنید.
4. در این مرحله پنجره زیر برای شما باز خواهد شد. در این پنجره روی گزینه Get APP_ID کلیک کنید.
5. در این مرحله کادر زیر روی صفحه برای شما باز خواهد شد. پس از انتخاب یک نام مناسب و توضیحات لازمه روی گزینه Get AppID کلیک کنید. حال برای شما یک App ID کاملاً منحصربهفرد تعریف میشود که با استفاده از آن میتوانید به Wolfram alpha API دسترسی پیدا کنید.
برای مثال، کاربر میگوید:«سلام جیوان، پایتخت کالیفرنیا کجاست؟»
دستیار صوتی چنین پاسخ میدهد:«ساکرامنتو، ایالات متحده آمریکا.»
قابلیت هشتم: ویژگیهای اضافه
امکان پاسخ دادن به سوالاتی از قبیل «چه قابلیتهایی داری؟» و «چه کسی تو را ساخته است؟» نیز قابلیت جالبی است که میتوانید به برنامه خود اضافه کنید.
elif 'who are you' in statement or 'what can you do' in statement: speak('I am G-one version 1 point O your personal assistant. I am programmed to minor tasks like' 'opening youtube,google chrome, gmail and stackoverflow ,predict time,take a photo,search wikipedia,predict weather' 'In different cities, get top headline news from times of india and you can ask me computational or geographical questions too!') elif "who made you" in statement or "who created you" in statement or "who discovered you" in statement: speak("I was built by Mirthula") print("I was built by Mirthula")
قابلیت نهم: پیشبینی آبوهوا
حالا بهمنظور تعریف قابلیت پیشبینی آبوهوا برای دستیار هوش مصنوعی خود باید یک API key از Open Weather map بسازیم.
Open Weather map یک سرویس آنلاین است که دادههای مربوط به آبوهوا را ثبت میکند. با ایجاد یک API ID در وبسایت رسمی Open Weather map میتوانید با استفاده از APP_ID در کد دستیار هوشمند خود قابلیت پیشبینی آبوهوا (در هر زمان و برای هر نقطهای از جهان) را نیز به آن بیافزایید. ماژولهایی که برای افزودن این قابلیت به برنامه لازم هستند ماژولها json و request میباشند.
متغیر city_name دستور صادر شده توسط کاربر را از طریق تابع takeCommand() دریافت میکند. متد get از ماژول request یک شیء به نام response به ما میدهد. و متدهای json این شیء فرمت دادههای json را به فرمت دادههای پایتون تبدیل میکنند. متغیر X حاوی فهرستی از فرهنگلغتهای تودرتو است که بررسی میکنند که آیا مقدار COD برابر 404 است یا خیر (یعنی اینکه آیا شهر مدنظر پیدا شده است یا نه). اعداد و ارقامی از قبیل دمای هوا و میزان رطوبت در کلید اصلی متغیر Y ذخیره میشوند.
elif "weather" in statement: api_key="Apply your unique ID" base_url="https://api.openweathermap.org/data/2.5/weather?" speak("what is the city name") city_name=takeCommand() complete_url=base_url+"appid="+api_key+"&q="+city_name response = requests.get(complete_url) x=response.json() if x["cod"]!="404": y=x["main"] current_temperature = y["temp"] current_humidiy = y["humidity"] z = x["weather"] weather_description = z[0]["description"] speak(" Temperature in kelvin unit is " + str(current_temperature) + "\n humidity in percentage is " + str(current_humidiy) + "\n description " + str(weather_description)) print(" Temperature in kelvin unit = " + str(current_temperature) + "\n humidity (in percentage) = " + str(current_humidiy) + "\n description = " + str(weather_description))
برای مثال، کاربر چنین میگوید:«سلام جیوان، من اطلاعات آبوهوا را میخواهم.»
دستیار صوتی میپرسد:«نام شهر مدنظر شما چیست؟»
و کاربر پاسخ میدهد:«هیماچال پرادش»
دستیار صوتی نیز چنین پاسخ میدهد:«دمای هوا 09/301 درجه کلوین و میزان رطوبیت 52 درصد است و احتمال بارش باران وجود دارد.»
قابلیت دهم: خاموش کردن رایانه
بدین منظور با استفاده از تابع subprocess.call() میتوانیم عملکردهای سیستم را پردازش کنیم تا دستیار ما بتواند رایانه را خاموش یا روشن کند. این تابع از دستیار هوشمند شما میخواهد تا رایانه را به صورت خودکار روشن و یا خاموش کند.
elif "log off" in statement or "sign out" in statement: speak("Ok , your pc will log off in 10 sec make sure you exit from all applications") subprocess.call(["shutdown", "/l"]) time.sleep(3)
بسیارخب، کار ساختن دستیار هوش مصنوعی در همینجا به پایان میرسد. البته همچنان میتوانید عملکردها و قابلیتهای بیشتری به دستیار صوتی هوشمند خود بیافزایید.
برای دریافت کدهای این برنامه به لینک گیتهاب مراجعه نمایید.