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/fi/6-consumer/lessons/1-speech-recognition/pi-audio.md

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

Grove-painike

  1. Työnnä Grove-kaapelin toinen pää painikemoduulin liittimeen. Se menee sisään vain yhdellä tavalla.

  2. 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ä.

Grove-painike liitettynä liittimeen D5

Tallenna ääntä

Voit tallentaa ääntä mikrofonista Python-koodilla.

Tehtävä - tallenna ääntä

  1. Käynnistä Pi ja odota, että se käynnistyy.

  2. Avaa VS Code joko suoraan Pi:llä tai yhdistä Remote SSH -laajennuksen kautta.

  3. 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 
    
  4. Asenna PyAudio Pip -paketti.

    pip3 install pyaudio
    
  5. Luo uusi kansio nimeltä smart-timer ja lisää tiedosto nimeltä app.py tähän kansioon.

  6. 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.

  7. 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.

  8. Lisää tämän alle PyAudio-luokan instanssi äänen käsittelyyn:

    audio = pyaudio.PyAudio()
    
  9. Määritä mikrofonin ja kaiuttimen laitteistokorttien numerot. Tämä on korttinumero, jonka löysit suorittamalla arecord -l ja aplay -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ääritit alsa.conf-tiedostossa.

  10. 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 tai 16000. Mitä korkeampi arvo, sitä parempi äänenlaatu.

  11. Luo tämän alle uusi funktio nimeltä capture_audio. Tätä kutsutaan mikrofonin äänen tallentamiseen:

    def capture_audio():
    
  12. 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.

  13. 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.

  14. 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.

  15. 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)
    
  16. 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ä.