Control vocal pe PC și RaspberryPi cu Whisper

control vocal pe PC și raspberry pi

Ideea proiectului este dați instrucțiuni vocale pentru a interacționa prin computerul nostru sau Raspberry Pi folosind modelul Voice-to-text Whisper.

Vom da o comandă care va fi transcrisă, convertită în text, cu Whisper și apoi analizată pentru a executa ordinea corespunzătoare, care poate fi de la executarea unui program până la darea de tensiune la pinii RaspberryPi.

Voi folosi un Raspberry Pi 2 vechi, un micro USB și voi folosi modelul Voice-to-text lansat recent de OpenAI, Şoaptă. La sfârșitul articolului puteți vedea mai puţină şoaptă.

toate programate în Piton.

Vă las o demonstrație a modului în care funcționează în acest videoclip, controlând computerul prin voce.

Montarea

Pentru a-l folosi cu PC-ul, vom avea nevoie doar de un microfon.

Dacă urmează să-l montezi pe RaspberryPi, vei avea nevoie de un microfon USB, deoarece mufa pe care o are este doar pentru ieșire.

Nevoie:

Deoarece scopul general al instrumentului este identificarea vocală. Mi se pare foarte util să îl integrez în funcționarea altor dispozitive.

  • Micro USB
  • Raspberry PI cu sistem de operare (exemplu Raspbian pro)
  • Electronică (LED, fire, rezistență de 480 ohmi și placă)

Conectăm LED-ul la pinul 17, care este cel pe care îl vom activa și dezactiva pentru această experiență.

dezvoltarea codului

Este împărțit în trei părți, prima, înregistrarea audio pentru care am luat un cod geeksforgeeks, pentru că nu cunosc acele librării. Al doilea, conversia audio în text cu Whisper și al treilea, tratarea acelui text și răspunsul în RaspberryPi

În exemplul de testare, voi interacționa doar cu un LED, făcându-l să se aprindă sau să clipească, dar am putea dezvolta scriptul pentru a-l ajusta la nevoile noastre.

Sunt conștient că acesta este un Raspberry Pi 2 și va fi mult mai lent decât un Raspberry Pi 4, dar pentru testare este bine.

Înainte de a-l putea face să funcționeze, va trebui să instalați următoarele

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

tot codul

#!/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

Nu am reușit să-l testez pentru că nu am un microSD pentru RaspberryPi sau un difuzor USB de conectat, dar de îndată ce o încerc corectez o eroare în care se strecoară ușor.

Explicație pas cu pas a codului

#!/usr/bin/env python3

Shebang să spună dispozitivului în ce limbă am programat și ce interpret să folosească. Deși pare banal, nepunerea lui provoacă erori de multe ori.

biblioteci importate

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

Șoptește să lucrezi cu modelul

timp, pentru că îl folosesc pentru a controla timpul necesar pentru a executa scriptul, gpiozero pentru a lucra cu pinii GPIO ai Raspberry și dispozitivul de sunet, scipy și wavio pentru a înregistra audio

funcții

Am creat 4 functii:

  • principal ()
  • ușoară ()
  • a clipi ()
  • înregistrează audio()

porniți () pur și simplu dă tensiune pinului 17 al zmeurului unde am conectat în acest caz LED-ul de testat

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

blink() este ca on() dar face ca ledul să clipească, pornindu-l și oprindu-l într-o buclă.

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

Cu record_audio() înregistrăm fișierul 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 este funcția principală, observați că singurul lucru pe care îl avem în afara funcțiilor este apelul la main() la sfârșitul scriptului. În acest fel, la pornire, va importa bibliotecile și apoi va efectua apelul de funcție.

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)

Salvăm timpul la care începem să executăm funcția și apoi apelăm funcția de înregistrare audio care va înregistra instrucțiunea noastră într-un fișier .wav, .mp3 etc. pe care ulterior îl vom converti în text.

    inicio = time.time()
    record_audio ()

  

Odată ce avem audio, se va suna șoaptă și îi spunem modelul pe care vrem să-l folosim, sunt 5 disponibile, și vom folosi minuscule, deși este cel mai imprecis pentru că este cel mai rapid și audio va fi simplu, doar 3 sau 4 cuvinte.

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

  

Cu aceasta avem audio convertit în text și salvat într-o variabilă. Hai sa o modificam putin.

Convertim rezultatul într-o listă cu fiecare dintre cuvintele audio

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

  

Și totul gata să interacționeze cu dispozitivul nostru. Acum trebuie doar să creăm condițiile pe care ni le dorim.

Dacă audio are cuvântul X, faceți Y. Deoarece avem cuvintele într-o listă, este foarte ușor să adăugați condiții

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

  

Linia

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


  

Îl folosesc pentru a converti cuvintele din audio în minuscule și pentru a elimina virgulele și punctele. Și în acest fel evitați erorile în comparații

În fiecare dacă este îndeplinită condiția de a avea oricare dintre cuvintele pe care le-am ales, se apelează la o funcție care va face ceea ce dorim,

Aici îi spunem să activeze un PIN care va aprinde un LED sau îl va face să clipească. Fie rulați un cod, fie închideți computerul.

Toate acestea sunt o idee de bază. De aici puteți dezvolta proiectul și îl puteți îmbunătăți după cum doriți. Fiecare persoană își poate găsi o utilizare diferită.

Lucruri pe care le putem face cu acest montaj

Acestea sunt idei care îmi vin pentru a profita de acest montaj. Odată armat scheletul, îl putem folosi pentru a activa tot ce ne vine în minte prin voce, putem activa un releu care pornește un motor sau putem lansa un script care execută un script, un e-mail sau orice altceva.

Ce este șoapta

Whisper este un model de recunoaștere a volumului, funcționează în mai multe limbi cu un număr mare de limbi și permite traducerea în engleză. Este ceea ce știm ca instrument text-to-voice, dar acesta este Open Source, lansat de echipa OpenAI, creatorii Stable Diffusion.

Dacă sunteți o persoană neliniștită ca noi și doriți să colaborați la întreținerea și îmbunătățirea proiectului, puteți face o donație. Toți banii vor merge pentru a cumpăra cărți și materiale pentru a experimenta și a face tutoriale

Lasă un comentariu