הרעיון של הפרויקט הוא לתת הוראות קוליות לאינטראקציה דרך המחשב האישי שלנו או ה-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 && 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.