8.6 KiB
Salvestage heli - Raspberry Pi
Selles õppetunni osas kirjutate koodi, et salvestada heli oma Raspberry Pi-ga. Helisalvestust juhitakse nupu abil.
Riistvara
Raspberry Pi vajab nuppu, et juhtida helisalvestust.
Nupp, mida kasutate, on Grove nupp. See on digitaalne sensor, mis lülitab signaali sisse või välja. Need nupud saab seadistada saatma kõrget signaali, kui nuppu vajutatakse, ja madalat, kui seda ei vajutata, või madalat, kui vajutatakse, ja kõrget, kui ei vajutata.
Kui kasutate ReSpeaker 2-Mics Pi HAT-i mikrofonina, siis pole vaja nuppu ühendada, kuna sellel HAT-il on nupp juba olemas. Jätkake järgmise jaotisega.
Ühendage nupp
Nuppu saab ühendada Grove base hat-iga.
Ülesanne - ühendage nupp
-
Sisestage Grove kaabli üks ots nupumooduli pistikusse. See läheb sisse ainult ühel viisil.
-
Kui Raspberry Pi on välja lülitatud, ühendage Grove kaabli teine ots Grove Base hat-i digitaalse pistikuga, mis on märgitud D5. See pistik on GPIO pin-ide kõrval olevate pistikute reas vasakult teine.
Helisalvestus
Mikrofonist heli salvestamiseks saate kasutada Python koodi.
Ülesanne - salvestage heli
-
Lülitage Pi sisse ja oodake, kuni see käivitub.
-
Käivitage VS Code, kas otse Pi-l või ühendage Remote SSH laienduse kaudu.
-
PyAudio Pip pakett sisaldab funktsioone heli salvestamiseks ja taasesitamiseks. See pakett sõltub mõnest heliraamatukogust, mis tuleb esmalt installida. Käivitage terminalis järgmised käsud, et need installida:
sudo apt update sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes -
Installige PyAudio Pip pakett.
pip3 install pyaudio -
Looge uus kaust nimega
smart-timerja lisage sellele kaustale fail nimegaapp.py. -
Lisage faili algusesse järgmised impordid:
import io import pyaudio import time import wave from grove.factory import FactorySee impordib
pyaudiomooduli, mõned standardse Python moodulid WAV-failide käsitlemiseks jagrove.factorymooduli, et importidaFactory, mis loob nupuklassi. -
Lisage selle alla kood Grove nupu loomiseks.
Kui kasutate ReSpeaker 2-Mics Pi HAT-i, kasutage järgmist koodi:
# The button on the ReSpeaker 2-Mics Pi HAT button = Factory.getButton("GPIO-LOW", 17)See loob nupu pordil D17, millele on ühendatud ReSpeaker 2-Mics Pi HAT-i nupp. See nupp on seadistatud saatma madalat signaali, kui seda vajutatakse.
Kui te ei kasuta ReSpeaker 2-Mics Pi HAT-i ja kasutate Grove nuppu, mis on ühendatud base hat-iga, kasutage seda koodi.
button = Factory.getButton("GPIO-HIGH", 5)See loob nupu pordil D5, mis on seadistatud saatma kõrget signaali, kui seda vajutatakse.
-
Lisage selle alla PyAudio klassi eksemplar, et hallata heli:
audio = pyaudio.PyAudio() -
Määrake mikrofonile ja kõlarile riistvarakaardi number. See on kaardi number, mille leidsite, kui käivitasite
arecord -ljaaplay -lvarem selles õppetunnis.microphone_card_number = <microphone card number> speaker_card_number = <speaker card number>Asendage
<microphone card number>oma mikrofoni kaardi numbriga.Asendage
<speaker card number>oma kõlari kaardi numbriga, sama numbriga, mille määrasitealsa.conffailis. -
Määrake selle alla helisalvestuse ja taasesituse jaoks kasutatav näidissagedus. Võimalik, et peate seda muutma sõltuvalt kasutatavast riistvarast.
rate = 48000 #48KHzKui saate hiljem koodi käivitamisel näidissageduse vigu, muutke see väärtus
44100või16000. Mida suurem väärtus, seda parem heli kvaliteet. -
Looge selle alla uus funktsioon nimega
capture_audio. Seda kutsutakse mikrofonist heli salvestamiseks:def capture_audio(): -
Lisage selle funktsiooni sisse järgmine kood heli salvestamiseks:
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()See kood avab PyAudio objekti abil helisisendi voo. See voog salvestab heli mikrofonist sagedusel 16KHz, salvestades selle 4096-baidistes puhvrites.
Kood kordab tsüklit, kuni Grove nuppu vajutatakse, lugedes iga kord need 4096-baidised puhvrid massiivi.
💁 Lisateavet
openmeetodile edastatavate valikute kohta leiate PyAudio dokumentatsioonist.Kui nupp vabastatakse, voog peatatakse ja suletakse.
-
Lisage selle funktsiooni lõppu järgmine kood:
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_bufferSee kood loob binaarse puhvri ja kirjutab kogu salvestatud heli sellesse kui WAV-fail. See on standardne viis tihendamata heli faili kirjutamiseks. See puhver tagastatakse.
-
Lisage järgmine
play_audiofunktsioon, et taasesitada helipuhvrit: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()See funktsioon avab teise helivoo, seekord väljundiks - heli taasesitamiseks. See kasutab samu seadeid nagu sisendvoog. Puhver avatakse WAV-failina ja kirjutatakse väljundvoogu 4096-baidistes tükkides, taasesitades heli. Voog suletakse.
-
Lisage järgmine kood
capture_audiofunktsiooni alla, et tsüklitada, kuni nuppu vajutatakse. Kui nuppu vajutatakse, salvestatakse heli ja seejärel taasesitatakse.while True: while not button.is_pressed(): time.sleep(.1) buffer = capture_audio() play_audio(buffer) -
Käivitage kood. Vajutage nuppu ja rääkige mikrofoni. Vabastage nupp, kui olete valmis, ja kuulete salvestust.
Võite saada mõned ALSA vead, kui PyAudio eksemplar luuakse. See on tingitud Pi konfiguratsioonist heliseadmete jaoks, mida teil pole. Võite neid vigu ignoreerida.
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.sideKui saate järgmise vea:
OSError: [Errno -9997] Invalid sample ratesiis muutke
rateväärtuseks kas 44100 või 16000.
💁 Selle koodi leiate kaustast code-record/pi.
😀 Teie helisalvestusprogramm oli edukas!
Lahtiütlus:
See dokument on tõlgitud AI tõlketeenuse Co-op Translator abil. Kuigi püüame tagada täpsust, palume arvestada, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algses keeles tuleks pidada autoriteetseks allikaks. Olulise teabe puhul soovitame kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valesti tõlgenduste eest.

