Stemmestyring på pc og RaspberryPi med Whisper

stemmestyring på pc og raspberry pi

Ideen med projektet er give stemmeinstruktioner til at interagere gennem vores pc eller vores Raspberry Pi ved hjælp af Voice-to-text Whisper-modellen.

Vi vil give en ordre, der vil blive transskriberet, konverteret til tekst, med Whisper og derefter analyseret for at udføre den passende ordre, som kan være fra at udføre et program til at give spænding til RaspberryPi-stifterne.

Jeg vil bruge en gammel Raspberry Pi 2, en mikro-USB, og jeg vil bruge Voice-to-text-modellen, der for nylig blev udgivet af OpenAI, Hviske. I slutningen af ​​artiklen kan du se lidt mere hvisken.

alt programmeret ind Python.

Jeg giver dig en demonstration af, hvordan det virker i denne video, hvor du styrer pc'en med stemmen.

montering

For at bruge det med pc'en skal vi kun bruge en mikrofon.

Hvis du skal montere den på RaspberryPi, skal du bruge en USB-mikrofon, for det stik, den har, er kun til output.

Brug for:

Da det generelle formål med værktøjet er stemmeidentifikation. Jeg finder det meget nyttigt at integrere det i driften af ​​andre enheder.

  • micro USB
  • Raspberry PI med operativsystem (Raspbian pro eksempel)
  • Elektronik (LED, ledninger, 480 ohm modstand og breadboard)

Vi forbinder LED'en til pin 17, som er den, vi vil aktivere og deaktivere for denne oplevelse.

kode udvikling

Den er opdelt i tre dele, den første, lydoptagelsen, som jeg har taget en kode fra geeksforgeeks, for jeg kender ikke de boghandlere. Den anden, konverteringen af ​​lyd til tekst med Whisper og den tredje, behandlingen af ​​den tekst og respons i RaspberryPi

I testeksemplet vil jeg kun interagere med en LED, så den lyser eller blinker, men vi kunne udvikle scriptet for at tilpasse det til vores behov.

Jeg er klar over, at dette er en Raspberry Pi 2, og den vil være meget langsommere end en Raspberry Pi 4, men til test er det fint.

Før du kan få det til at virke, skal du installere følgende

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

hele koden

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

Jeg har ikke været i stand til at teste det, fordi jeg ikke har et microSD til RaspberryPi, eller en USB-højttaler at tilslutte, men så snart jeg prøver det, retter jeg en fejl, som det er nemt at smutte ind i.

Trin for trin forklaring af koden

#!/usr/bin/env python3

Shebang for at fortælle enheden, hvilket sprog vi har programmeret på, og hvilken tolk der skal bruges. Selvom det virker trivielt, forårsager det fejl ved mange lejligheder ikke at sætte det.

importerede biblioteker

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

Hvisk at arbejde med modellen

tid, fordi jeg bruger det til at styre den tid det tager at udføre scriptet, gpiozero til at arbejde med GPIO-stifterne på Raspberry og lydenhed, scipy og wavio til at optage lyden

funktioner

Jeg har lavet 4 funktioner:

  • vigtigste ()
  • lys ()
  • at blinke ()
  • record_audio()

tænd () giver simpelthen spænding til pin 17 på hindbæret, hvor vi i dette tilfælde har tilsluttet LED'en for at teste

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

blink() er ligesom on(), men det får lysdioden til at blinke ved at tænde og slukke for den inden for en sløjfe.

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

Med record_audio() optager vi lydfilen

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 er hovedfunktionen, bemærk at det eneste vi har uden for funktioner er kaldet til main() i slutningen af ​​scriptet. På denne måde ved opstart vil den importere bibliotekerne og derefter foretage funktionskaldet.

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)

Vi gemmer det tidspunkt, hvor vi begynder at udføre funktionen, og så kalder vi funktionen optag lyd, der optager vores instruktion i en .wav, .mp3 osv. fil, som vi senere vil konvertere til tekst

    inicio = time.time()
    record_audio ()

  

Når vi har lyden, vil hvisken blive kaldt, og vi fortæller den, hvilken model vi vil bruge, der er 5 tilgængelige, og vi vil bruge bittesmå, selvom det er det mest upræcise, fordi det er den hurtigste, og lyden vil være enkel, kun 3 eller 4 ord.

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

  

Med dette har vi konverteret lyden til tekst og gemt i en variabel. Lad os ændre det lidt.

Vi konverterer resultatet til en liste med hvert af lydens ord

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

  

Og alt klar til at interagere med vores enhed. Nu skal vi bare skabe de betingelser, vi ønsker.

Hvis lyden har ordet X, skal du gøre Y. Da vi har ordene på en liste, er det meget nemt at tilføje betingelser

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

  

linje

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


  

Jeg bruger det til at konvertere ordene i lyden til små bogstaver og fjerne kommaer og punktum. Og undgå på den måde fejl i sammenligningerne

I hver hvis betingelsen om at have et af de ord, vi har valgt, er opfyldt, kalder den en funktion, der vil gøre, hvad vi vil,

Det er her, vi fortæller den, at den skal aktivere en PIN-kode, der vil tænde en LED eller få den til at blinke. Kør enten noget kode, eller sluk computeren.

Alt dette er en grundlæggende idé. Herfra kan du udvikle projektet og forbedre det, som du vil. Hver person kan finde en anden brug for det.

Ting vi kan gøre med denne montage

Det er ideer, der kommer til mig for at drage fordel af denne montage. Når skelettet er bevæbnet, kan vi bruge det til at aktivere alt, hvad der kommer til at tænke på med stemmen, vi kan aktivere et relæ, der starter en motor, eller vi kan starte et script, der udfører et script, en e-mail eller hvad som helst.

Hvad er hvisken

Whisper er en volumengenkendelsesmodel, fungerer på flere sprog med et stort antal sprog og tillader oversættelse til engelsk. Det er, hvad vi kender som et tekst-til-stemme-værktøj, men dette er Open Source, udgivet af OpenAI-teamet, skaberne af Stable Diffusion.

Efterlad en kommentar