9.0 KiB
Tallenna ääntä - Raspberry Pi
Tässä osassa oppituntia kirjoitat koodia äänen tallentamiseen Raspberry Pi:llä. Äänentallennusta ohjataan painikkeella.
Laitteisto
Raspberry Pi tarvitsee painikkeen äänen tallennuksen ohjaamiseen.
Käytettävä painike on Grove-painike. Tämä on digitaalinen anturi, joka kytkee signaalin päälle tai pois. Nämä painikkeet voidaan määrittää lähettämään korkea signaali, kun painiketta painetaan, ja matala, kun sitä ei paineta, tai matala, kun painetaan ja korkea, kun ei paineta.
Jos käytät ReSpeaker 2-Mics Pi HAT -mikrofonia, painiketta ei tarvitse liittää, sillä tämä HAT sisältää painikkeen valmiiksi. Siirry seuraavaan osioon.
Liitä painike
Painike voidaan liittää Grove Base HAT:iin.
Tehtävä - liitä painike
-
Työnnä Grove-kaapelin toinen pää painikemoduulin liittimeen. Se menee sisään vain yhdellä tavalla.
-
Kun Raspberry Pi on sammutettu, liitä Grove-kaapelin toinen pää digitaaliseen liittimeen, joka on merkitty D5 Grove Base HAT:ssa, joka on kiinnitetty Pi:hin. Tämä liitin on toinen vasemmalta GPIO-pinnien vieressä olevassa rivissä.
Tallenna ääntä
Voit tallentaa ääntä mikrofonista Python-koodilla.
Tehtävä - tallenna ääntä
-
Käynnistä Pi ja odota, että se käynnistyy.
-
Avaa VS Code joko suoraan Pi:llä tai yhdistä Remote SSH -laajennuksen kautta.
-
PyAudio Pip -paketti sisältää funktioita äänen tallentamiseen ja toistamiseen. Tämä paketti vaatii joitakin äänenkirjastoja, jotka täytyy asentaa ensin. Suorita seuraavat komennot terminaalissa asentaaksesi ne:
sudo apt update sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes
-
Asenna PyAudio Pip -paketti.
pip3 install pyaudio
-
Luo uusi kansio nimeltä
smart-timer
ja lisää tiedosto nimeltäapp.py
tähän kansioon. -
Lisää tiedoston alkuun seuraavat tuonnit:
import io import pyaudio import time import wave from grove.factory import Factory
Tämä tuo
pyaudio
-moduulin, joitakin Pythonin vakio-moduuleja WAV-tiedostojen käsittelyyn sekägrove.factory
-moduulin painikeluokan luomiseen. -
Lisää tämän alle koodi Grove-painikkeen luomiseen.
Jos käytät ReSpeaker 2-Mics Pi HAT:ia, käytä seuraavaa koodia:
# The button on the ReSpeaker 2-Mics Pi HAT button = Factory.getButton("GPIO-LOW", 17)
Tämä luo painikkeen porttiin D17, joka on portti, johon ReSpeaker 2-Mics Pi HAT:n painike on liitetty. Tämä painike on asetettu lähettämään matala signaali, kun sitä painetaan.
Jos et käytä ReSpeaker 2-Mics Pi HAT:ia, vaan Grove-painiketta, joka on liitetty Base HAT:iin, käytä tätä koodia:
button = Factory.getButton("GPIO-HIGH", 5)
Tämä luo painikkeen porttiin D5, joka on asetettu lähettämään korkea signaali, kun sitä painetaan.
-
Lisää tämän alle PyAudio-luokan instanssi äänen käsittelyyn:
audio = pyaudio.PyAudio()
-
Määritä mikrofonin ja kaiuttimen laitteistokorttien numerot. Tämä on korttinumero, jonka löysit suorittamalla
arecord -l
jaaplay -l
aiemmin tässä oppitunnissa.microphone_card_number = <microphone card number> speaker_card_number = <speaker card number>
Korvaa
<microphone card number>
mikrofonisi korttinumerolla.Korvaa
<speaker card number>
kaiuttimesi korttinumerolla, samalla numerolla, jonka määrititalsa.conf
-tiedostossa. -
Määritä tämän alle näytteenottotaajuus, jota käytetään äänen tallennuksessa ja toistossa. Saatat joutua muuttamaan tätä riippuen käyttämästäsi laitteistosta.
rate = 48000 #48KHz
Jos saat näytteenottotaajuusvirheitä, kun suoritat koodia myöhemmin, muuta tämä arvo
44100
tai16000
. Mitä korkeampi arvo, sitä parempi äänenlaatu. -
Luo tämän alle uusi funktio nimeltä
capture_audio
. Tätä kutsutaan mikrofonin äänen tallentamiseen:def capture_audio():
-
Lisää tämän funktion sisälle seuraava koodi äänen tallentamiseen:
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()
Tämä koodi avaa äänen syöttövirran PyAudio-objektilla. Tämä virta tallentaa ääntä mikrofonista 16 kHz:n taajuudella, tallentaen sen 4096 tavun kokoisiin puskureihin.
Koodi sitten silmukoi, kun Grove-painiketta painetaan, lukien nämä 4096 tavun puskurit taulukkoon joka kerta.
💁 Voit lukea lisää
open
-metodille annetuista vaihtoehdoista PyAudio-dokumentaatiosta.Kun painike vapautetaan, virta pysäytetään ja suljetaan.
-
Lisää seuraava koodi tämän funktion loppuun:
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
Tämä koodi luo binääripuskurin ja kirjoittaa kaikki tallennetut äänet siihen WAV-tiedostona. Tämä on standarditapa kirjoittaa pakkaamatonta ääntä tiedostoon. Tämä puskurin sisältö palautetaan.
-
Lisää seuraava
play_audio
-funktio äänen toistamiseen: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ämä funktio avaa toisen äänen virran, tällä kertaa ulostulolle - äänen toistamiseen. Se käyttää samoja asetuksia kuin syöttövirta. Puskuri avataan WAV-tiedostona ja kirjoitetaan ulostulovirtaan 4096 tavun paloina, toistaen äänen. Virta suljetaan lopuksi.
-
Lisää seuraava koodi
capture_audio
-funktion alle silmukoimaan, kunnes painiketta painetaan. Kun painiketta painetaan, ääni tallennetaan ja toistetaan.while True: while not button.is_pressed(): time.sleep(.1) buffer = capture_audio() play_audio(buffer)
-
Suorita koodi. Paina painiketta ja puhu mikrofoniin. Vapauta painike, kun olet valmis, ja kuulet tallenteen.
Saatat saada joitakin ALSA-virheitä, kun PyAudio-instanssi luodaan. Tämä johtuu Pi:n äänenlaitteiden konfiguraatiosta, joita sinulla ei ole. Voit ohittaa nämä virheet.
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
Jos saat seuraavan virheen:
OSError: [Errno -9997] Invalid sample rate
muuta
rate
joko arvoon 44100 tai 16000.
💁 Löydät tämän koodin code-record/pi -kansiosta.
😀 Äänentallennusohjelmasi onnistui!
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.