021-71053903 [email protected] پشتیبانی از شنبه تا چهارشنبه ساعت 9 الی 16
  • 5

تشخیص صدا (Speech Recognition) در پایتون

با سلام خدمت تمامی شما مخاطبان خوب وبسایت پایتونی ها با یک مقاله آموزشی دیگر در خدمت شما دانشپذیران عزیز هستیم از سری مقالات تخصصی این وبلاگ.

در مقاله می خواهیم با استفاده از زبان برنامه نویسی پایتون اقدام به تبدیل صدا و سیگنال صوتی به متن های دیداری کنیم.

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

در نتیجه، ما نیازی به ساخت هیچ مدل یادگیری ماشینی از ابتدا نداریم، این کتابخانه بسته‌بندی‌های مناسبی را برای انواع APIهای شناخته‌شده تشخیص گفتار عمومی (مانند Google Cloud Speech API، IBM Speech To Text و غیره) در اختیار ما قرار می‌دهد.

خوب، بیایید شروع کنیم و کتابخانه را با استفاده از pip نصب کنیم:

pip3 install SpeechRecognition pydub

خوب، یک فایل پایتون جدید باز کنید و آن را وارد کنید:

import speech_recognition as sr

 

نکته خوب در مورد این کتابخانه این است که از چندین موتور تشخیص پشتیبانی می کند:

  • CMU Sphinx (آفلاین)
  • تشخیص گفتار گوگل
    Google Cloud Speech API
  • Wit.ai
  • تشخیص صدای مایکروسافت بینگ
  • Houndify API
  • IBM Speech To Text
  • تشخیص کلمه کلیدی Snowboy (آفلاین)

 

ما در اینجا از Google Speech Recognition استفاده می کنیم، زیرا ساده است و به هیچ کلید API نیاز ندارد.

 

خواندن از روی یک فایل در حافظه

مطمئن شوید که یک فایل صوتی در دایرکتوری فعلی دارید که حاوی گفتار انگلیسی است (اگر می خواهید همراه من باشید، فایل صوتی را از اینجا دریافت کنید):

filename = "16-122828-0002.wav"

این فایل از مجموعه داده LibriSpeech گرفته شده است، اما شما می توانید از هر فایل WAV صوتی که می خواهید استفاده کنید، فقط نام فایل را تغییر دهید، اجازه دهید تشخیص دهنده گفتار خود را مقداردهی اولیه کنیم:

# initialize the recognizer
r = sr.Recognizer()

کد زیر مسئول بارگذاری فایل صوتی و تبدیل گفتار به متن با استفاده از تشخیص گفتار گوگل است:

# open the file
with sr.AudioFile(filename) as source:
    # listen for the data (load audio to memory)
    audio_data = r.record(source)
    # recognize (convert from speech to text)
    text = r.recognize_google(audio_data)
    print(text)

 

این کار چند ثانیه طول می کشد، زیرا فایل را در گوگل آپلود می کند و خروجی را می گیرد، نتیجه من این است:

I believe you're just talking nonsense

خواندن فایل های صوتی بزرگ

اگر می‌خواهید تشخیص گفتار یک فایل صوتی طولانی را انجام دهید، تابع زیر به خوبی این کار را انجام می‌دهد:

# importing libraries 
import speech_recognition as sr 
import os 
from pydub import AudioSegment
from pydub.silence import split_on_silence

# create a speech recognition object
r = sr.Recognizer()

# a function that splits the audio file into chunks
# and applies speech recognition
def get_large_audio_transcription(path):
    """
    Splitting the large audio file into chunks
    and apply speech recognition on each of these chunks
    """
    # open the audio file using pydub
    sound = AudioSegment.from_wav(path)  
    # split audio sound where silence is 700 miliseconds or more and get chunks
    chunks = split_on_silence(sound,
        # experiment with this value for your target audio file
        min_silence_len = 500,
        # adjust this per requirement
        silence_thresh = sound.dBFS-14,
        # keep the silence for 1 second, adjustable as well
        keep_silence=500,
    )
    folder_name = "audio-chunks"
    # create a directory to store the audio chunks
    if not os.path.isdir(folder_name):
        os.mkdir(folder_name)
    whole_text = ""
    # process each chunk 
    for i, audio_chunk in enumerate(chunks, start=1):
        # export audio chunk and save it in
        # the `folder_name` directory.
        chunk_filename = os.path.join(folder_name, f"chunk{i}.wav")
        audio_chunk.export(chunk_filename, format="wav")
        # recognize the chunk
        with sr.AudioFile(chunk_filename) as source:
            audio_listened = r.record(source)
            # try converting it to text
            try:
                text = r.recognize_google(audio_listened)
            except sr.UnknownValueError as e:
                print("Error:", str(e))
            else:
                text = f"{text.capitalize()}. "
                print(chunk_filename, ":", text)
                whole_text += text
    # return the text for all chunks detected
    return whole_text

توجه: برای اینکه کد بالا کار کند باید Pydub را با استفاده از pip نصب کنید.

 

تابع فوق از تابع split_on_silence() از ماژول pydub.silence استفاده می کند تا داده های صوتی را در حالت سکوت به تکه هایی تقسیم کند.

پارامتر min_silence_len حداقل طول سکوتی است که برای تقسیم استفاده می شود.

silence_thresh آستانه‌ای است که در آن هر چیزی ساکت‌تر از این به عنوان سکوت در نظر گرفته می‌شود، من آن را روی میانگین dBFS منهای 14 قرار داده‌ام، آرگومان keep_silence مقدار سکوتی است که در ابتدا و انتهای هر قطعه شناسایی شده در میلی‌ثانیه است.

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

پس از آن، ما روی همه تکه‌ها تکرار می‌کنیم و هر صدای گفتار را به متن تبدیل می‌کنیم، و سپس آنها را به طور کلی جمع می‌کنیم، در اینجا یک نمونه اجرا وجود دارد:

path = "7601-291468-0006.wav"
print("\nFull text:", get_large_audio_transcription(path))

توجه: می توانید فایل 7601-291468-0006.wav را از اینجا دریافت کنید.

خروجی:

audio-chunks\chunk1.wav : His abode which you had fixed in a bowery or country seat. 
audio-chunks\chunk2.wav : At a short distance from the city. 
audio-chunks\chunk3.wav : Just at what is now called dutch street. 
audio-chunks\chunk4.wav : Sooner bounded with proofs of his ingenuity. 
audio-chunks\chunk5.wav : Patent smokejacks. 
audio-chunks\chunk6.wav : It required a horse to work some. 
audio-chunks\chunk7.wav : Dutch oven roasted meat without fire. 
audio-chunks\chunk8.wav : Carts that went before the horses. 
audio-chunks\chunk9.wav : Weather cox that turned against the wind and other wrongheaded contrivances. 
audio-chunks\chunk10.wav : So just understand can found it all beholders. 

Full text: His abode which you had fixed in a bowery or country seat. At a short distance from the city. Just at what is now called dutch street. Sooner bounded with proofs of his ingenuity. Patent smokejacks. It required a horse to work some. Dutch oven roasted meat without fire. Carts that went before the horses. Weather cox that turned against the wind and other wrongheaded contrivances. So just understand can found it all beholders.

 

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

این نیاز به نصب PyAudio در دستگاه شما دارد، در اینجا فرآیند نصب بسته به سیستم عامل شما است:

ویندوز

شما فقط می توانید آن را با پیپ نصب کنید:

pip3 install pyaudio

 

لینوکس

ابتدا باید وابستگی ها را نصب کنید:

sudo apt-get install python-pyaudio python3-pyaudio
pip3 install pyaudio

 

سیستم عامل مکینتاش

ابتدا باید portaudio را نصب کنید، سپس می توانید آن را با پیپ نصب کنید:

brew install portaudio
pip3 install pyaudio

 

حالا بیایید از میکروفون خود برای تبدیل گفتار خود استفاده کنیم:

with sr.Microphone() as source:
    # read the audio data from the default microphone
    audio_data = r.record(source, duration=5)
    print("Recognizing...")
    # convert speech to text
    text = r.recognize_google(audio_data)
    print(text)

 

این صدا به مدت 5 ثانیه از میکروفون شما شنیده می شود و سپس سعی کنید آن گفتار را به متن تبدیل کنید!

تقریباً شبیه کد قبلی است، اما ما در اینجا از شی ()Microphone برای خواندن صدا از میکروفون پیش فرض استفاده می کنیم و سپس از پارامتر duration در تابع record() استفاده می کنیم تا خواندن بعد از 5 ثانیه متوقف شود و سپس آپلود شود. داده های صوتی را به گوگل ارسال کنید تا متن خروجی را دریافت کنید.

همچنین می توانید از پارامتر offset در تابع record() برای شروع ضبط پس از افست ثانیه استفاده کنید.

همچنین، می توانید زبان های مختلف را با ارسال پارامتر زبان به تابع ()شناسایی_google تشخیص دهید. به عنوان مثال، اگر می خواهید گفتار اسپانیایی را تشخیص دهید، از موارد زیر استفاده کنید:

text = r.recognize_google(audio_data, language="es-ES")

زبان های پشتیبانی شده را در این پاسخ StackOverflow بررسی کنید.

 

نتیجه گیری

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

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

 

 

دانلود باکس

محمدرضا حسنی

224 مطلب منتشر شده

دانش آموخته رشته فناوری اطلاعات / موسس پایتونی ها

درباره این مطلب نظر دهید !

مطالب پرمخاطب پایتونی ها

متاسفانه موردی یافت نشد ...

محصولات فروش پایتونی ها

%60
تخفیف

آموزش فیگما (Figma)

30,000 تومان
3
%69
تخفیف

آموزش برنامه نویسی پایتون

35,000 تومان
2