فكرة المشروع إعطاء تعليمات صوتية للتفاعل من خلال جهاز الكمبيوتر الخاص بنا أو Raspberry Pi باستخدام نموذج Whisper Voice-to-text.
سنقدم طلبًا سيتم نسخه وتحويله إلى نص باستخدام Whisper ثم تحليله لتنفيذ الأمر المناسب ، والذي يمكن أن يكون من تنفيذ برنامج إلى إعطاء جهد لدبابيس RaspberryPi.
سأستخدم Raspberry Pi 2 القديم ، و micro USB وسأستخدم نموذج تحويل الصوت إلى نص الذي تم إصداره مؤخرًا بواسطة OpenAI ، همس. في نهاية المقال تستطيع أن ترى مزيد من الهمس.
كلها مبرمجة في بايثون.
أترك لكم عرضًا توضيحيًا لكيفية عملها في هذا الفيديو ، والتحكم في جهاز الكمبيوتر عن طريق الصوت.
متزايد
لاستخدامه مع جهاز الكمبيوتر ، سنحتاج فقط إلى ميكروفون.
إذا كنت ستقوم بتثبيته على RaspberryPi ، فستحتاج إلى ميكروفون USB ، لأن المقبس الموجود به مخصص للإخراج فقط.
نحن نحتاج:
حيث أن الغرض العام من الأداة هو التعرف على الصوت. أجد أنه من المفيد جدًا دمجها في تشغيل الأجهزة الأخرى.
- USB الصغير
- Raspberry PI مع نظام التشغيل (مثال Raspbian pro)
- إلكترونيات (LED ، أسلاك ، مقاومة 480 أوم ولوح توصيل)
نقوم بتوصيل مؤشر LED بالدبوس 17 ، وهو الذي سنقوم بتنشيطه وإلغاء تنشيطه لهذه التجربة.
تطوير الكود
وهي مقسمة إلى ثلاثة أجزاء ، الجزء الأول ، التسجيل الصوتي الذي أخذت منه رمزًا geeksforgeeks، لأنني لا أعرف تلك المكتبات. الثاني ، تحويل الصوت إلى نص باستخدام 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 وظائف:
- رئيسي ()
- خفيفة ()
- ليرمش ()
- تسجيل صوتي()
تشغيل () يعطي جهدًا للدبوس 17 من التوت حيث قمنا بتوصيل الصمام في هذه الحالة للاختبار
def encender (): LED(17).on()
يشبه blink () تشغيل () ولكنه يجعل وميض LED عن طريق تشغيله وإيقاف تشغيله داخل حلقة.
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 متاحين ، وسنستخدم صغيرًا ، على الرغم من أنه غير دقيق لأنه الأسرع وسيكون الصوت بسيطًا ، 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()
أستخدمه لتحويل الكلمات الموجودة في الصوت إلى أحرف صغيرة وإزالة الفواصل والنقاط. وبهذه الطريقة تجنب الأخطاء في المقارنات
في كل حالة إذا تم استيفاء شرط وجود أي من الكلمات التي اخترناها ، فإنه يستدعي وظيفة ستفعل ما نريد ،
هذا هو المكان الذي نطلب منه تنشيط رقم التعريف الشخصي الذي سيضيء مؤشر LED أو يجعله يومض. قم بتشغيل بعض التعليمات البرمجية أو إيقاف تشغيل الكمبيوتر.
كل هذه فكرة أساسية. من هنا يمكنك تطوير المشروع وتحسينه كما تريد. يمكن لكل شخص أن يجد استخدامًا مختلفًا له.
الأشياء التي يمكننا القيام بها مع هذا المونتاج
هذه أفكار أتت إلي للاستفادة من هذا المونتاج. بمجرد أن يتم تسليح الهيكل العظمي ، يمكننا استخدامه لتنشيط كل ما يتبادر إلى الذهن عن طريق الصوت ، ويمكننا تنشيط التتابع الذي يبدأ تشغيل محرك أو يمكننا تشغيل برنامج نصي ينفذ نصًا أو بريدًا إلكترونيًا أو أيًا كان.
ما هو الهمس
Whisper هو نموذج للتعرف على المجلد ، ويعمل بلغات متعددة مع عدد كبير من اللغات ويسمح بالترجمة إلى اللغة الإنجليزية. إنه ما نعرفه كأداة لتحويل النص إلى صوت ، أصدره فريق OpenAI ، مبتكرو Dall-e.