Φωνητικός έλεγχος σε υπολογιστή και RaspberryPi με Whisper

φωνητικός έλεγχος σε υπολογιστή και raspberry pi

Η ιδέα του έργου είναι δώστε φωνητικές οδηγίες για αλληλεπίδραση μέσω του υπολογιστή μας ή του Raspberry Pi χρησιμοποιώντας το μοντέλο Voice-to-text Whisper.

Θα δώσουμε μια εντολή που θα μεταγραφεί, θα μετατραπεί σε κείμενο, με Whisper και στη συνέχεια θα αναλυθεί για να εκτελεστεί η κατάλληλη εντολή, η οποία μπορεί να είναι από την εκτέλεση ενός προγράμματος μέχρι την παροχή τάσης στους ακροδέκτες RaspberryPi.

Θα χρησιμοποιήσω ένα παλιό Raspberry Pi 2, ένα micro USB και θα χρησιμοποιήσω το μοντέλο Voice-to-text που κυκλοφόρησε πρόσφατα από την OpenAI, Ψίθυρος. Στο τέλος του άρθρου μπορείτε να δείτε λίγο ακόμα ψίθυρος.

όλα προγραμματισμένα σε Python.

Σας αφήνω μια επίδειξη του πώς λειτουργεί σε αυτό το βίντεο, ελέγχοντας τον υπολογιστή με φωνή.

Τοποθέτηση

Για να το χρησιμοποιήσουμε με τον υπολογιστή, θα χρειαστούμε μόνο ένα μικρόφωνο.

Αν πρόκειται να το τοποθετήσετε στο RaspberryPi, θα χρειαστείτε μικρόφωνο USB, γιατί η υποδοχή που έχει είναι μόνο για έξοδο.

Χρειάζομαι:

Καθώς ο γενικός σκοπός του εργαλείου είναι η αναγνώριση φωνής. Θεωρώ πολύ χρήσιμο να το ενσωματώσω στη λειτουργία άλλων συσκευών.

  • micro USB
  • Raspberry PI με λειτουργικό σύστημα (παράδειγμα Raspbian pro)
  • Ηλεκτρονικά (LED, καλώδια, αντίσταση 480 ohm και breadboard)

Συνδέουμε το LED στον ακροδέκτη 17, που είναι αυτός που θα ενεργοποιήσουμε και θα απενεργοποιήσουμε για αυτήν την εμπειρία.

ανάπτυξη κώδικα

Χωρίζεται σε τρία μέρη, το πρώτο, η ηχογράφηση για την οποία έχω πάρει κωδικό geeksforgeeks, γιατί δεν τα ξέρω αυτά τα βιβλιοπωλεία. Το δεύτερο, η μετατροπή του ήχου σε κείμενο με το Whisper και το τρίτο, η επεξεργασία αυτού του κειμένου και η απάντηση στο RaspberryPi

Στο παράδειγμα δοκιμής πρόκειται να αλληλεπιδράσω μόνο με ένα Led, κάνοντας το να ανάβει ή να αναβοσβήνει, αλλά θα μπορούσαμε να αναπτύξουμε το σενάριο για να το προσαρμόσουμε στις ανάγκες μας.

Γνωρίζω ότι αυτό είναι ένα Raspberry Pi 2 και θα είναι πολύ πιο αργό από ένα Raspberry Pi 4, αλλά για δοκιμή είναι μια χαρά.

Για να μπορέσετε να λειτουργήσει, θα χρειαστεί να εγκαταστήσετε τα ακόλουθα

#Instalar whisper
pip install git+https://github.com/openai/whisper.git
sudo apt update && sudo apt install ffmpeg

#para que funcione la grabación de audio
python3 -m pip install sounddevice --user
pip install git+https://github.com/WarrenWeckesser/wavio.git

#si vas a instalarlo en la raspberry
#dar permisos para usar la GPIO
sudo apt install python3-gpiozero
sudo usermode -aG gpio <username>

όλος ο κώδικας

#!/usr/bin/env python3
import whisper
import time
from gpiozero import LED
import sounddevice as sd
from scipy.io.wavfile import write
import wavio as wv

        
def main ():
    inicio = time.time()
    record_audio ()

    model = whisper.load_model("tiny")
    result = model.transcribe("audio1.wav")
    words = result["text"].split()

    for word in words:
        word = word.replace(',', '').replace('.', '').lower()
        if word == 'enciende' or 'encender':
            encender()
            break
        if word == 'parpadea' or 'parpadear':
            parpadear()
            break      
    fin = time.time()
    print(fin-inicio)

def encender ():
    LED(17).on()

def parpadear ():
    light = LED(17)
    while True:
        light.on()
        sleep(1)
        light.off()
        sleep(1)

def record_audio ():
    # Sampling frequency
    freq = 44100
    # Recording duration
    duration = 5
    # Start recorder with the given values
    # of duration and sample frequency
    recording = sd.rec(int(duration * freq),
                    samplerate=freq, channels=2)
    # Record audio for the given number of seconds
    sd.wait()
    # This will convert the NumPy array to an audio
    # file with the given sampling frequency
    write("audio0.wav", freq, recording)
    # Convert the NumPy array to audio file
    wv.write("audio1.wav", recording, freq, sampwidth=2)
        
main ()


#dar permisos para usar la GPIO
#sudo apt install python3-gpiozero
#sudo usermode -aG gpio <username>

#Instalar whisper
#pip install git+https://github.com/openai/whisper.git
#sudo apt update &amp;&amp; sudo apt install ffmpeg

Δεν μπόρεσα να το δοκιμάσω γιατί δεν έχω microSD για το RaspberryPi ή ηχείο USB για σύνδεση, αλλά μόλις το δοκιμάσω διορθώνω κάποιο σφάλμα που είναι εύκολο να μπει μέσα.

Βήμα προς βήμα επεξήγηση του κώδικα

#!/usr/bin/env python3

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

εισαγόμενες βιβλιοθήκες

import whisper
import time
from gpiozero import LED
import sounddevice as sd
from scipy.io.wavfile import write
import wavio as wv

Ψιθυρίστε να δουλέψετε με το μοντέλο

χρόνο, επειδή το χρησιμοποιώ για τον έλεγχο του χρόνου που χρειάζεται για την εκτέλεση του σεναρίου, το gpiozero για να εργαστεί με τις ακίδες GPIO του Raspberry και τη συσκευή ήχου, το scipy και το wavio για την εγγραφή του ήχου

Λειτουργίες

Έχω δημιουργήσει 4 λειτουργίες:

  • κύρια ()
  • φως ()
  • να αναβοσβήνει ()
  • record_audio()

ενεργοποιήστε το () απλά δίνει τάση στο pin 17 του raspberry όπου έχουμε συνδέσει σε αυτή την περίπτωση το LED για δοκιμή

def encender ():
    LED(17).on()

Το blink() είναι σαν το on() αλλά κάνει το led να αναβοσβήνει ενεργοποιώντας το και απενεργοποιώντας το μέσα σε ένα βρόχο.

def parpadear ():
    light = LED(17)
    while True:
        light.on()
        sleep(1)
        light.off()
        sleep(1)

Με το record_audio() καταγράφουμε το αρχείο ήχου

def record_audio ():
    # Sampling frequency
    freq = 44100
    # Recording duration
    duration = 5
    # Start recorder with the given values
    # of duration and sample frequency
    recording = sd.rec(int(duration * freq),
                    samplerate=freq, channels=2)
    # Record audio for the given number of seconds
    sd.wait()
    # This will convert the NumPy array to an audio
    # file with the given sampling frequency
    write("audio0.wav", freq, recording)
    # Convert the NumPy array to audio file
    wv.write("audio1.wav", recording, freq, sampwidth=2)

Το Main είναι η κύρια συνάρτηση, παρατηρήστε ότι το μόνο πράγμα που έχουμε εκτός συναρτήσεων είναι η κλήση στο main() στο τέλος του σεναρίου. Με αυτόν τον τρόπο κατά την εκκίνηση, θα εισαγάγει τις βιβλιοθήκες και στη συνέχεια θα πραγματοποιήσει την κλήση της λειτουργίας.

def main ():
    inicio = time.time()
    record_audio ()

    model = whisper.load_model("tiny")
    result = model.transcribe("audio1.wav")
    words = result["text"].split()

    for word in words:
        word = word.replace(',', '').replace('.', '').lower()
        if word == 'enciende' or 'encender':
            encender()
            break
        if word == 'parpadea' or 'parpadear':
            parpadear()
            break      
    fin = time.time()
    print(fin-inicio)

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

    inicio = time.time()
    record_audio ()

  

Μόλις έχουμε τον ήχο, θα κληθεί το whisper και θα του λέμε το μοντέλο που θέλουμε να χρησιμοποιήσουμε, υπάρχουν 5 διαθέσιμα και θα χρησιμοποιήσουμε το μικροσκοπικό, αν και είναι το πιο ανακριβές γιατί είναι το πιο γρήγορο και ο ήχος θα είναι απλός, μόνο 3 ή 4 λέξεις.

     model = whisper.load_model("tiny")
    result = model.transcribe("audio1.wav")

  

Με αυτό έχουμε τον ήχο να μετατραπεί σε κείμενο και να αποθηκευτεί σε μια μεταβλητή. Ας το τροποποιήσουμε λίγο.

Μετατρέπουμε το αποτέλεσμα σε λίστα με κάθε μία από τις λέξεις του ήχου

     words = result["text"].split()

  

Και όλα είναι έτοιμα για αλληλεπίδραση με τη συσκευή μας. Τώρα δεν έχουμε παρά να δημιουργήσουμε τις συνθήκες που θέλουμε.

Εάν ο ήχος έχει τη λέξη X, κάντε Y. Καθώς έχουμε τις λέξεις σε μια λίστα, είναι πολύ εύκολο να προσθέσετε συνθήκες

         for word in words:
        word = word.replace(',', '').replace('.', '').lower()
        if word == 'enciende' or 'encender':
            encender()
            break
        if word == 'parpadea' or 'parpadear':
            parpadear()
            break   

  

Γραμμή

         
        word = word.replace(',', '').replace('.', '').lower()


  

Το χρησιμοποιώ για να μετατρέψω τις λέξεις στον ήχο σε πεζά και να αφαιρέσω τα κόμματα και τις τελείες. Και με αυτόν τον τρόπο αποφύγετε λάθη στις συγκρίσεις

Σε κάθε εάν πληρούται η προϋπόθεση να έχουμε κάποια από τις λέξεις που έχουμε επιλέξει, καλεί μια συνάρτηση που θα κάνει αυτό που θέλουμε,

Εδώ του λέμε να ενεργοποιήσει ένα PIN που θα ανάψει ένα LED ή θα το κάνει να αναβοσβήνει. Είτε εκτελέστε κάποιο κωδικό, είτε κλείστε τον υπολογιστή.

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

Πράγματα που μπορούμε να κάνουμε με αυτό το μοντάζ

Αυτές είναι ιδέες που μου έρχονται για να εκμεταλλευτώ αυτό το μοντάζ. Μόλις οπλιστεί ο σκελετός, μπορούμε να τον χρησιμοποιήσουμε για να ενεργοποιήσουμε οτιδήποτε μας έρχεται στο μυαλό με φωνή, μπορούμε να ενεργοποιήσουμε ένα ρελέ που εκκινεί έναν κινητήρα ή μπορούμε να εκκινήσουμε ένα σενάριο που εκτελεί ένα σενάριο, ένα email ή οτιδήποτε άλλο.

Τι είναι ψίθυρος

Το Whisper είναι ένα μοντέλο αναγνώρισης τόμων, λειτουργεί σε πολλές γλώσσες με μεγάλο αριθμό γλωσσών και επιτρέπει τη μετάφραση στα αγγλικά. Είναι αυτό που γνωρίζουμε ως εργαλείο κειμένου σε φωνή, αλλά αυτό είναι το Open Source, που κυκλοφόρησε από την ομάδα OpenAI, τους δημιουργούς του Stable Diffusion.

Αφήστε ένα σχόλιο