تشخیص صدا(Speech recognition) با پایتون

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

قدم اول: پایتون!

ورژن پایتون شما باید حداقل 3.2 باشه. اگر ورژن قدیمی تری دارید، همین الان نسخه جدیدتری رو بریزید!
ورژن پایتون شما باید حداقل 3.2 باشه. اگر ورژن قدیمی تری دارید، همین الان نسخه جدیدتری رو بریزید!


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


قدم دوم: نصب کتابخانه ها

کتابخانه های مورد نیاز ما speech_recognition هستش. این کتابخانه برای گوگل هست. امکان استفاده از این ابزار توسط google api هم وجود دارد ولی در اون صورت برای اکانت رایگان قابل استفاده نیست! برای نصب این کتابخانه دستور زیر را در ترمینال اجرا کنید.


pip install SpeechRecognition

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


قدم سوم: گرفتن صدا


خب اول از همه که باید کتابخانه رو ایمپرت کنیم!

import speech_recognition as sr

اسمی که باید ایمپرت کنید، speech_recognition هستش؛ از اونجایی که یکمی طولانیه این اسم(!) به نام sr ایمپرتش میکنیم.


بریم سراغ گرفتن صدا!

r = sr.Recognizer()
with sr.Microphone() as source:
     print("Listening...")
     r.pause_threshold = 1
     audio = r.listen(source)

اصلا گیج نشید! خط به خط این کد رو توضیح مدم براتون.

توی خط اول رفتیم و یه تشخیص دهنده رو توی متغیر r قرار دادیم. بعد با استفاده از میکروفون(sr.Microphone) به عنوان source، سه خط بعدی رو اجرا میکنیم.

اون پرینت یه چیز دلبخواهیه که فقط نشون میده که برنامه داره گوش میده.

اون متغییر r رو یادتون هست؟ خب حالا میریم و زمان مکث رو به یک ثانیه تغییر میدیم. بعد هم خیلی زیبا میریم و صدای souce مون رو میگیریم(اگه یادتون باشه source همون میکروفون بود) و اون رو توی متغیر Audio قرار میدهیم. خب حالا ما تونستیم صدای کاربر رو بگیریم و ذخیره کنیم. ولی هنوز که نفهمیدیم کاربر چی میگه!


قدم چهارم: تشخیص دادن صدا

خب حالا تکه کد زیر رو نگاه کنید.

print("Recognizing...")
query = r.recognize_google(audio, language ='fa-IR')
print(f"User said: {query}\n")

خط اول که فقط داره پرینت میکنه که کد ما داره این صدا رو تحلیل میکنه. بعدش تابع recognize_google رو صدا میزنیم، اون صدایی که ضبط کره بودیم رو میدیم، زبانش رو هم فارسی میکنیم. اگر language رو به تابع ندید، به صورت پیش‌فرض زبان رو انگلیسی درنظر میگیره. خب تبریک میگم! شما تونستید کاری کنید که به معنا واقعی(خب تقریبا!) کامپیوتر زبانتون رو متوجه بشه! کار ما هنوز تموم نشده، چند تا ریز کاری هنوز مونده! بریم سراغ قدم آخر


قدم پنجم: رفع ارور‌ها و جمع‌بندی


برخی اوقات، اگر صدای شما نامفهوم باشه، برنامه به شما ارور میده! اگر هم واضح حرف میزنید و این اتفاق میوفته، حتما کیفیت میگروفونتون بده! بریم که این ارور رو رفع کنیم.

try:
     print("Recognizing...")
     query = r.recognize_google(audio, language ='fa-IR', show_all=False)
     print(f"User said: {query}\n")
except Exception as e:
     print(e)
     print("Unable to Recognize your voice.")

خب این هم یه try except ساده هستش که میگه سعی کن خط 2 تا 5 رو اجرا کنی، اگه ارور داد، برو سراغ دو خط آخر. اون دو خط هم کارش اینه که ارور رو پرینت کنه.


شاید فکر کنید تموم شده ولی هنوز یه کار دیگه مونده :) اونم تابع کردن کدمونه! این کار خیلی بهینه و درسته، وقتی ما کدمون رو به صورت یک تابع ارائه کنیم، میشه هر چند دفعه که دلمون می‌خواد صداش کنیم!

این تابع طبیعتا ورودی ندارد!!


def takeCommand():
     r = sr.Recognizer()
     with sr.Microphone() as source:
          print("Listening...")
          r.pause_threshold = 1
          audio = r.listen(source)
          try:
                print("Recognizing...")
               query = r.recognize_google(audio, language ='fa-IR', show_all=False)
               print(f"User said: {query}\n")
          except Exception as e:
                print(e)
               print("Unable to Recognize your voice.")
               return "None"

          return query


اینم از تابع!! برای صدا زدن تابع هم کافیه . . .

n = takeCommand()

و به همین سادگی، حرفتون رو توی متغیر n ذخیره کردید!

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


و باز هم در نظر داشته باشید که هر چه صداهای اطراف شما کمتر، صدای شما نزدیک‌تر و واضح‌تر باشد، کیفیت خروجی بسیار بسیار بهتر است.


از جمله کار هایی که میشه با این تابع کرد، ساختن یک دستیار صوتی ساده است! مثلا بگی "گوگل رو باز کن" و این کار رو برات انجام بده!

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