Гласов контрол на компютър и RaspberryPi с Whisper

гласово управление на компютър и raspberry pi

Идеята на проекта е давайте гласови инструкции за взаимодействие чрез нашия компютър или нашия Raspberry Pi, използвайки модела Voice-to-text Whisper.

Ние ще дадем поръчка, която ще бъде транскрибирана, преобразувана в текст с Whisper и след това анализирана, за да изпълни подходящата поръчка, която може да бъде от изпълнение на програма до подаване на напрежение към щифтовете RaspberryPi.

Ще използвам стар Raspberry Pi 2, микро USB и ще използвам модела Voice-to-text, пуснат наскоро от OpenAI, Шепот. В края на статията можете да видите още малко шепот.

всички програмирани в Питон.

Оставям ви демонстрация как работи в това видео, контролирайки компютъра с глас.

монтиране

За да го използваме с компютъра, ще ни трябва само микрофон.

Ако ще го монтираш на RaspberryPi ще ти трябва USB микрофон, защото жака който има е само за изход.

Трябва:

Тъй като основната цел на инструмента е гласова идентификация. Намирам за много полезно да го интегрирам в работата на други устройства.

  • Micro USB
  • Raspberry PI с операционна система (пример за Raspbian pro)
  • Електроника (LED, кабели, резистор 480 ома и макет)

Свързваме светодиода към пин 17, който ще активираме и деактивираме за това преживяване.

разработка на код

Разделен е на три части, първата е аудиозаписът, от който съм взел код geeksforgeeks, защото не познавам тези книжарници. Второто, преобразуването на аудио в текст с Whisper и третото, обработката на този текст и отговор в RaspberryPi

В тестовия пример ще взаимодействам само със светодиод, карайки го да свети или мига, но можем да разработим скрипта, за да го настроим според нашите нужди.

Наясно съм, че това е Raspberry Pi 2 и ще бъде много по-бавен от Raspberry Pi 4, но за тестване е добре.

Преди да можете да го накарате да работи, ще трябва да инсталирате следното

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

целият код

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

Не успях да го тествам, защото нямам microSD за RaspberryPi или USB високоговорител за свързване, но веднага щом го пробвам, коригирам някаква грешка, която лесно се вмъква.

Стъпка по стъпка обяснение на кода

#!/usr/bin/env python3

Shebang да каже на устройството на какъв език сме програмирали и какъв интерпретатор да използва. Въпреки че изглежда тривиално, непоставянето му причинява грешки в много случаи.

импортирани библиотеки

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

Шепнете да работите с модела

време, защото го използвам, за да контролирам времето, необходимо за изпълнение на скрипта, gpiozero за работа с GPIO щифтовете на Raspberry и sounddevice, scipy и wavio за запис на аудио

функции

Създадох 4 функции:

  • главен ()
  • светлина ()
  • мигам ()
  • запис_аудио()

turn on () просто дава напрежение на пин 17 на малината, където сме свързали в този случай светодиода за тестване

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

blink() е като on(), но кара светодиода да мига, като го включва и изключва в рамките на цикъл.

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

С record_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 е основната функция, забележете, че единственото нещо, което имаме извън функциите, е извикването на main() в края на скрипта. По този начин при стартиране той ще импортира библиотеките и след това ще извърши извикването на функцията.

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)

Спестяваме времето, в което започваме да изпълняваме функцията, и след това извикваме функцията за запис на аудио, която ще запише нашата инструкция във файл .wav, .mp3 и т.н., който по-късно ще конвертираме в текст

    inicio = time.time()
    record_audio ()

  

След като имаме аудиото, ще се извика шепот и ние му казваме модела, който искаме да използваме, има 5 налични и ще използваме tiny, въпреки че е най-неточен, защото е най-бързият и аудиото ще бъде просто, само 3 или 4 думи.

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

  

С това аудиото се преобразува в текст и се записва в променлива. Нека го модифицираме малко.

Преобразуваме резултата в списък с всяка от думите на аудиото

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

  

И всичко готово за взаимодействие с нашето устройство. Сега просто трябва да създадем условията, които искаме.

Ако аудиото има думата X, направете Y. Тъй като имаме думите в списък, е много лесно да добавите условия

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

  

линия

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


  

Използвам го, за да конвертирам думите в аудиото в малки букви и да премахна запетаите и точките. И по този начин избягвайте грешки в сравненията

Във всеки if, ако условието да има някоя от думите, които сме избрали е изпълнено, той извиква функция, която ще направи това, което искаме,

Това е мястото, където му казваме да активира ПИН, който ще светне светодиод или ще го накара да мига. Или стартирайте някакъв код, или изключете компютъра.

Всичко това е основна идея. От тук можете да развиете проекта и да го подобрите, както желаете. Всеки може да намери различно приложение за него.

Неща, които можем да направим с този монтаж

Това са идеи, които ми хрумват, за да се възползвам от този монтаж. След като скелетът е въоръжен, можем да го използваме, за да активираме всичко, което ни хрумне чрез глас, можем да активираме реле, което стартира двигател или можем да стартираме скрипт, който изпълнява скрипт, имейл или каквото и да било.

Какво е шепот

Whisper е модел за разпознаване на обем, работи на много езици с голям брой езици и позволява превод на английски. Това е, което познаваме като инструмент за текст към глас, но това е с отворен код, пуснат от екипа на OpenAI, създателите на Stable Diffusion.

Ако сте неспокоен човек като нас и искате да си сътрудничите в поддръжката и подобряването на проекта, можете да направите дарение. Всички пари ще отидат за закупуване на книги и материали, за да експериментирате и да правите уроци

Оставете коментар