Control per veu a PC i RaspberryPi amb Whisper

control per veu en pc i raspberry pi

La idea d'el projecte és donar instruccions de veu per interactuar a través del nostre PC o de la nostra Raspberry Pi utilitzant el model Voice-to-text Whisper.

Donarem una ordre que serà transcrita, convertida a text, amb Whisper i aleshores analitzada per executar l'ordre adequada que pot ser des d'executar algun programa a donar voltatge als pins de la RaspberryPi.

Jo faré servir una vella Raspberry Pi 2, un micro USB i utilitzaré el model de Voice-to-text acabat d'alliberar per OpenAI, Xiuxiueig. Al final de l'article podeu veure una mica més de Whisper.

Tot programat a Pitó.

Et deixo una demostració de com funciona en aquest vídeo, controlant per veu el PC.

Muntatge

Per fer-lo servir amb el PC, només necessitarem un micròfon.

Si fas el muntatge a la RaspberryPi, necessitaràs un micròfon USB, perquè el jack que té només és de sortida.

necessitem:

Com que el propòsit general de l'eina és la identificació de veu. Em sembla molt útil per integrar-lo al funcionament d'altres dispositius.

  • Micro USB
  • Raspberry PI amb sistema operatiu (Raspbian pro exemple)
  • Electrònica (LED, cables, resistència 480 ohm i placa protoboard)

Connectem el LED al pin 17 qeu és el que activarem i desactivarem per a aquesta experiència.

Desenvolupament del codi

Es divideix en tres parts, la primera, l'enregistrament d'àudio per a la qual he agafat un codi de Geeksforgeeks, perquè aquestes llibreries no les conec. La segona, la conversió de l'àudio a text amb Whisper i la tercera el tractament d'aquest text i resposta a la RaspberryPi

A l'exemple de prova només interactuaré amb un Led, fent que s'encengui o parpellegi, però podríem desenvolupar l'script per ajustar-lo a les nostres necessitats.

Sóc conscient que això és una Raspberry Pi 2 i anirà molt més lent que en una Raspberry Pi 4, però per a les proves em val.

Abans de fer-ho funcionar, hauràs d'instal·lar el següent

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

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

No he pogut testejar-ho perquè no tinc microSD per a la RaspberryPi, ni altaveu USB per connectar, però així que ho provi corregeixo algun error que és fàcil que s'hagi colat.

Explicació pas a pas del codi

#!/usr/bin/env python3

El Shebang per dir-li al dispositiu en quin llenguatge hem programat i quin intèrpret deu utilitzar. Encara que sembla una cosa trivial, no posar-ho causa errors moltes vegades.

Llibreries importades

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

Whisper per treballar amb el model

time, perquè la utilitzo per controla el teimp que triga a executar-se l'script, gpiozero per treballar amb els piens GPIO de la Raspberry i sounddevice, scipy i wavio per gravar l'àudio

Les funcions

He creat 4 funcions:

  • main ()
  • encendre ()
  • parpellejar ()
  • record_àudio ()

encendre () simplement dóna tensió al pin 17 de la raspberry on tenim connectat en aquest cas el LED per provar

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

parpellejar () és com encendre () però fa que parpellegi el led encenent-lo i apagant-lo dins d'un bucle.

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

Amb record_audio() enregistrem el fitxer d'àudio

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 és la funció principal, fixa't que l'única cosa que tenim fora de funcions és la crida a main () al final de l'script. D'aquesta manera en iniciar-se, importarà les llibreries i després fa la trucada a la funció.

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)

Desem l'hora a la que comencem a executar la funció i després cridem a la funció de gravar àudio que gravarà la nostra instrucció en un fitxer .wav, .mp3, etc que convertirem després a text

    inicio = time.time()
    record_audio ()

  

Un cop tenim l'àudio, es trucarà a whisper i li diem el model que volem utilitzar, n'hi ha 5 disponibles, i farem servir tiny encara que és el més imprecís perquè és el més ràpid i l'àudio serà senzill, tan sols 3 o 4 paraules .

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

  

Amb això tenim l'àudio convertit a text i desat en una variable. La modificarem una mica.

Convertim result en una llista amb cadascuna de les paraules de l'àudio

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

  

I tot llest per interactuar amb el nostre dispositiu. Ara només hem de crear les condicions que vulguem.

Si l'àudio té la paraula X fer Y. Com que tenim les paraules en una llista resulta molt senzill anar afegint condicions

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

  

la línia

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


  

La utilitzo per convertir les paraules de l'àudio en minúscules i treure les comes i punts. I així evitar que hi hagi errors en les comparacions

A cada if si es compleix la condició de tenir alguna de les paraules que hem triat crida a una funció que farà el que vulguem,

És aquí on us diem que activeu un PIN que engegarà un LED o que el faci parpellejar. O bé que executeu un codi, o apagueu l'ordinador.

Tot això és una idea bàsica. A partir d'aquí pots desenvolupar el projecte i millorar-lo com vulguis. Cada persona pot trobar una utilitat diferent.

Coses que podem fer amb aquest muntatge

Això són idees que em sorgeixen per aprofitar aquest muntatge. Un cop amb l'esquelet armat ja podem utilitzar-lo per activar per veu tot el que se'ns acudeixi, podem activar un relé que engegui un motor o podem llançar un script que executi algun script, un mail o el que sigui.

Què és Whisper

Whisper és un model de reconeixement de vol, treballa en multidioma amb una gran quantitat de llenguatges i permet la traducció a l'anglès. És el que coneixem com una eina text-to-voice, però aquesta és Open Source, alliberada per l'equip d'OpenAI, els creadors de Stable Diffusion.

Deixa un comentari