שליטה קולית במחשב וב-RaspberryPi עם Whisper

שליטה קולית במחשב וב-raspberry pi

הרעיון של הפרויקט הוא לתת הוראות קוליות לאינטראקציה דרך המחשב האישי שלנו או ה-Raspberry Pi שלנו באמצעות מודל ה- Voice-to-text Whisper.

אנו ניתן פקודה שתתמלל, תומר לטקסט, עם Whisper ולאחר מכן ינתח לביצוע ההזמנה המתאימה, שיכולה להיות מביצוע תוכנית ועד למתן מתח לפינים של RaspberryPi.

אני הולך להשתמש ב-Raspberry Pi 2 ישן, במיקרו USB ואני אשתמש במודל הקול לטקסט ששוחרר לאחרונה על ידי OpenAI, Whisper. בסוף המאמר תוכלו לראות עוד קצת לחישה.

הכל מתוכנת פנימה פיתון.

אני משאיר לכם הדגמה של איך זה עובד בסרטון הזה, שליטה במחשב באמצעות קול.

הרכבה

כדי להשתמש בו עם המחשב, נצטרך רק מיקרופון.

אם אתה מתכוון להרכיב אותו על ה-RaspberryPi, תצטרך מיקרופון USB, כי השקע שיש לו מיועד רק לפלט.

צוֹרֶך:

שכן המטרה הכללית של הכלי היא זיהוי קולי. אני מוצא את זה מאוד שימושי לשלב אותו בתפעול של מכשירים אחרים.

  • מיקרו USB
  • Raspberry PI עם מערכת הפעלה (דוגמה של Raspbian pro)
  • אלקטרוניקה (LED, חוטים, נגד 480 אוהם ולוח לחם)

אנו מחברים את ה-LED לפין 17, שהוא זה שנפעיל ונבטל עבור החוויה הזו.

פיתוח קוד

הוא מחולק לשלושה חלקים, הראשון, הקלטת האודיו שלקחתי ממנה קוד חנונים, כי אני לא מכיר את חנויות הספרים האלה. השני, המרת אודיו לטקסט עם Whisper והשלישי, הטיפול בטקסט ובתגובה הזה ב-RaspberryPi

בדוגמה של הבדיקה אני הולך לקיים אינטראקציה רק ​​עם LED, מה שגורם לו להידלק או להבהב, אבל נוכל לפתח את הסקריפט כדי להתאים אותו לצרכים שלנו.

אני מודע לכך שזהו 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 ומכשיר הסאונד, scipy ו-wavio כדי להקליט את האודיו

פונקציות

יצרתי 4 פונקציות:

  • עיקרי ()
  • אור ()
  • למצמץ ()
  • record_audio()

הפעל () פשוט נותן מתח לפין 17 של הפטל שבו חיברנו במקרה הזה את ה-LED כדי לבדוק

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)

אנו שומרים את הזמן בו אנו מתחילים לבצע את הפונקציה ולאחר מכן אנו קוראים לפונקציית record audio שתקליט את ההוראה שלנו בקובץ .wav, .mp3 וכו' שבהמשך נמיר לטקסט

    inicio = time.time()
    record_audio ()

  

ברגע שיש לנו את האודיו, לחישה תיקרא ונספר לו באיזה דגם אנחנו רוצים להשתמש, יש 5 זמינים, ונשתמש בקטנטן, למרות שזה הכי לא מדויק כי זה הכי מהיר והשמע יהיה פשוט, רק 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()


  

אני משתמש בו כדי להמיר את המילים באודיו לאותיות קטנות ולהסיר את הפסיקים והנקודות. ובדרך זו למנוע טעויות בהשוואות

בכל אחד אם מתקיים התנאי של כל אחת מהמילים שבחרנו, זה קורא לפונקציה שתעשה מה שאנחנו רוצים,

זה המקום שבו אנו אומרים לו להפעיל PIN שידליק נורית או יגרום לה להבהב. או להפעיל קוד כלשהו, ​​או לכבות את המחשב.

כל זה הוא רעיון בסיסי. מכאן תוכלו לפתח את הפרויקט ולשפר אותו כרצונכם. כל אדם יכול למצוא לו שימוש אחר.

דברים שאנחנו יכולים לעשות עם המונטאז' הזה

אלו רעיונות שעולים לי כדי לנצל את המונטאז' הזה. ברגע שהשלד חמוש, נוכל להשתמש בו כדי להפעיל את כל מה שעולה על דעתנו בקול, נוכל להפעיל ממסר שמתניע מנוע או שנוכל להפעיל סקריפט שמבצע סקריפט, מייל או כל דבר אחר.

מה זה לחישה

Whisper הוא מודל לזיהוי נפחים, עובד בריבוי שפות עם מספר רב של שפות ומאפשר תרגום לאנגלית. זה מה שאנחנו מכירים ככלי טקסט לקול, ששוחרר על ידי צוות OpenAI, היוצרים של Dall-e.

השאירו תגובה