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

220 lines
17 KiB

# ഓഡിയോ പിടിക്കുക - Raspberry Pi
പാഠത്തിന്റെ ഈ ഭാഗത്തിൽ, നിങ്ങളുടെ Raspberry Pi-യിൽ ഓഡിയോ പിടിക്കുന്നതിനുള്ള കോഡ് നിങ്ങൾ എഴുതി തുടങ്ങും. ഓഡിയോ പിടിക്കൽ ഒരു ബട്ടൺ നിയന്ത്രിക്കും.
## ഹാർഡ്‌വെയർ
Raspberry Pi-ക്ക് ഓഡിയോ പിടിക്കൽ നിയന്ത്രിക്കാൻ ഒരു ബട്ടൺ ആവശ്യമുണ്ട്.
നിങ്ങൾ ഉപയോഗിക്കുന്ന ബട്ടൺ ഒരു Grove ബട്ടൺ ആണ്. ഇത് സിഗ്നൽ ഓൺ അല്ലെങ്കിൽ ഓഫ് ആക്കുന്ന ഡിജിറ്റൽ സെൻസറാണ്. ഈ ബട്ടണുകൾ അമർത്തിയപ്പോൾ ഉയർന്ന സിഗ്നൽ അയയ്ക്കാനും, അമർത്താതിരിക്കുന്നപ്പോൾ താഴ്ന്ന സിഗ്നൽ അയയ്ക്കാനും, അല്ലെങ്കിൽ അമർത്തിയപ്പോൾ താഴ്ന്നും അമർത്താതitiroപ്പുമ്പോൾ ഉയർന്നും അയയ്ക്കാനുമാകുന്നതായി ക്രമീകരിക്കാവുന്നതാണ്.
നിങ്ങൾ ReSpeaker 2-Mics Pi HAT മൈക്രോഫോൺ ആയി ഉപയോഗിച്ചാൽ, ഇതിനായി ബട്ടൺ കണക്ട് ചെയ്യേണ്ടതില്ല, ഈ ഹാറ്റിൽ ബട്ടൺ ഇതിനകം തന്നെ ലയിച്ചിരിക്കുന്നു. അടുത്ത വിഭാഗത്തിലേക്ക് കടക്കുക.
### ബട്ടൺ കണക്ട് ചെയ്യുക
ബട്ടൺ Grove ബേസ് ഹാറ്റിൽ കണക്ട് ചെയ്യാം.
#### ടാസ്ക് - ബട്ടൺ കണക്ട് ചെയ്യുക
![A grove button](../../../../../translated_images/ml/grove-button.a70cfbb809a85636.webp)
1. Grove കേബിളിന്റെ ഒരു端 ബട്ടൺ മോഡ്യൂളിലെ സോകറ്റിൽ ഇട്ടിടുക. ഇത് ഒരു ദിശയിൽ മാത്രമേ നൽകുകയുള്ളു.
1. Raspberry Pi ഓഫ് ചെയ്തിരിക്കുമ്പോൾ, Grove കേബിളിന്റെ മറുവശത്ത് Grove ബേസ് ഹാറ്റിൽ Pi-ക്കു കണക്ട് ചെയ്തിട്ടുള്ള ഡിജിറ്റൽ സോകറ്റായ **D5** എന്ന ലേബലുള്ള സოკറ്റിൽ കണക്ട് ചെയ്യുക. GPIO പിനുകളുടെ അടുത്തുള്ള സോകറ്റുകളുടെ പക്കൽ ഇടതുവശത്തു നിന്നും രണ്ടാമതാണ് ഈ സോക്കറ്റ്.
![The grove button connected to socket D5](../../../../../translated_images/ml/pi-button.c7a1a4f55943341c.webp)
## ഓഡിയോ പിടിക്കുക
Python കോഡ് ഉപയോഗിച്ച് മൈക്രോഫോണിൽ നിന്ന് ഓഡിയോ പിടിക്കാം.
### ടാസ്ക് - ഓഡിയോ പിടിക്കുക
1. Pi പവർ അപ്പ് ചെയ്ത് ബൂട്ടു ചെയ്യുന്നത് കാത്തിരിക്കുക
1. VS Code ആരംഭിക്കുക, പിസിയിൽ നേരിട്ട് അല്ലെങ്കിൽ Remote SSH എക്സ്റ്റൻഷൻ വഴി കണക്ട് ചെയ്ത്.
1. PyAudio പിപ്പ് പാക്കേജിൽ ഓഡിയോ റെക്കോർഡ് ചെയ്യാനും പ്ലേ ചെയ്യാനുമുള്ള ഫംഗ്ഷനുകൾ ഉണ്ട്. ഈ പാക്കേജ് പ്രവർത്തിക്കാൻ ചില ഓഡിയോ ലൈബ്രറികളേ ആദ്യം ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതാണ്. ടേർമിനലിൽ താഴെ പറയുന്ന കമാൻഡുകൾ പ്രവർത്തിപ്പിച്ച് ഇൻസ്റ്റാൾ ചെയ്യുക:
```sh
sudo apt update
sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes
```
1. PyAudio പിപ്പ് പാക്കേജ് ഇൻസ്റ്റാൾ ചെയ്യുക.
```sh
pip3 install pyaudio
```
1. `smart-timer` എന്ന പുതിയ ഫോൾഡർ സൃഷ്ടിച്ച്, അതില്‍ `app.py` എന്ന ഫയൽ ചേർക്കുക.
1. ഈ ഫയലിന്റെ മുകളിൽ താഴെയുള്ള ഇമ്പോർട്ടുകൾ ചേർക്കുക:
```python
import io
import pyaudio
import time
import wave
from grove.factory import Factory
```
ഇത് `pyaudio` മോഡ്യൂൾ, വേവ് ഫയലുകൾ കൈകാര്യം ചെയ്യുന്നതിനുള്ള ചില സ്റ്റാൻഡേർഡ് Python മോഡ്യൂളുകൾ, കൂടാതെ ബട്ടൺ ക്ലാസ് സൃഷ്ടിക്കാൻ `grove.factory` മോഡ്യൂൾ ഇമ്പോർട്ട് ചെയ്യുന്നു.
1. ഇതിന് കീഴിൽ Grove ബട്ടൺ സൃഷ്ടിക്കാൻ കോഡ് ചേർക്കുക.
ReSpeaker 2-Mics Pi HAT ഉപയോഗിച്ചാൽ, താഴെ കാണുന്ന കോഡ് ഉപയോഗിക്കുക:
```python
# ReSpeaker 2-മൈക്കുകൾ Pi HAT ലെ ബട്ടൺ
button = Factory.getButton("GPIO-LOW", 17)
```
ഇത് ReSpeaker 2-Mics Pi HAT ൽ കണക്ട് ചെയ്തിരിക്കുന്ന **D17** പോർട്ടിൽ ബട്ടൺ സൃഷ്ടിക്കുന്നു. ഈ ബട്ടൺ അമർത്തിയപ്പോൾ താഴ്ന്ന സിഗ്നൽ അയയ്ക്കപ്പെടുന്നതായി ക്രമീകരിച്ചിരിക്കുന്നു.
ReSpeaker 2-Mics Pi HAT ഉപയോഗിക്കാതിരിക്കുന്നുവെങ്കിൽ, Grove ബട്ടൺ ബേസ് ഹാറ്റിൽ കണക്ട് ചെയ്ത് താഴെ കാണുന്ന കോഡ് ഉപയോഗിക്കുക.
```python
button = Factory.getButton("GPIO-HIGH", 5)
```
ഇത് **D5** പോർട്ടിൽ ഒരു ബട്ടൺ സൃഷ്ടിക്കുന്നു, അമർത്തിയപ്പോൾ ഉയർന്ന സിഗ്നൽ അയയ്ക്കുന്നതായി ക്രമീകരിച്ചിരിക്കുന്നു.
1. ഇതിന് കീഴിൽ PyAudio ക്ലാസിന്റെ ഒരു ഇൻസ്റ്റാൻസ് സൃഷ്ടിച്ച് ഓഡിയോ കൈകാര്യം ചെയ്യുക:
```python
audio = pyaudio.PyAudio()
```
1. മൈക്രോഫോൺക്കും സ്പീക്കറിനും ഹാർഡ്‌വെയർ കാർഡ് നമ്പർ പ്രഖ്യാപിക്കുക. ഇത് നിങ്ങൾ മുമ്പിൽ `arecord -l` , `aplay -l` എന്നിവ പ്രവർത്തിപ്പിച്ച് കണ്ടെത്തിയ കാർഡ് നമ്പർ ആയിരിക്കും.
```python
microphone_card_number = <microphone card number>
speaker_card_number = <speaker card number>
```
`<microphone card number>` എന്നെ നിങ്ങളുടെ മൈക്രോഫോൺ കാർഡ് നമ്പറോടു മാറ്റുക.
`<speaker card number>` എന്നെ നിങ്ങളുടെ സ്പീക്കർ കാർഡ് നമ്പറോടു മാറ്റുക, ഇത് `alsa.conf` ഫയലിൽ നിങ്ങൾ സജ്ജമാക്കിയ നമ്പറും ആകും.
1. ഇതിന് കീഴിൽ ഓഡിയോ പിടിക്കാനും പ്ലേ ചെയ്യാനും ഉപയോഗിക്കുന്ന സാമ്പിൾ റേറ്റ് പ്രഖ്യാപിക്കുക. ഇത് ഹാർഡ്‌വെയർ അനുസരിച്ച് മാറ്റേണ്ടിവരാം.
```python
rate = 48000 #48കേഎച്ച്ജി
```
ഈ കോഡ് പിന്നീട് പ്രവർത്തിക്കുമ്പോൾ സാമ്പിൾ റേറ്റ് പിശകുകൾ ലഭിച്ചാൽ, ഈ വില `44100` അല്ലെങ്കിൽ `16000` ആക്കി മാറ്റുക. കൂടിയ വിലക്ക് മെച്ചപ്പെട്ട സൌണ്ട് ഗുണമേൻമയുണ്ട്.
1. ഇതിന് താഴെ `capture_audio` എന്ന് പുതിയ ഫംഗ്ഷൻ സൃഷ്ടിക്കൂ. ഇത് മൈക്രോഫോണിൽ നിന്ന് ഓഡിയോ പിടിക്കാൻ വിളിക്കപ്പെടും:
```python
def capture_audio():
```
1. ഈ ഫംഗ്ഷനിന്റെ ഉള്ളിൽ ഓഡിയോ പിടിക്കാൻ താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
```python
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 ഡോക്യുമെന്റേഷനിൽ](https://people.csail.mit.edu/hubert/pyaudio/docs/) കൂടുതൽ വായിക്കാം.
ബട്ടൺ വിട്ടു കഴിഞ്ഞാൽ സ്ട്രീം നിർത്തുകയും അടയ്ക്കുകയും ചെയ്യും.
1. ഈ ഫംഗ്ഷന്റെ അവസാനം താഴെ കാണുന്ന കോഡ് ചേർക്കുക:
```python
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 ഫയൽ ഫോർമാറ്റിൽ അതിൽ എഴുതി സംഭരിച്ചും ചെയ്യും. സ്ടാൻഡേർഡ് അന്കംപ്രസ്സ് ചെയ്ത ഓഡിയോ ഫയൽ എഴുതാനുള്ള മാർഗമാണ് ഇത്. ശേഷം ബഫർ തിരിച്ചുകൊടുക്കുന്നു.
1. ഓഡിയോ ബഫർ പ്ലേ ചെയ്യാൻ താഴെയുള്ള `play_audio` ഫംഗ്ഷൻ ചേർക്കുക:
```python
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 ബൈറ്റ് പാത്രങ്ങളിൽ പ്ലേ സ്ട്രീത്തിലേക്ക് എഴുതി ഓഡിയോ പ്ലേ ചെയ്യും. അവസാനം സ്ട്രീം അടയ്ക്കും.
1. ബട്ടൺ അമർത്തിയശേഷം ഓഡിയോ പിടിച്ച് പ്ലേ ചെയ്യുന്നതുവരെ ലൂപ്പ് ചെയ്യാൻ താഴെയിരിക്കുന്ന കോഡ് ചേർക്കുക:
```python
while True:
while not button.is_pressed():
time.sleep(.1)
buffer = capture_audio()
play_audio(buffer)
```
1. കോഡ് പ്രവര്‍ത്തിപ്പിക്കുക. ബട്ടൺ അമർത്തി, മൈക്രോഫോണിലേക്ക് സംസാരിക്കുക. തീർന്നപ്പോള്‍ ബട്ടൺ വിടുക, റെക്കോർഡിങ് കേൾക്കാനിടയാകും.
PyAudio ഇൻസ്റ്റൻസ് സൃഷ്ടിക്കുമ്പോൾ ചില ALSA പിശകുകൾ കാണാം. ഇത് നിങ്ങളുടെ Pi-യിലെ ഓഡിയോ ഉപകരണങ്ങളുമായി ബന്ധപ്പെട്ട കോൺഫിഗറേഷൻ പ്രശ്നമാണ്. നിങ്ങൾക്ക് അവ പര്യവേക്ഷണം ചെയ്യേണ്ടതില്ല.
```output
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
```
താഴെ പറയുന്ന പിശക് ലഭിക്കുകയാണെങ്കിൽ:
```output
OSError: [Errno -9997] Invalid sample rate
```
`rate`-നെ 44100 അല്ലെങ്കിൽ 16000 ആക്കി മാറ്റുക.
> 💁 ഈ കോഡ് [code-record/pi](../../../../../6-consumer/lessons/1-speech-recognition/code-record/pi) ഫോൾഡറിൽ ലഭ്യമാണ്.
😀 നിങ്ങളുടെ ഓഡിയോ റെക്കോർഡിംഗ് പ്രോഗ്രാം വിജയകരമായി തീർന്നു!
---
<!-- CO-OP TRANSLATOR DISCLAIMER START -->
**പരിഭാഷാ വെളുപ്പിക്കൽ**:
ഈ രേഖ AI പരിഭാഷാ സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് പരിഭാഷ ചെയ്തത് ആണ്. നാം കൃത്യതയ്ക്കായി പരിശ്രമിക്കുന്നതിനുപേരും, സ്വയമേവ നടത്തുന്ന പരിഭാഷകളിൽ ചില പിശകുകളോ അശുദ്ധികളോ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. മൗലിക രേഖയുടെ സ്വതന്ത്ര ഭാഷയാണ് അവകാശവാനായ ഉറവിടം എന്ന് കരുതണം. നിർണ്ണായകമായ വിവരങ്ങൾക്ക് പ്രൊഫഷണൽ മനുഷ്യ പരിഭാഷ ശിപാർശ ചെയ്യപ്പെടുന്നു. ഈ പരിഭാഷയുടെ ഉപയോഗത്തിൽ ഉണ്ടായ ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കും തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കും നാം ഉത്തരവാദിത്വം അനുവദിക്കുകയില്ല.
<!-- CO-OP TRANSLATOR DISCLAIMER END -->