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

14 KiB

Καταγραφή ήχου - Raspberry Pi

Σε αυτό το μέρος του μαθήματος, θα γράψετε κώδικα για να καταγράψετε ήχο στο Raspberry Pi σας. Η καταγραφή ήχου θα ελέγχεται από ένα κουμπί.

Υλικό

Το Raspberry Pi χρειάζεται ένα κουμπί για να ελέγχει την καταγραφή ήχου.

Το κουμπί που θα χρησιμοποιήσετε είναι ένα κουμπί Grove. Αυτός είναι ένας ψηφιακός αισθητήρας που ενεργοποιεί ή απενεργοποιεί ένα σήμα. Αυτά τα κουμπιά μπορούν να ρυθμιστούν ώστε να στέλνουν υψηλό σήμα όταν πατηθούν και χαμηλό όταν δεν πατηθούν, ή χαμηλό όταν πατηθούν και υψηλό όταν δεν πατηθούν.

Αν χρησιμοποιείτε το ReSpeaker 2-Mics Pi HAT ως μικρόφωνο, τότε δεν χρειάζεται να συνδέσετε κουμπί, καθώς αυτό το HAT έχει ήδη ένα ενσωματωμένο. Προχωρήστε στην επόμενη ενότητα.

Σύνδεση του κουμπιού

Το κουμπί μπορεί να συνδεθεί στη βάση Grove.

Εργασία - σύνδεση του κουμπιού

Ένα κουμπί Grove

  1. Εισάγετε το ένα άκρο ενός καλωδίου Grove στην υποδοχή του κουμπιού. Θα μπει μόνο με έναν συγκεκριμένο τρόπο.

  2. Με το Raspberry Pi απενεργοποιημένο, συνδέστε το άλλο άκρο του καλωδίου Grove στην ψηφιακή υποδοχή με την ένδειξη D5 στη βάση Grove που είναι συνδεδεμένη στο Pi. Αυτή η υποδοχή είναι η δεύτερη από τα αριστερά, στη σειρά των υποδοχών δίπλα στα GPIO pins.

Το κουμπί Grove συνδεδεμένο στην υποδοχή D5

Καταγραφή ήχου

Μπορείτε να καταγράψετε ήχο από το μικρόφωνο χρησιμοποιώντας κώδικα Python.

Εργασία - καταγραφή ήχου

  1. Ενεργοποιήστε το Pi και περιμένετε να εκκινήσει.

  2. Εκκινήστε το VS Code, είτε απευθείας στο Pi είτε συνδεθείτε μέσω της επέκτασης Remote SSH.

  3. Το πακέτο PyAudio Pip έχει συναρτήσεις για εγγραφή και αναπαραγωγή ήχου. Αυτό το πακέτο εξαρτάται από κάποιες βιβλιοθήκες ήχου που πρέπει να εγκατασταθούν πρώτα. Εκτελέστε τις παρακάτω εντολές στο τερματικό για να τις εγκαταστήσετε:

    sudo apt update
    sudo apt install libportaudio0 libportaudio2 libportaudiocpp0 portaudio19-dev libasound2-plugins --yes 
    
  4. Εγκαταστήστε το πακέτο PyAudio Pip.

    pip3 install pyaudio
    
  5. Δημιουργήστε έναν νέο φάκελο με όνομα smart-timer και προσθέστε ένα αρχείο με όνομα app.py σε αυτόν τον φάκελο.

  6. Προσθέστε τις παρακάτω εισαγωγές στην κορυφή αυτού του αρχείου:

    import io
    import pyaudio
    import time
    import wave
    
    from grove.factory import Factory
    

    Αυτές εισάγουν το module pyaudio, κάποια τυπικά modules της Python για τη διαχείριση αρχείων wave, και το module grove.factory για την εισαγωγή ενός Factory για τη δημιουργία μιας κλάσης κουμπιού.

  7. Παρακάτω, προσθέστε κώδικα για να δημιουργήσετε ένα κουμπί Grove.

    Αν χρησιμοποιείτε το ReSpeaker 2-Mics Pi HAT, χρησιμοποιήστε τον παρακάτω κώδικα:

    # The button on the ReSpeaker 2-Mics Pi HAT
    button = Factory.getButton("GPIO-LOW", 17)
    

    Αυτό δημιουργεί ένα κουμπί στην υποδοχή D17, την υποδοχή στην οποία είναι συνδεδεμένο το κουμπί του ReSpeaker 2-Mics Pi HAT. Αυτό το κουμπί έχει ρυθμιστεί να στέλνει χαμηλό σήμα όταν πατηθεί.

    Αν δεν χρησιμοποιείτε το ReSpeaker 2-Mics Pi HAT και χρησιμοποιείτε ένα κουμπί Grove συνδεδεμένο στη βάση, χρησιμοποιήστε αυτόν τον κώδικα:

    button = Factory.getButton("GPIO-HIGH", 5)
    

    Αυτό δημιουργεί ένα κουμπί στην υποδοχή D5, το οποίο έχει ρυθμιστεί να στέλνει υψηλό σήμα όταν πατηθεί.

  8. Παρακάτω, δημιουργήστε μια παρουσία της κλάσης PyAudio για τη διαχείριση του ήχου:

    audio = pyaudio.PyAudio()
    
  9. Δηλώστε τον αριθμό της κάρτας υλικού για το μικρόφωνο και το ηχείο. Αυτός θα είναι ο αριθμός της κάρτας που βρήκατε εκτελώντας arecord -l και aplay -l νωρίτερα στο μάθημα.

    microphone_card_number = <microphone card number>
    speaker_card_number = <speaker card number>
    

    Αντικαταστήστε το <microphone card number> με τον αριθμό της κάρτας του μικροφώνου σας.

    Αντικαταστήστε το <speaker card number> με τον αριθμό της κάρτας του ηχείου σας, τον ίδιο αριθμό που ορίσατε στο αρχείο alsa.conf.

  10. Παρακάτω, δηλώστε τον ρυθμό δειγματοληψίας που θα χρησιμοποιηθεί για την καταγραφή και την αναπαραγωγή ήχου. Ίσως χρειαστεί να αλλάξετε αυτήν την τιμή ανάλογα με το υλικό που χρησιμοποιείτε.

    rate = 48000 #48KHz
    

    Αν λάβετε σφάλματα δειγματοληψίας όταν εκτελέσετε τον κώδικα αργότερα, αλλάξτε αυτήν την τιμή σε 44100 ή 16000. Όσο μεγαλύτερη η τιμή, τόσο καλύτερη η ποιότητα του ήχου.

  11. Παρακάτω, δημιουργήστε μια νέα συνάρτηση με όνομα capture_audio. Αυτή θα καλείται για να καταγράψει ήχο από το μικρόφωνο:

    def capture_audio():
    
  12. Μέσα σε αυτήν τη συνάρτηση, προσθέστε τα παρακάτω για να καταγράψετε τον ήχο:

    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()
    

    Αυτός ο κώδικας ανοίγει ένα stream εισόδου ήχου χρησιμοποιώντας το αντικείμενο PyAudio. Αυτό το stream θα καταγράφει ήχο από το μικρόφωνο στα 16KHz, καταγράφοντάς τον σε buffers μεγέθους 4096 bytes.

    Ο κώδικας στη συνέχεια επαναλαμβάνεται όσο το κουμπί Grove είναι πατημένο, διαβάζοντας αυτά τα buffers των 4096 bytes σε έναν πίνακα κάθε φορά.

    💁 Μπορείτε να διαβάσετε περισσότερα για τις επιλογές που περνιούνται στη μέθοδο open στην τεκμηρίωση του PyAudio.

    Μόλις το κουμπί απελευθερωθεί, το stream σταματά και κλείνει.

  13. Προσθέστε τα παρακάτω στο τέλος αυτής της συνάρτησης:

    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
    

    Αυτός ο κώδικας δημιουργεί έναν δυαδικό buffer και γράφει όλο τον καταγεγραμμένο ήχο σε αυτόν ως αρχείο WAV. Αυτός είναι ένας τυπικός τρόπος για να γράψετε μη συμπιεσμένο ήχο σε ένα αρχείο. Αυτός ο buffer στη συνέχεια επιστρέφεται.

  14. Προσθέστε τη συνάρτηση play_audio για την αναπαραγωγή του buffer ήχου:

    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()
    

    Αυτή η συνάρτηση ανοίγει ένα άλλο stream ήχου, αυτή τη φορά για έξοδο - για την αναπαραγωγή του ήχου. Χρησιμοποιεί τις ίδιες ρυθμίσεις με το stream εισόδου. Ο buffer στη συνέχεια ανοίγεται ως αρχείο wave και γράφεται στο stream εξόδου σε chunks των 4096 bytes, αναπαράγοντας τον ήχο. Το stream στη συνέχεια κλείνει.

  15. Προσθέστε τον παρακάτω κώδικα κάτω από τη συνάρτηση capture_audio για να επαναλαμβάνεται μέχρι να πατηθεί το κουμπί. Μόλις πατηθεί το κουμπί, ο ήχος καταγράφεται και στη συνέχεια αναπαράγεται.

    while True:
        while not button.is_pressed():
            time.sleep(.1)
    
        buffer = capture_audio()
        play_audio(buffer)
    
  16. Εκτελέστε τον κώδικα. Πατήστε το κουμπί και μιλήστε στο μικρόφωνο. Απελευθερώστε το κουμπί όταν τελειώσετε και θα ακούσετε την εγγραφή.

    Ίσως λάβετε κάποια σφάλματα ALSA όταν δημιουργηθεί η παρουσία του PyAudio. Αυτό οφείλεται στη διαμόρφωση του Pi για συσκευές ήχου που δεν έχετε. Μπορείτε να αγνοήσετε αυτά τα σφάλματα.

    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
    

    Αν λάβετε το παρακάτω σφάλμα:

    OSError: [Errno -9997] Invalid sample rate
    

    τότε αλλάξτε το rate σε 44100 ή 16000.

💁 Μπορείτε να βρείτε αυτόν τον κώδικα στον φάκελο code-record/pi.

😀 Το πρόγραμμα εγγραφής ήχου σας ήταν επιτυχές!


Αποποίηση ευθύνης:
Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία αυτόματης μετάφρασης Co-op Translator. Παρόλο που καταβάλλουμε προσπάθειες για ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν σφάλματα ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα θα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή εσφαλμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.