Rheoli llais ar PC a RaspberryPi gyda Whisper

rheolaeth llais ar pc a raspberry pi

Syniad y prosiect yw rhoi cyfarwyddiadau llais i ryngweithio trwy ein PC neu ein Raspberry Pi gan ddefnyddio'r model Voice-to-text Whisper.

Byddwn yn rhoi gorchymyn a fydd yn cael ei drawsgrifio, ei drosi i destun, gyda Whisper ac yna ei ddadansoddi i weithredu'r drefn briodol, a all fod o weithredu rhaglen i roi foltedd i'r pinnau RaspberryPi.

Rwy'n mynd i ddefnyddio hen Raspberry Pi 2, micro USB a byddaf yn defnyddio'r model Llais-i-destun a ryddhawyd yn ddiweddar gan OpenAI, Sibrwd. Ar ddiwedd yr erthygl gallwch weld ychydig mwy o sibrwd.

i gyd wedi'u rhaglennu i mewn Python.

Rwy'n gadael arddangosiad i chi o sut mae'n gweithio yn y fideo hwn, gan reoli'r PC trwy lais.

Cynulliad

Er mwyn ei ddefnyddio gyda'r PC, dim ond meicroffon fydd ei angen arnom.

Os ydych chi'n mynd i'w osod ar y RaspberryPi, bydd angen meicroffon USB arnoch chi, oherwydd dim ond ar gyfer allbwn y mae'r jack sydd ganddo.

Angen:

Gan mai pwrpas cyffredinol yr offeryn yw adnabod llais. Rwy'n ei chael hi'n ddefnyddiol iawn ei integreiddio i weithrediad dyfeisiau eraill.

  • Micro USB
  • Raspberry PI gyda system weithredu (enghraifft pro Raspbian)
  • Electroneg (LED, gwifrau, gwrthydd 480 ohm a bwrdd bara)

Rydym yn cysylltu'r LED â pin 17, sef yr un y byddwn yn ei actifadu a'i ddadactifadu ar gyfer y profiad hwn.

datblygu cod

Mae wedi'i rannu'n dair rhan, y cyntaf, y recordiad sain yr wyf wedi cymryd cod ohono geeksforgeeks, oherwydd nid wyf yn gwybod y siopau llyfrau hynny. Yr ail, trosi sain i destun gyda Whisper a'r trydydd, trin y testun hwnnw a'r ymateb yn y RaspberryPi

Yn yr enghraifft brawf dim ond gyda Led y byddaf yn rhyngweithio, gan ei wneud yn goleuo neu amrantu, ond gallem ddatblygu'r sgript i'w addasu i'n hanghenion.

Rwy'n ymwybodol mai Raspberry Pi 2 yw hwn ac mae'n mynd i fod yn llawer arafach na Raspberry Pi 4, ond ar gyfer profi mae'n iawn.

Cyn i chi allu ei gael i weithio, bydd angen i chi osod y canlynol

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

yr holl god

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

Nid wyf wedi gallu ei brofi oherwydd nid oes gennyf microSD ar gyfer y RaspberryPi, na siaradwr USB i gysylltu, ond cyn gynted ag y byddaf yn ceisio ei gywiro rhywfaint o wall ei bod yn hawdd llithro i mewn.

Esboniad cam wrth gam o'r cod

#!/usr/bin/env python3

Y Shebang i ddweud wrth y ddyfais ym mha iaith yr ydym wedi rhaglennu a pha ddehonglydd i'w ddefnyddio. Er ei fod yn ymddangos yn ddibwys, mae peidio â'i roi yn achosi gwallau ar sawl achlysur.

llyfrgelloedd wedi'u mewnforio

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

Sibrwd i weithio gyda'r model

amser, oherwydd dwi'n ei ddefnyddio i reoli'r amser mae'n ei gymryd i weithredu'r sgript, gpiizero i weithio gyda phiniau GPIO y Mafon a sounddevice, scipy a wavio i recordio'r sain

Swyddogaethau

Rwyf wedi creu 4 swyddogaeth:

  • prif ()
  • golau ()
  • i blincio ()
  • record_sain()

trowch ymlaen () yn syml yn rhoi foltedd i pin 17 y mafon lle rydym wedi cysylltu yn yr achos hwn y LED i brofi

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

Mae blink() fel ar() ond mae'n gwneud y blincio dan arweiniad trwy ei droi ymlaen ac i ffwrdd o fewn dolen.

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

Gyda record_audio() rydym yn recordio'r ffeil sain

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)

Prif yw'r prif swyddogaeth, sylwch mai'r unig beth sydd gennym y tu allan i swyddogaethau yw'r alwad i brif () ar ddiwedd y sgript. Fel hyn wrth gychwyn, bydd yn mewnforio'r llyfrgelloedd ac yna'n gwneud y swyddogaeth yn galw.

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)

Rydyn ni'n arbed yr amser rydyn ni'n dechrau gweithredu'r swyddogaeth ac yna rydyn ni'n galw'r swyddogaeth recordio sain a fydd yn cofnodi ein cyfarwyddyd mewn ffeil .wav, .mp3, ac ati y byddwn yn ei throsi'n destun yn ddiweddarach

    inicio = time.time()
    record_audio ()

  

Ar ôl i ni gael y sain, bydd sibrwd yn cael ei alw ac rydyn ni'n dweud wrtho'r model rydyn ni am ei ddefnyddio, mae yna 5 ar gael, a byddwn ni'n defnyddio bach, er mai dyma'r un mwyaf anfanwl oherwydd dyma'r cyflymaf a bydd y sain yn syml, dim ond 3 neu 4 gair.

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

  

Gyda hyn mae gennym ni'r sain wedi'i drawsnewid yn destun a'i gadw mewn newidyn. Gadewch i ni ei addasu ychydig.

Rydym yn trosi canlyniad yn rhestr gyda phob un o eiriau'r sain

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

  

A phopeth yn barod i ryngweithio â'n dyfais. Nawr mae'n rhaid i ni greu'r amodau rydyn ni eu heisiau.

Os oes gan y sain y gair X, gwnewch Y. Gan fod gennym y geiriau mewn rhestr, mae'n hawdd iawn ychwanegu amodau

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

  

Y llinell

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


  

Rwy'n ei ddefnyddio i drosi'r geiriau yn y sain i lythrennau bach a thynnu'r atalnodau a'r cyfnodau. Ac yn y modd hwn osgoi gwallau yn y cymariaethau

Ym mhob un os yw'r amod o gael unrhyw un o'r geiriau rydyn ni wedi'u dewis yn cael ei fodloni, mae'n galw swyddogaeth a fydd yn gwneud yr hyn rydyn ni ei eisiau,

Dyma lle rydyn ni'n dweud wrtho am actifadu PIN a fydd yn goleuo LED neu'n ei wneud yn blincio. Naill ai rhedeg rhywfaint o god, neu gau'r cyfrifiadur i lawr.

Mae hyn i gyd yn syniad sylfaenol. O'r fan hon gallwch ddatblygu'r prosiect a'i wella fel y dymunwch. Gall pob person ddod o hyd i ddefnydd gwahanol ar ei gyfer.

Pethau y gallwn eu gwneud gyda'r montage hwn

Mae'r rhain yn syniadau sy'n dod ataf i fanteisio ar y montage hwn. Unwaith y bydd y sgerbwd wedi'i arfogi, gallwn ei ddefnyddio i actifadu popeth a ddaw i'r meddwl trwy lais, gallwn actifadu ras gyfnewid sy'n cychwyn modur neu gallwn lansio sgript sy'n gweithredu sgript, e-bost neu beth bynnag.

Beth yw sibrwd

Mae Whisper yn fodel adnabod cyfeintiau, yn gweithio mewn amlieithog gyda nifer fawr o ieithoedd ac yn caniatáu cyfieithu i'r Saesneg. Dyma'r hyn rydyn ni'n ei adnabod fel offeryn testun-i-lais, ond Ffynhonnell Agored yw hwn, a ryddhawyd gan dîm OpenAI, crewyr Stable Diffusion.

Os ydych chi'n berson aflonydd fel ni ac eisiau cydweithio i gynnal a chadw a gwella'r prosiect, gallwch chi wneud cyfraniad. Bydd yr holl arian yn mynd i brynu llyfrau a deunyddiau i arbrofi a gwneud tiwtorialau

Gadael sylw