9.3 KiB
Zachytávanie zvuku - Raspberry Pi
V tejto časti lekcie napíšete kód na zachytávanie zvuku na vašom Raspberry Pi. Zachytávanie zvuku bude ovládané tlačidlom.
Hardvér
Raspberry Pi potrebuje tlačidlo na ovládanie zachytávania zvuku.
Tlačidlo, ktoré použijete, je tlačidlo Grove. Ide o digitálny senzor, ktorý zapína alebo vypína signál. Tieto tlačidlá je možné nastaviť tak, aby posielali vysoký signál, keď je tlačidlo stlačené, a nízky, keď nie je, alebo nízky, keď je stlačené, a vysoký, keď nie je.
Ak používate ReSpeaker 2-Mics Pi HAT ako mikrofón, nie je potrebné pripojiť tlačidlo, pretože tento HAT už jedno tlačidlo obsahuje. Preskočte na ďalšiu sekciu.
Pripojenie tlačidla
Tlačidlo je možné pripojiť k základnému HAT-u Grove.
Úloha - pripojenie tlačidla
-
Zasuňte jeden koniec kábla Grove do zásuvky na module tlačidla. Pôjde to iba jedným spôsobom.
-
Pri vypnutom Raspberry Pi pripojte druhý koniec kábla Grove do digitálnej zásuvky označenej D5 na základnom HAT-e Grove pripojenom k Pi. Táto zásuvka je druhá zľava v rade zásuviek vedľa GPIO pinov.
Zachytávanie zvuku
Zvuk z mikrofónu môžete zachytiť pomocou kódu v Pythone.
Úloha - zachytávanie zvuku
-
Zapnite Pi a počkajte, kým sa spustí.
-
Spustite VS Code, buď priamo na Pi, alebo sa pripojte cez rozšírenie Remote SSH.
-
Balík PyAudio Pip obsahuje funkcie na nahrávanie a prehrávanie zvuku. Tento balík závisí od niektorých zvukových knižníc, ktoré je potrebné najskôr nainštalovať. Spustite nasledujúce príkazy v termináli na ich inštaláciu:
sudo apt update sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes
-
Nainštalujte balík PyAudio Pip.
pip3 install pyaudio
-
Vytvorte nový priečinok s názvom
smart-timer
a pridajte do tohto priečinka súbor s názvomapp.py
. -
Pridajte nasledujúce importy na začiatok tohto súboru:
import io import pyaudio import time import wave from grove.factory import Factory
Týmto sa importuje modul
pyaudio
, niektoré štandardné moduly Pythonu na prácu so súbormi WAV a modulgrove.factory
na importovanieFactory
na vytvorenie triedy tlačidla. -
Pod týmto pridajte kód na vytvorenie tlačidla Grove.
Ak používate ReSpeaker 2-Mics Pi HAT, použite nasledujúci kód:
# The button on the ReSpeaker 2-Mics Pi HAT button = Factory.getButton("GPIO-LOW", 17)
Týmto sa vytvorí tlačidlo na porte D17, porte, ku ktorému je pripojené tlačidlo na ReSpeaker 2-Mics Pi HAT. Toto tlačidlo je nastavené na posielanie nízkeho signálu, keď je stlačené.
Ak nepoužívate ReSpeaker 2-Mics Pi HAT, ale používate tlačidlo Grove pripojené k základnému HAT-u, použite tento kód:
button = Factory.getButton("GPIO-HIGH", 5)
Týmto sa vytvorí tlačidlo na porte D5, ktoré je nastavené na posielanie vysokého signálu, keď je stlačené.
-
Pod týmto vytvorte inštanciu triedy PyAudio na prácu so zvukom:
audio = pyaudio.PyAudio()
-
Deklarujte číslo hardvérovej karty pre mikrofón a reproduktor. Toto bude číslo karty, ktoré ste našli spustením
arecord -l
aaplay -l
skôr v tejto lekcii.microphone_card_number = <microphone card number> speaker_card_number = <speaker card number>
Nahraďte
<microphone card number>
číslom karty vášho mikrofónu.Nahraďte
<speaker card number>
číslom karty vášho reproduktora, rovnakým číslom, ktoré ste nastavili v súborealsa.conf
. -
Pod týmto deklarujte vzorkovaciu frekvenciu na použitie pri zachytávaní a prehrávaní zvuku. Možno budete musieť túto hodnotu zmeniť v závislosti od hardvéru, ktorý používate.
rate = 48000 #48KHz
Ak pri spustení tohto kódu neskôr dostanete chyby vzorkovacej frekvencie, zmeňte túto hodnotu na
44100
alebo16000
. Čím vyššia hodnota, tým lepšia kvalita zvuku. -
Pod týmto vytvorte novú funkciu s názvom
capture_audio
. Táto funkcia bude volaná na zachytávanie zvuku z mikrofónu:def capture_audio():
-
Vo vnútri tejto funkcie pridajte nasledujúce na zachytávanie zvuku:
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()
Tento kód otvorí zvukový vstupný stream pomocou objektu PyAudio. Tento stream bude zachytávať zvuk z mikrofónu pri 16 kHz, zachytávajúc ho v blokoch o veľkosti 4096 bajtov.
Kód potom opakovane číta tieto bloky o veľkosti 4096 bajtov do poľa, kým je tlačidlo Grove stlačené.
💁 Viac o možnostiach odovzdávaných metóde
open
si môžete prečítať v dokumentácii PyAudio.Po uvoľnení tlačidla sa stream zastaví a zatvorí.
-
Pridajte nasledujúce na koniec tejto funkcie:
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
Tento kód vytvorí binárny buffer a zapíše všetok zachytený zvuk do neho ako WAV súbor. Ide o štandardný spôsob zápisu nekomprimovaného zvuku do súboru. Tento buffer sa potom vráti.
-
Pridajte nasledujúcu funkciu
play_audio
na prehrávanie zvukového bufferu: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()
Táto funkcia otvorí ďalší zvukový stream, tentoraz na výstup - na prehrávanie zvuku. Používa rovnaké nastavenia ako vstupný stream. Buffer sa potom otvorí ako súbor WAV a zapíše sa do výstupného streamu v blokoch o veľkosti 4096 bajtov, čím sa prehrá zvuk. Stream sa potom zatvorí.
-
Pridajte nasledujúci kód pod funkciu
capture_audio
na opakovanie, kým nie je tlačidlo stlačené. Po stlačení tlačidla sa zvuk zachytí a následne prehrá.while True: while not button.is_pressed(): time.sleep(.1) buffer = capture_audio() play_audio(buffer)
-
Spustite kód. Stlačte tlačidlo a hovorte do mikrofónu. Uvoľnite tlačidlo, keď skončíte, a budete počuť nahrávku.
Môžete dostať niektoré chyby ALSA pri vytváraní inštancie PyAudio. Je to kvôli konfigurácii na Pi pre zvukové zariadenia, ktoré nemáte. Tieto chyby môžete ignorovať.
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
Ak dostanete nasledujúcu chybu:
OSError: [Errno -9997] Invalid sample rate
zmeňte hodnotu
rate
na buď 44100 alebo 16000.
💁 Tento kód nájdete v priečinku code-record/pi.
😀 Váš program na nahrávanie zvuku bol úspešný!
Upozornenie:
Tento dokument bol preložený pomocou služby na automatický preklad Co-op Translator. Aj keď sa snažíme o presnosť, upozorňujeme, že automatické preklady môžu obsahovať chyby alebo nepresnosti. Pôvodný dokument v jeho pôvodnom jazyku by mal byť považovaný za záväzný zdroj. Pre dôležité informácie sa odporúča profesionálny ľudský preklad. Nezodpovedáme za akékoľvek nedorozumenia alebo nesprávne interpretácie vyplývajúce z použitia tohto prekladu.