يحتاج المساعدون المنزليون إلى عبارات خاصة تسمى الكلمات المهمة لتنشيطها (على سبيل المثال، "OK Google"). EfficientWord-Net هو محرك للكشف عن الكلمات المهمة يعتمد على التعلم المحدود الذي يسمح للمطورين بإضافة كلمات مهمة مخصصة إلى برامجهم دون رسوم إضافية. المكتبة مكتوبة بالكامل بلغة Python وتستخدم تطبيق TFLite من Google لاستدلال أسرع في الوقت الفعلي. إنه مستوحى من بنية الشبكة السيامية الخاصة بـ FaceNet ويعمل بشكل أفضل عندما يتم جمع 3-4 عينات من الكلمات المهمة مباشرةً من المستخدم.
ملف التدريب للوصول إلى ملف التدريب.
وهنا الروابط:
ورقة بحثية للوصول إلى ورقة بحثية.
تعمل هذه المكتبة مع إصدارات بايثون 3.6 إلى 3.9.
قبل تشغيل أمر تثبيت النقطة للمكتبة، يلزم تثبيت بعض التبعيات يدويًا:
قد يتعين على مستخدمي Mac OS M* وRaspberry Pi تجميع هذه التبعيات.
لا يمكن إدراج حزمة tflite في ملف require.txt، وبالتالي سيتم تثبيتها تلقائيًا عند تهيئة الحزمة في النظام.
حزمة librosa غير مطلوبة لحالات الاستدلال فقط. ومع ذلك، عند استدعاء generate_reference
، سيتم تثبيته تلقائيًا.
قم بتشغيل أمر النقطة التالي:
pip install EfficientWord-Net
لاستيراد الحزمة:
import eff_word_net
بعد تثبيت الحزم، يمكنك تشغيل البرنامج النصي التجريبي المدمج في المكتبة (تأكد من أن لديك ميكروفونًا يعمل).
الوصول إلى الوثائق من: https://ant-brain.github.io/EfficientWord-Net/
أمر تشغيل الديمو:
python -m eff_word_net.engine
بالنسبة لأي كلمة مهمة جديدة، تحتاج المكتبة إلى معلومات حول الكلمة المهمة. يتم الحصول على هذه المعلومات من ملف يسمى {wakeword}_ref.json
. على سبيل المثال، بالنسبة لكلمة التنبيه "alexa"، ستحتاج المكتبة إلى الملف المسمى alexa_ref.json
.
يمكن إنشاء هذه الملفات بالإجراء التالي:
اجمع من 4 إلى 10 نطقًا فريدًا لكلمة تنبيه معينة. ضعها في مجلد منفصل لا يحتوي على أي شيء آخر.
وبدلاً من ذلك، استخدم الأمر التالي لإنشاء ملفات صوتية لكلمة معينة (يستخدم IBM neural TTS demo API). من فضلك لا تبالغ في استخدامه لمصلحتنا:
python -m eff_word_net.ibm_generate
python -m eff_word_net.generate_reference
يجب تمرير اسم مسار كلمة Wakeword المُنشأة إلى مثيل HotwordDetector:
HotwordDetector (
hotword = "hello" ,
model = Resnet_50_Arc_loss (),
reference_file = "/full/path/name/of/hello_ref.json" ,
threshold = 0.9 , # min confidence required to consider a trigger
relaxation_time = 0.8 # default value, in seconds
)
يمكن أن يتلقى متغير النموذج مثيل Resnet_50_Arc_loss أو First_Iteration_Siamese.
يتم استخدام المعلمة Relax_time لتحديد الحد الأدنى من الوقت بين أي مشغلين. سيتم إلغاء أي مشغلات محتملة قبل وقت الاسترخاء. يعمل الكاشف على نهج النافذة المنزلقة، مما يؤدي إلى مشغلات متعددة لنطق واحد للكلمة المهمة. يمكن استخدام المعلمة Relax_time للتحكم في المشغلات المتعددة؛ في معظم الحالات، ستكون 0.8 ثانية (افتراضية) كافية.
تحتوي المكتبة على عمليات تضمين محددة مسبقًا ومتاحة لعدد قليل من كلمات التنبيه مثل Mycroft و Google و Firefox و Alexa و Mobile و Siri . مساراتها متاحة بسهولة في دليل تثبيت المكتبة.
from eff_word_net import samples_loc
import os
from eff_word_net . streams import SimpleMicStream
from eff_word_net . engine import HotwordDetector
from eff_word_net . audio_processing import Resnet50_Arc_loss
from eff_word_net import samples_loc
base_model = Resnet50_Arc_loss ()
mycroft_hw = HotwordDetector (
hotword = "mycroft" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "mycroft_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2
)
mic_stream = SimpleMicStream (
window_length_secs = 1.5 ,
sliding_window_secs = 0.75 ,
)
mic_stream . start_stream ()
print ( "Say Mycroft " )
while True :
frame = mic_stream . getFrame ()
result = mycroft_hw . scoreFrame ( frame )
if result == None :
#no voice activity
continue
if ( result [ "match" ]):
print ( "Wakeword uttered" , result [ "confidence" ])
توفر المكتبة طريقة حسابية سهلة لاكتشاف كلمات مهمة متعددة من تدفق معين، بدلاً من تشغيل scoreFrame()
لكل كلمة تنبيه على حدة
import os
from eff_word_net . streams import SimpleMicStream
from eff_word_net import samples_loc
print ( samples_loc )
base_model = Resnet50_Arc_loss ()
mycroft_hw = HotwordDetector (
hotword = "mycroft" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "mycroft_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2
)
alexa_hw = HotwordDetector (
hotword = "alexa" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "alexa_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2 ,
#verbose=True
)
computer_hw = HotwordDetector (
hotword = "computer" ,
model = base_model ,
reference_file = os . path . join ( samples_loc , "computer_ref.json" ),
threshold = 0.7 ,
relaxation_time = 2 ,
#verbose=True
)
multi_hotword_detector = MultiHotwordDetector (
[ mycroft_hw , alexa_hw , computer_hw ],
model = base_model ,
continuous = True ,
)
mic_stream = SimpleMicStream ( window_length_secs = 1.5 , sliding_window_secs = 0.75 )
mic_stream . start_stream ()
print ( "Say " , " / " . join ([ x . hotword for x in multi_hotword_detector . detector_collection ]))
while True :
frame = mic_stream . getFrame ()
result = multi_hotword_detector . findBestMatch ( frame )
if ( None not in result ):
print ( result [ 0 ], f",Confidence { result [ 1 ]:0.4f } " )
الوصول إلى وثائق المكتبة من هنا: https://ant-brain.github.io/EfficientWord-Net/
إليك النسخة المصححة من الملف README.md مع القواعد النحوية والتنسيق المحسنين:
أداء كاشف الكلمات المهمة الخاص بنا أقل بشكل ملحوظ مقارنةً بـ Porcupine. لقد فكرنا في تصميمات NN أفضل للمحرك ونأمل أن نتفوق على Porcupine. لقد كان هذا هو مشروعنا الجامعي، لذا فإن دعمكم وتشجيعكم سيحفزنا على تطوير المحرك بشكل أكبر. إذا كنت تحب هذا المشروع، أوصي به لزملائك، أعطنا ؟ على جيثب، والتصفيق؟ على المتوسط.
تحديث: شجعنا نجومك على إنشاء نموذج جديد أفضل بكثير. دعونا نجعل هذا المجتمع ينمو!
ترخيص أباتشي 2.0