You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/ml/6-consumer/lessons/1-speech-recognition/pi-audio.md

17 KiB

ഓഡിയോ പിടിക്കുക - Raspberry Pi

പാഠത്തിന്റെ ഈ ഭാഗത്തിൽ, നിങ്ങളുടെ Raspberry Pi-യിൽ ഓഡിയോ പിടിക്കുന്നതിനുള്ള കോഡ് നിങ്ങൾ എഴുതി തുടങ്ങും. ഓഡിയോ പിടിക്കൽ ഒരു ബട്ടൺ നിയന്ത്രിക്കും.

ഹാർഡ്‌വെയർ

Raspberry Pi-ക്ക് ഓഡിയോ പിടിക്കൽ നിയന്ത്രിക്കാൻ ഒരു ബട്ടൺ ആവശ്യമുണ്ട്.

നിങ്ങൾ ഉപയോഗിക്കുന്ന ബട്ടൺ ഒരു Grove ബട്ടൺ ആണ്. ഇത് സിഗ്നൽ ഓൺ അല്ലെങ്കിൽ ഓഫ് ആക്കുന്ന ഡിജിറ്റൽ സെൻസറാണ്. ഈ ബട്ടണുകൾ അമർത്തിയപ്പോൾ ഉയർന്ന സിഗ്നൽ അയയ്ക്കാനും, അമർത്താതിരിക്കുന്നപ്പോൾ താഴ്ന്ന സിഗ്നൽ അയയ്ക്കാനും, അല്ലെങ്കിൽ അമർത്തിയപ്പോൾ താഴ്ന്നും അമർത്താതitiroപ്പുമ്പോൾ ഉയർന്നും അയയ്ക്കാനുമാകുന്നതായി ക്രമീകരിക്കാവുന്നതാണ്.

നിങ്ങൾ ReSpeaker 2-Mics Pi HAT മൈക്രോഫോൺ ആയി ഉപയോഗിച്ചാൽ, ഇതിനായി ബട്ടൺ കണക്ട് ചെയ്യേണ്ടതില്ല, ഈ ഹാറ്റിൽ ബട്ടൺ ഇതിനകം തന്നെ ലയിച്ചിരിക്കുന്നു. അടുത്ത വിഭാഗത്തിലേക്ക് കടക്കുക.

ബട്ടൺ കണക്ട് ചെയ്യുക

ബട്ടൺ Grove ബേസ് ഹാറ്റിൽ കണക്ട് ചെയ്യാം.

ടാസ്ക് - ബട്ടൺ കണക്ട് ചെയ്യുക

A grove button

  1. Grove കേബിളിന്റെ ഒരു端 ബട്ടൺ മോഡ്യൂളിലെ സോകറ്റിൽ ഇട്ടിടുക. ഇത് ഒരു ദിശയിൽ മാത്രമേ നൽകുകയുള്ളു.

  2. Raspberry Pi ഓഫ് ചെയ്തിരിക്കുമ്പോൾ, Grove കേബിളിന്റെ മറുവശത്ത് Grove ബേസ് ഹാറ്റിൽ Pi-ക്കു കണക്ട് ചെയ്തിട്ടുള്ള ഡിജിറ്റൽ സോകറ്റായ D5 എന്ന ലേബലുള്ള സოკറ്റിൽ കണക്ട് ചെയ്യുക. GPIO പിനുകളുടെ അടുത്തുള്ള സോകറ്റുകളുടെ പക്കൽ ഇടതുവശത്തു നിന്നും രണ്ടാമതാണ് ഈ സോക്കറ്റ്.

The grove button connected to socket D5

ഓഡിയോ പിടിക്കുക

Python കോഡ് ഉപയോഗിച്ച് മൈക്രോഫോണിൽ നിന്ന് ഓഡിയോ പിടിക്കാം.

ടാസ്ക് - ഓഡിയോ പിടിക്കുക

  1. Pi പവർ അപ്പ് ചെയ്ത് ബൂട്ടു ചെയ്യുന്നത് കാത്തിരിക്കുക

  2. VS Code ആരംഭിക്കുക, പിസിയിൽ നേരിട്ട് അല്ലെങ്കിൽ Remote SSH എക്സ്റ്റൻഷൻ വഴി കണക്ട് ചെയ്ത്.

  3. PyAudio പിപ്പ് പാക്കേജിൽ ഓഡിയോ റെക്കോർഡ് ചെയ്യാനും പ്ലേ ചെയ്യാനുമുള്ള ഫംഗ്ഷനുകൾ ഉണ്ട്. ഈ പാക്കേജ് പ്രവർത്തിക്കാൻ ചില ഓഡിയോ ലൈബ്രറികളേ ആദ്യം ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതാണ്. ടേർമിനലിൽ താഴെ പറയുന്ന കമാൻഡുകൾ പ്രവർത്തിപ്പിച്ച് ഇൻസ്റ്റാൾ ചെയ്യുക:

    sudo apt update
    sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes 
    
  4. PyAudio പിപ്പ് പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുക.

    pip3 install pyaudio
    
  5. smart-timer എന്ന പുതിയ ഫോൾഡർ സൃഷ്ടിച്ച്, അതില്‍ app.py എന്ന ഫയൽ ചേർക്കുക.

  6. ഈ ഫയലിന്റെ മുകളിൽ താഴെയുള്ള ഇമ്പോർട്ടുകൾ ചേർക്കുക:

    import io
    import pyaudio
    import time
    import wave
    
    from grove.factory import Factory
    

    ഇത് pyaudio മോഡ്യൂൾ, വേവ് ഫയലുകൾ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ചില സ്റ്റാൻഡേർഡ് Python മോഡ്യൂളുകൾ, കൂടാതെ ബട്ടൺ ക്ലാസ് സൃഷ്ടിക്കാൻ grove.factory മോഡ്യൂൾ ഇമ്പോർട്ട് ചെയ്യുന്നു.

  7. ഇതിന് കീഴിൽ Grove ബട്ടൺ സൃഷ്ടിക്കാൻ കോഡ് ചേർക്കുക.

    ReSpeaker 2-Mics Pi HAT ഉപയോഗിച്ചാൽ, താഴെ കാണുന്ന കോഡ് ഉപയോഗിക്കുക:

    # ReSpeaker 2-മൈക്കുകൾ Pi HAT ലെ ബട്ടൺ
    button = Factory.getButton("GPIO-LOW", 17)
    

    ഇത് ReSpeaker 2-Mics Pi HAT ൽ കണക്ട് ചെയ്തിരിക്കുന്ന D17 പോർട്ടിൽ ബട്ടൺ സൃഷ്ടിക്കുന്നു. ഈ ബട്ടൺ അമർത്തിയപ്പോൾ താഴ്ന്ന സിഗ്നൽ അയയ്ക്കപ്പെടുന്നതായി ക്രമീകരിച്ചിരിക്കുന്നു.

    ReSpeaker 2-Mics Pi HAT ഉപയോഗിക്കാതിരിക്കുന്നുവെങ്കിൽ, Grove ബട്ടൺ ബേസ് ഹാറ്റിൽ കണക്ട് ചെയ്ത് താഴെ കാണുന്ന കോഡ് ഉപയോഗിക്കുക.

    button = Factory.getButton("GPIO-HIGH", 5)
    

    ഇത് D5 പോർട്ടിൽ ഒരു ബട്ടൺ സൃഷ്ടിക്കുന്നു, അമർത്തിയപ്പോൾ ഉയർന്ന സിഗ്നൽ അയയ്ക്കുന്നതായി ക്രമീകരിച്ചിരിക്കുന്നു.

  8. ഇതിന് കീഴിൽ PyAudio ക്ലാസിന്റെ ഒരു ഇൻസ്റ്റാൻസ് സൃഷ്ടിച്ച് ഓഡിയോ കൈകാര്യം ചെയ്യുക:

    audio = pyaudio.PyAudio()
    
  9. മൈക്രോഫോൺക്കും സ്പീക്കറിനും ഹാർഡ്‌വെയർ കാർഡ് നമ്പർ പ്രഖ്യാപിക്കുക. ഇത് നിങ്ങൾ മുമ്പിൽ arecord -l , aplay -l എന്നിവ പ്രവർത്തിപ്പിച്ച് കണ്ടെത്തിയ കാർഡ് നമ്പർ ആയിരിക്കും.

    microphone_card_number = <microphone card number>
    speaker_card_number = <speaker card number>
    

    <microphone card number> എന്നെ നിങ്ങളുടെ മൈക്രോഫോൺ കാർഡ് നമ്പറോടു മാറ്റുക.

    <speaker card number> എന്നെ നിങ്ങളുടെ സ്പീക്കർ കാർഡ് നമ്പറോടു മാറ്റുക, ഇത് alsa.conf ഫയലിൽ നിങ്ങൾ സജ്ജമാക്കിയ നമ്പറും ആകും.

  10. ഇതിന് കീഴിൽ ഓഡിയോ പിടിക്കാനും പ്ലേ ചെയ്യാനും ഉപയോഗിക്കുന്ന സാമ്പിൾ റേറ്റ് പ്രഖ്യാപിക്കുക. ഇത് ഹാർഡ്‌വെയർ അനുസരിച്ച് മാറ്റേണ്ടിവരാം.

    rate = 48000 #48കേഎച്ച്ജി
    

    ഈ കോഡ് പിന്നീട് പ്രവർത്തിക്കുമ്പോൾ സാമ്പിൾ റേറ്റ് പിശകുകൾ ലഭിച്ചാൽ, ഈ വില 44100 അല്ലെങ്കിൽ 16000 ആക്കി മാറ്റുക. കൂടിയ വിലക്ക് മെച്ചപ്പെട്ട സൌണ്ട് ഗുണമേൻമയുണ്ട്.

  11. ഇതിന് താഴെ capture_audio എന്ന് പുതിയ ഫംഗ്ഷൻ സൃഷ്ടിക്കൂ. ഇത് മൈക്രോഫോണിൽ നിന്ന് ഓഡിയോ പിടിക്കാൻ വിളിക്കപ്പെടും:

    def capture_audio():
    
  12. ഈ ഫംഗ്ഷനിന്റെ ഉള്ളിൽ ഓഡിയോ പിടിക്കാൻ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:

    stream = audio.open(format = pyaudio.paInt16,
                        rate = rate,
                        channels = 1, 
                        input_device_index = microphone_card_number,
                        input = True,
                        frames_per_buffer = 4096)
    
    frames = []
    
    while button.is_pressed():
        frames.append(stream.read(4096))
    
    stream.stop_stream()
    stream.close()
    

    ഈ കോഡ് PyAudio ഒബ്ജക്റ്റ് ഉപയോഗിച്ച് ഓഡിയോ ഇൻപുട്ട് സ്ട്രീം തുറക്കുന്നു. 16KHz വേഗതയിൽ, 4096 ബൈറ്റുള്ള ബഫറുകളിൽ ആഡ് ചെയ്ത് മൈക്രോഫോണിൽ നിന്ന് ഓഡിയോ പിടിക്കും.

    Grove ബട്ടൺ അമർത്തിയിരിക്കെ ഈ 4096 ബൈറ്റ് ബഫറുകൾ ഒരു ആറക്കയിലേക്ക് വായിക്കുന്നു, ബട്ടൺ വിട്ടപ്പോൾ സ്ട്രീം നിർത്തുകയും അടയ്ക്കുകയും ചെയ്യും.

    💁 നിങ്ങൾക്ക് open മെത്തഡിന് നൽകിയ ഓപ്ഷൻസുകൾ PyAudio ഡോക്യുമെന്റേഷനിൽ കൂടുതൽ വായിക്കാം.

    ബട്ടൺ വിട്ടു കഴിഞ്ഞാൽ സ്ട്രീം നിർത്തുകയും അടയ്ക്കുകയും ചെയ്യും.

  13. ഈ ഫംഗ്ഷന്റെ അവസാനം താഴെ കാണുന്ന കോഡ് ചേർക്കുക:

    wav_buffer = io.BytesIO()
    with wave.open(wav_buffer, 'wb') as wavefile:
        wavefile.setnchannels(1)
        wavefile.setsampwidth(audio.get_sample_size(pyaudio.paInt16))
        wavefile.setframerate(rate)
        wavefile.writeframes(b''.join(frames))
        wav_buffer.seek(0)
    
    return wav_buffer
    

    ഈ കോഡ് ഒരു ബൈനറി ബഫർ സൃഷ്ടിച്ചും പിടിച്ചെടുത്ത എല്ലാ ഓഡിയോ WAV ഫയൽ ഫോർമാറ്റിൽ അതിൽ എഴുതി സംഭരിച്ചും ചെയ്യും. സ്ടാൻഡേർഡ് അന്കംപ്രസ്സ് ചെയ്ത ഓഡിയോ ഫയൽ എഴുതാനുള്ള മാർഗമാണ് ഇത്. ശേഷം ബഫർ തിരിച്ചുകൊടുക്കുന്നു.

  14. ഓഡിയോ ബഫർ പ്ലേ ചെയ്യാൻ താഴെയുള്ള play_audio ഫംഗ്ഷൻ ചേർക്കുക:

    def play_audio(buffer):
        stream = audio.open(format = pyaudio.paInt16,
                            rate = rate,
                            channels = 1,
                            output_device_index = speaker_card_number,
                            output = True)
    
        with wave.open(buffer, 'rb') as wf:
            data = wf.readframes(4096)
    
            while len(data) > 0:
                stream.write(data)
                data = wf.readframes(4096)
    
            stream.close()
    

    ഈ ഫംഗ്ഷൻ മറ്റൊരു ഓഡിയോ സ്ട്രീം തുറക്കുന്നു, പ്ലേ എന്ന മതൃഖണ്ഡം പ്രയോഗിച്ച്. ഇൻപുട്ടും പ്ലേ ആയും ഒരേ ക്രമീകരണങ്ങൾ ഉപയോഗിക്കുന്നു. ബഫർ വേവ് ഫയൽ ആയി തുറന്ന് 4096 ബൈറ്റ് പാത്രങ്ങളിൽ പ്ലേ സ്ട്രീത്തിലേക്ക് എഴുതി ഓഡിയോ പ്ലേ ചെയ്യും. അവസാനം സ്ട്രീം അടയ്ക്കും.

  15. ബട്ടൺ അമർത്തിയശേഷം ഓഡിയോ പിടിച്ച് പ്ലേ ചെയ്യുന്നതുവരെ ലൂപ്പ് ചെയ്യാൻ താഴെയിരിക്കുന്ന കോഡ് ചേർക്കുക:

    while True:
        while not button.is_pressed():
            time.sleep(.1)
    
        buffer = capture_audio()
        play_audio(buffer)
    
  16. കോഡ് പ്രവര്‍ത്തിപ്പിക്കുക. ബട്ടൺ അമർത്തി, മൈക്രോഫോണിലേക്ക് സംസാരിക്കുക. തീർന്നപ്പോള്‍ ബട്ടൺ വിടുക, റെക്കോർഡിങ് കേൾക്കാനിടയാകും.

    PyAudio ഇൻസ്റ്റൻസ് സൃഷ്ടിക്കുമ്പോൾ ചില ALSA പിശകുകൾ കാണാം. ഇത് നിങ്ങളുടെ Pi-യിലെ ഓഡിയോ ഉപകരണങ്ങളുമായി ബന്ധപ്പെട്ട കോൺഫിഗറേഷൻ പ്രശ്നമാണ്. നിങ്ങൾക്ക് അവ പര്യവേക്ഷണം ചെയ്യേണ്ടതില്ല.

    pi@raspberrypi:~/smart-timer $ python3 app.py 
    ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.front
    ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
    ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
    ALSA lib pcm.c:2565:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
    

    താഴെ പറയുന്ന പിശക് ലഭിക്കുകയാണെങ്കിൽ:

    OSError: [Errno -9997] Invalid sample rate
    

    rate-നെ 44100 അല്ലെങ്കിൽ 16000 ആക്കി മാറ്റുക.

💁 ഈ കോഡ് code-record/pi ഫോൾഡറിൽ ലഭ്യമാണ്.

😀 നിങ്ങളുടെ ഓഡിയോ റെക്കോർഡിംഗ് പ്രോഗ്രാം വിജയകരമായി തീർന്നു!


പരിഭാഷാ വെളുപ്പിക്കൽ: ഈ രേഖ AI പരിഭാഷാ സേവനം Co-op Translator ഉപയോഗിച്ച് പരിഭാഷ ചെയ്തത് ആണ്. നാം കൃത്യതയ്ക്കായി പരിശ്രമിക്കുന്നതിനുപേരും, സ്വയമേവ നടത്തുന്ന പരിഭാഷകളിൽ ചില പിശകുകളോ അശുദ്ധികളോ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. മൗലിക രേഖയുടെ സ്വതന്ത്ര ഭാഷയാണ് അവകാശവാനായ ഉറവിടം എന്ന് കരുതണം. നിർണ്ണായകമായ വിവരങ്ങൾക്ക് പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശിപാർശ ചെയ്യപ്പെടുന്നു. ഈ പരിഭാഷയുടെ ഉപയോഗത്തിൽ ഉണ്ടായ ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കും തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കും നാം ഉത്തരവാദിത്വം അനുവദിക്കുകയില്ല.