Stëmm Kontroll op PC an RaspberryPi mat Whisper

Stëmm Kontroll op PC an Raspberry Pi

D'Iddi vum Projet ass gitt Stëmminstruktioune fir duerch eise PC oder eise Raspberry Pi ze interagéieren mam Voice-to-Text Whisper Modell.

Mir ginn eng Uerdnung déi transkribéiert, an Text ëmgewandelt gëtt, mat Whisper an dann analyséiert fir déi entspriechend Uerdnung auszeféieren, wat vun der Ausféierung vun engem Programm ka sinn fir Spannung un d'RaspberryPi Pins ze ginn.

Ech wäert en alen Raspberry Pi 2 benotzen, e Mikro USB an ech wäert de Voice-to-Text Modell benotzen, dee viru kuerzem vun OpenAI verëffentlecht gouf, Hichschecht. Um Enn vum Artikel kënnt Dir gesinn e bësse méi geflüstert.

all programméiert an Python.

Ech verloossen Iech eng Demonstratioun wéi et an dësem Video funktionnéiert, de PC duerch Stëmm ze kontrolléieren.

Versammlung

Fir et mam PC ze benotzen, brauche mir nëmmen e Mikro.

Wann Dir et op de RaspberryPi montéiere wëllt, braucht Dir en USB Mikrofon, well de Jack deen et huet ass nëmme fir Ausgang.

Braucht:

Als allgemeng Zweck vum Tool ass Stëmm Identifikatioun. Ech fannen et ganz nëtzlech et an d'Operatioun vun aneren Apparater z'integréieren.

  • Micro USB
  • Raspberry PI mat Betribssystem (Raspbian Pro Beispill)
  • Elektronik (LED, Drot, 480 Ohm Widderstand a Broutbrett)

Mir verbannen d'LED mat Pin 17, dat ass deen deen mir fir dës Erfahrung aktivéieren an deaktivéieren.

Code Entwécklung

Et ass an dräi Deeler opgedeelt, den éischten, den Audioopnam fir deen ech e Code geholl hunn geeksforgeeks, well ech kennen déi Bicherbutteker net. Déi zweet, d'Konversioun vun Audio an Text mat Whisper an déi drëtt, d'Behandlung vun deem Text an d'Äntwert am RaspberryPi

Am Testbeispiel wäert ech nëmme mat enger Led interagéieren, sou datt et hellt oder blénkt, awer mir kënnen de Skript entwéckelen fir et un eis Bedierfnesser unzepassen.

Ech si bewosst datt dëst e Raspberry Pi 2 ass an et wäert vill méi lues sinn wéi e Raspberry Pi 4, awer fir ze testen ass et gutt.

Ier Dir et funktionnéiert, musst Dir déi folgend installéieren

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

all Code

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

Ech konnt et net testen well ech keng MicroSD fir de RaspberryPi hunn, oder en USB Lautsprecher fir ze verbannen, awer soubal ech et probéieren korrigéiere ech e Feeler datt et einfach ass ze rutschen.

Schrëtt fir Schrëtt Erklärung vum Code

#!/usr/bin/env python3

De Shebang fir dem Apparat ze soen wéi eng Sprooch mir programméiert hunn a wéi en Dolmetscher ze benotzen. Och wann et trivial schéngt, et net ze setzen verursaacht vill Geleeënheeten Feeler.

importéiert Bibliothéiken

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

Geflüstert fir mam Modell ze schaffen

Zäit, well ech et benotze fir d'Zäit ze kontrolléieren déi et brauch fir de Skript auszeféieren, gpiozero fir mat de GPIO Pins vum Raspberry ze schaffen an Sounddevice, scipy a wavio fir den Audio opzehuelen

Funktiounen

Ech hunn 4 Funktiounen erstallt:

  • Haapt ()
  • liicht ()
  • blénken ()
  • record_audio()

ausschalten () gëtt einfach Spannung un Pin 17 vum Himbeer, wou mir an dësem Fall d'LED verbonnen hunn fir ze testen

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

blink () ass wéi on () awer et mécht d'LED blénkeg andeems se se an enger Loop ausschalten an ausschalten.

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

Mat record_audio () registréiere mir d'Audiodatei

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 ass d'Haaptfunktioun, bemierkt datt dat eenzegt wat mir ausserhalb vun de Funktiounen hunn den Uruff un Main () um Enn vum Skript. Dëse Wee beim Startup importéiert d'Bibliothéiken an dann de Fonktiounsruff.

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)

Mir späicheren d'Zäit wou mir ufänken d'Funktioun auszeféieren an dann ruffe mir d'Record-Audiofunktioun déi eis Instruktioun an enger .wav, .mp3, etc. Datei ophëlt, déi mir spéider an den Text konvertéieren

    inicio = time.time()
    record_audio ()

  

Wann mir den Audio hunn, gëtt geflüstert a mir soen et de Modell dee mir benotze wëllen, et gi 5 verfügbar, a mir wäerte kleng benotzen obwuel et am meeschten onpräzis ass well et am schnellsten ass an den Audio einfach ass, nëmmen 3 oder 4 Wierder.

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

  

Mat dësem hu mir den Audio an Text ëmgewandelt an an enger Variabel gespäichert. Loosst eis et e bëssen änneren.

Mir konvertéieren d'Resultat an eng Lëscht mat all de Wierder vum Audio

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

  

An alles prett fir mat eisem Apparat ze interagéieren. Elo musse mer just déi Konditioune schafen, déi mir wëllen.

Wann den Audio d'Wuert X huet, maacht Y. Wéi mir d'Wierder an enger Lëscht hunn, ass et ganz einfach Konditioune derbäizesetzen

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

  

Linn

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


  

Ech benotzen et fir d'Wierder am Audio op kleng Buschtawen ze konvertéieren an d'Kommaen an d'Perioden ze läschen. An op dës Manéier Feeler an de Vergläicher vermeiden

An all wann d'Konditioun fir ee vun de Wierder ze hunn déi mir gewielt hunn erfëllt ass, nennt et eng Funktioun déi wäert maachen wat mir wëllen,

Dëst ass wou mir et soen fir e PIN ze aktivéieren deen eng LED beliicht oder et blénkt. Entweder e puer Code lafen, oder de Computer zoumaachen.

All dëst ass eng Basis Iddi. Vun hei aus kënnt Dir de Projet entwéckelen a verbesseren wéi Dir wëllt. All Persoun kann eng aner Notzung fir et fannen.

Saachen déi mir mat dësem Montage maache kënnen

Dëst sinn Iddien déi bei mech kommen fir vun dësem Montage ze profitéieren. Wann d'Skelett bewaffnet ass, kënne mir et benotze fir alles ze aktivéieren wat duerch Stëmm an de Kapp kënnt, mir kënnen e Relais aktivéieren deen e Motor ufänkt oder mir kënnen e Skript starten deen e Skript ausféiert, eng E-Mail oder wat och ëmmer.

Wat ass geflüstert

Whisper ass e Vol Unerkennungsmodell, funktionnéiert a Multilanguage mat enger grousser Zuel vu Sproochen an erlaabt Iwwersetzung op Englesch. Et ass wat mir wëssen als Text-zu-Stëmm-Tool, verëffentlecht vum OpenAI Team, d'Creatoren vun Dall-e.

Verloossen e Commentaire