برنامه نویسی | آموزش تشخیص گفتار فارسی و تبدیل به متن در پایتون
آموزش تشخیص گفتار فارسی و تبدیل  به متن در پایتون
  • علیرضا
  • ۱۳۹۸-۰۵-۱۱
  • ۸۲۱

آموزش تشخیص گفتار فارسی و تبدیل به متن در پایتون


پروژه‌های بسیار موفقی که در آن‌ها از تشخیص صدا استفاده شده مانند «آمازون الکسا» (Amazon Alexa) اثبات کرده‌اند که وجود درجاتی از پشتیبانی گفتار در فناوری‌های لوازم خانگی، جنبه‌ای حیاتی برای خانه‌ها و شهرهای هوشمند آینده (در حال وقوع ) دارد. به کارگیری بازشناسی گفتار در برنامه‌های کاربردی پایتون، سطحی از تعامل و دسترسی‌پذیری را فراهم می‌کند که فناوری‌های کمی می‌توانند با آن تطبیق پیدا کنند.

تاریخچه

بازشناسی گفتار ریشه در پژوهش‌های انجام شده در «آزمایشگاه‌های بِل» (Bell Labs) در اوایل ۱۹۵۰ دارد. سیستم‌های اولیه محدود به تک سخنران و واژگان محدودی بودند. سیستم‌های بازشناسی گفتار مدرن، راهی طولانی را پس از همتایان باستانی خود طی کرده‌اند تا به نقطه کنونی برسند. این سیستم‌ها می‌توانند گفتار را از چندین سخنران تشخیص دهند و دارای دایره لغات گسترده‌ای در زبان‌های متعدد هستند. اولین مولفه بازشناسی گفتار قطعا «گفتار» است. گفتار باید از صدای فیزیکی با میکروفون به یک سیگنال الکتریکی و سپس با یک «مبدل آنالوگ به دیجیتال» به داده دیجیتال تبدیل شود. پس از دیجیتال شدن گفتار، چندین مدل برای «رونویسی» (transcribe) صدا به متن وجود دارد.

اغلب سیستم‌های بازشناسی گفتار مدرن بر چیزی که «زنجیره پنهان مارکوف» (Hidden Markov Model | HMM) نامیده می‌شود تکیه دارند. این رویکرد بر این فرض استوار است که سیگنال گفتار، هنگامی که در زمان‌بندی‌های (مقیاس‌های زمانی) به اندازه کافی کوچک نمایش داده شود (مثلا ده میلی ثانیه)، می‌تواند به عنوان یک «فرآیند مانا» (Stationary Process) در نظر گرفته شود. فرآیند مانا، فرآیندی است که در آن مشخصه‌های آماری در طول زمان تغییر نمی‌کنند.

بسته های تشخیص گفتار در پایتون

  • apiai
  • assemblyai
  • google-cloud-speech
  • pocketsphinx
  • wit
  • watson-developer-cloud
  • SpeechRecognition

برخی از این بسته‌ها – مانند wit و apiai – ویژگی‌های توکاری مانند «پردازش زبان طبیعی» (Natural Language Processing) برای تعیین نیت سخنران ارائه می‌کنند که از بازشناسی گفتار پایه‌ای کاری فراتر است. دیگر بسته‌ها، مانند google-cloud-speech، صرفا روی تبدیل گفتار به متن تمرکز می‌کنند. اما «SpeechRecognition» بسته‌ای محسوب می‌شود که سهولت کار با آن مثال زدنی و فوق‌العاده به شمار می‌آید. بازشناسی گفتار نیازمند ورودی صوتی است و بسته SpeechRecognition بازیابی این ورودی را بسیار آسان می‌کند. از سوی دیگر، به جای آنکه نیاز به ساخت اسکریپتی برای دسترسی به میکروفون و پردازش فایل صوتی از پایه باشد، SpeechRecognition این کارها را تنها در چند دقیقه انجام می‌دهد.

کتابخانه SpeechRecognition مانند پوششی برای چندین «رابط برنامه‌نویسی نرم‌افزارهای کاربردی» (API) محبوب عمل کرده و بنابراین بسیار انعطاف‌پذیر است. یکی از این موارد «Google Web Speech API» است که از کلید API پیش‌فرض که در کتابخانه SpeechRecognition هاردکد (hard-coded) شده، پشتیبانی می‌کند. این بدین معنا است که کاربر بدون نیاز به ثبت‌نام برای این سرویس می‌تواند از آن استفاده کند.

انعطاف‌پذیری و سهولت کاربری بسته SpeechRecognition آن را به یک انتخاب فوق‌العاده برای هر پروژه پایتونی مبدل ساخته است. اگرچه، پشتیبانی از کلیه ویژگی‌های API‌هایی که این بسته پوششی برای آن‌ها است، تضمین نمی‌شود. کاربر باید زمانی را اختصاص داده و با جست‌و‌جو پیرامون گزینه‌های موجود اطمینان حاصل کند که بسته SpeechRecognition در مساله مورد نظر کاربر کار می‌کند یا خیر. به نظر می‌رسد آنچه پیش‌تر بیان شد توانسته در راستای استفاده از بسته SpeechRecognition متقاعد کننده واقع شود، بنابراین گام بعدی روش نصب این بسته خواهد بود.

SpeechRecognition

SpeechRecognition با پایتون نسخه ۲.۶، ۲.۷ و ۳.۳ به بالا سازگار است اما نیاز به یک سری مراحل نصب افزوده برای پایتون ۲ دارد. در این راهنما، فرض می‌شود که کاربر از پایتون ۳.۳ به بالا استفاده می‌کند. بسته SpeechRecognition را می‌توان از ترمینال با pip نصب کرد.

pip install SpeechRecognition

پس از انجام نصب، باید فرآیند نصب را با باز کردن یک «سشن» (session) مفسر و تایپ دستورات زیر تایید کرد.

import speech_recognition as sr
sr.__version__
'3.8.1'

کلاس Recognizer

همه کارهای جادویی بسته SpeechRecognition با کلاس Recognizer به وقوع می‌پیوندد. البته، هدف اولیه نمونه Recognizer بازشناسی گفتار است. هر «نمونه» (instance) با تنظیمات و کارکردهای متنوعی برای بازشناسی گفتار از یک منبع صوتی همراه است. ساخت یک نمونه Recognizer آسان محسوب می‌شود. در این راستا کافی است در سشن مفسر موجود کد زیر وارد شود.

r = sr.Recognizer()

هر نمونه Recognizer دارای هفت متد برای بازشناسی گفتار از منبع صوتی با استفاده از API‌های متنوع است.

  • recognize_bing(): Microsoft Bing Speech
  • recognize_google(): Google Web Speech API
  • recognize_google_cloud(): Google Cloud Speech
  • recognize_houndify(): Houndify by SoundHound
  • recognize_ibm(): IBM Speech to Text
  • recognize_sphinx(): CMU Sphinx
  • recognize_wit(): Wit.ai

در میان هفت مورد بیان شده در بالا، تنها ()recognize_sphinx به صورت آفلاین با موتور CMU Sphinx کار می‌کند و شش گزینه دیگر نیاز به اتصال اینترنت دارند. بحث کامل پیرامون ویژگی‌ها و مزایای هر API فراتر از موضوع این راهنما است. با توجه به آنکه SpeechRecognition با کلید API پیش‌فرض Google Web Speech API همراه است، می‌توان کار با آن را در لحظه آغاز کرد. به همین دلیل، از Web Speech API در این راهنما استفاده می‌شود. شش API دیگر نیاز به احراز هویت با یک کلید API یا نام‌کاربری/گذرواژه دارند. برای کسب جزئیات بیشتر، باید به مستندات SpeechRecognition رجوع کرد


مطالب مرتبط :


کار با فایل‌های صوتی

پیش از ادامه دادن، نیاز به دانلود یک فایل صوتی وجود دارد. فایلی که در اینجا برای آغاز کار استفاده شده، «harvard.wav»  است. کاربر باید اطمینان حاصل کند که این فایل در دایرکتوری مشابه با آنچه مفسر پایتون در آن اجرا شده قرار دارد. SpeechRecognition با استفاده از کلاس مفید AudioFile کار با فایل‌های صوتی را آسان می‌سازد. این کلاس قابل مقداردهی اولیه با مسیر یک فایل صوتی و فراهم کردن رابط مدیریت زمینه برای خواندن و کار با محتوای این فایل‌های صوتی است.

نوع فایل‌های پشتیبانی شده

در حال حاضر، بسته SpeechRecognition از فرمت‌های فایل زیر پشتیبانی می‌کند.

  • WAV: باید در فرمت‌های PCM/LPCM باشد.
  • AIFF
  • AIFF-C
  • FLAC: باید در فرمت FLAC محلی باشد. OGG-FLAC پشتیبانی نمی‌شود.

استفاده از ()record برای ثبت داده‌ها از یک فایل

کد زیر به منظور پردازش محتوای فایل «pysound.wav» باید در سشن مفسر نوشته شود.

pysound= sr.AudioFile('pysound.wav')
with harvard as source:
    audio = r.record(source)

مدیر زمینه فایل را باز کرده و محتوای آن را می‌خواند، سپس داده‌ها را در یک نمونه AudioFile که source نامیده می‌شود ذخیره می‌کند. پس از آن، متد ()record داده‌ها را از کل یک فایل در یک نمونه AudioData ذخیره می‌کند.

اکنون می‌توان ()recognize_google را در تلاش برای شناسایی هر گفتاری در فایل صوتی فراخوانی (invoke) کرد.

r.recognize_google(audio)
'pysound this sound for play in your test'

ثبت قطعات با offset و duration

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

with pysound as source:
     audio = r.record(source, duration=4)

r.recognize_google(audio)
'the stale smell of old beer lingers'

متد ()record، هنگامی که درون یک بلوک with استفاده می‌شود، همیشه در جریان فایل به جلو حرکت می‌کند. این بدین معنا است که اگر یک بار برای ۴ ثانیه فایل ضبط شود و سپس دوباره برای ۴ ثانیه رکورد کردن آغاز شود، بار دوم چهار ثانیه از صوت پس از اولین چهارثانیه بازگردانده می‌شود.

with pysound as source:
     audio1 = r.record(source, duration=4)
     audio2 = r.record(source, duration=4)

r.recognize_google(audio1)
'the stale smell of old beer lingers'
r.recognize_google(audio2)
'it takes heat to bring out the odor a cold dip'

کار با میکروفون

برای دسترسی به میکروفون با SpeechRecognizer، باید بسته PyAudio را نصب کرد. برای ادامه، سشن کنونی مفسر را بسته و نصب به صورتی که در زیر تشریح شده انجام می‌شود.

نصب PyAudio

pip install pyaudio

کلاس Microphone

اکنون، به جای استفاده از فایل صوتی به عنوان منبع، از میکروفون پیش‌فرض سیستم استفاده می‌شود. می‌توان به این میکروفون از طریق کلاس Microphone دسترسی داشت.

mic = sr.Microphone()

استفاده از ()listen برای ثبت ورودی‌های میکروفون

اکنون که نمونه Microphone آماده است، زمان ثبت ورودی‌ها فرارسیده. درست مانند کلاس AudioFile ، نمونه Microphone نیز مدیر زمینه محسوب می‌شود. می‌توان ورودی‌ها را با میکروفون با استفاده از متد ()listen از کلاس Recognizer درون بلوک with ثبت کرد. این روش یک منبع صوتی را به عنوان اولین آرگومان خود دریافت کرده و ورودی را از منبع تا زمانی که سکوت تشخیص داده شود دریافت می‌کند.

with mic as source:
     audio = r.listen(source)

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

import speech_recognition as sr

r=sr.Recognizer()
mic = sr.Microphone()

with mic as source:
     audio = r.listen(source)

text = r.recognize_google(audio, language='fa-IR')# language  set farsi :)
print(text)

با نظرات خود ما را در جهت بهبود مطالب یاری کنید

منبع : realpython

علیرضا

Alireza.kh

نظر شما در مورد این پست چیه؟!