في المدرسة ، كان لدي زميل في الفصل يستطيع أن يستمع إلى كيفية عمل السيارة في الفناء ، وبوجه جسيم يصدر حكمًا: كل شيء على ما يرام ، أو أنه قد تم كسر شيء ما ، وأحتاج بشدة إلى الركض بحثًا عن قطع غيار / زيت / أدوات جديدة! أنا ، مثل إبريق الشاي المطلق في مجال صناعة السيارات ، سمعت دائمًا حشرجة الموت المعتادة في dvenashka التالية ، دون أن ألاحظ وجود أي اختلافات وأتعجب بصمت في سمعه ومهاراته.
الآن لم أفهم أفضل ما في الدواخل الجانبية للسيارة ، لكنني بدأت العمل في معالجة الإشارات الصوتية والتعلم الآلي ، وسنحاول هنا فهم ما إذا كان من الممكن تعليم جهاز كمبيوتر للكشف عن تشوهات صوت المحرك؟
كحد أدنى ، من المثير للاهتمام التحقق ، وفي المستقبل ، يمكن لهذه التقنية أن توفر الكثير من المال لأصحاب السيارات. في رأيي على الأقل ، تحدث الإخفاقات الحرجة تدريجياً تحت الغطاء ، وفي المراحل المبكرة ، يمكن سماع الكثير منها ، بسرعة وبثمن بخس ، مما يوفر الوقت والمال والأعصاب المهتزة بالفعل.
حسنًا ، ربما حان الوقت للانتقال من الأقوال إلى الأفعال. دعنا نذهب!
أريد أن أقول على الفور أنه في كل ما يتعلق بالرياضيات والخوارزميات ، سأركز بشكل أكبر على المعنى والفهم ، ولن تكون هناك صيغ وحسابات رياضية هنا. لم أقم بتطوير أي خوارزميات جديدة هنا ؛ بالنسبة للصيغ ، إذا كنت ترغب في ذلك ، فمن الأفضل استخدام google و Wikipedia ، وكذلك استخدام الروابط التي سأتركها خلال المقالة.
سأقدم كل التوضيحات على مثال صوت محرك مكسور مأخوذ من هذا الفيديو على YouTube .
الملف الذي تم تنزيله من YouTube (يمكنك تنزيله باستخدام ملحقات المستعرض أو ببساطة عن طريق تغيير رابط youtube إلى ssyoutube) نقوم بتحويله إلى صيغة wav باستخدام ffmpeg:
ffmpeg -i input_video.mp4 -c:a pcm_s16le -ar 16000 -ac 1 engine_sound.wav
قبل البدء في معالجة هذا الملف ، سأقول بضع كلمات حول ماهية الطيفية وكيف سيكون مفيدًا لنا في حل هذه المشكلة. من المؤكد أن الكثير منكم قد رأى صورة مماثلة - هذا هو التمثيل الزمني للسعة أو رسم الذبذبات.
إذا كان المصطلح ، بعبارات بسيطة ، هو موجة ، ويتم ملاحظة قيم السعة لهذه الموجة على رسم الذبذبات في أوقات معينة.
للحصول على طيفية من مثل هذا التمثيل ، نحتاج إلى تحويل فورييه. بمساعدتها ، يمكنك الحصول على تمثيل تردد السعة للصوت أو طيف الاتساع. يوضح هذا الطيف مدى التردد وبأي سعة يتم التعبير عن الإشارة قيد الدراسة.
في الواقع ، الطيفية عبارة عن مجموعة من أطياف القطع القصيرة المتتالية للإشارة. ربما يكون مثل هذا "التعريف" كافيا لكي لا ننصرف كثيرا عن المهمة. يصبح كل شيء أكثر وضوحًا إذا نظرت إلى التصور الطيفي (تم الحصول على الصورة باستخدام WaveAssistant ). يتم رسم الوقت على المحور X ، التردد على المحور ص ، أي أن كل عمود في هذه المصفوفة هو معامل الطيف في وقت معين.

يوضح هذا الطيفية أن صوت المحرك في حالة عدم النقر على "يبدو" عن نفسه ، ويتم التعبير عنه على ترددات في محيط 600 و 1200 و 2400 و 4800 هرتز. إن صوت الضربة التي تزعج المالك مميزة للغاية في نطاق الترددات 600-1200 هرتز من 5 إلى 8 ثوان. نظرًا لأن التسجيل تم في ظروف صاخبة إلى حد ما في الشارع ، فهذه الضوضاء موجودة أيضًا على المخطط الطيفي ، مما يؤدي إلى تعقيد مهمتنا إلى حد ما.
ومع ذلك ، عند النظر إلى مثل هذا الطيف ، يمكننا أن نقول بثقة مكان الضربة وأين لم يكن. الكمبيوتر ليس لديه عيون ، لذلك ، نحن بحاجة إلى تحديد خوارزمية تكون قادرة على التمييز بين هذا الانحراف (ويفضل ألا يقتصر الأمر على ذلك) ، رهنا بوجود ضوضاء في التسجيل.
يمكن حساب Spectrograms باستخدام مكتبة librosa على النحو التالي:
from librosa.util import buf_to_float from librosa.core import stft
قرار
بالمعنى الدقيق للكلمة ، نحتاج إلى حل مشكلة التصنيف الثنائي ، حيث نحتاج إلى تحديد ما إذا كان المحرك مكسورًا أو يعمل بشكل طبيعي. لقد وصفت أنا وزميلي بالفعل مهام مماثلة في مقالتنا السابقة ، حيث استخدمنا شبكة عصبية تلافيفية لتصنيف الأحداث الصوتية. هنا ، مثل هذا الحل لا يكاد يكون ممكنا: الخلايا العصبية مولعة جدا عندما يتم إعطاء مجموعات البيانات الكبيرة. نحن نتعامل مع مسافة بادئة واحدة تدوم أكثر قليلاً من دقيقة واحدة ، ومن الواضح أنه لا يمكن أن يطلق عليها مجموعة بيانات كبيرة.
تم إيقاف الاختيار على طراز Gaussian Mixture (نموذج من خلطات Gaussian). يمكن الاطلاع على مقال جيد يوضح بالتفصيل مبدأ التشغيل والتدريب لهذا النموذج ، والفكرة العامة لهذا النموذج هي وصف البيانات باستخدام توزيع معقد في شكل مزيج خطي من عدة توزيعات طبيعية متعددة الأبعاد (المزيد حول التوزيع الطبيعي متعدد الأبعاد هنا ).
نظرًا لأن المحرك أثناء تشغيله يبدو "مماثلًا" تقريبًا ، يمكن اعتبار صوت تشغيله ثابتًا ، ويبدو أن فكرة وصف هذا الصوت باستخدام مثل هذا التوزيع ذات مغزى. لفهم جوهر GMM ، أوصي بشدة بالنظر في مثال للتدريب واختيار عدد من gaussoids هنا .
تختلف حالتنا عن الأمثلة أعلاه في أنه بدلاً من النقاط على مستوى ثنائي الأبعاد ، سيتم استخدام قيم الطيف المأخوذة من مخطط الطيف الإشاري. يمكنك تحديد معلمات التوزيع ، مثل نوع مصفوفة التغاير باستخدام معيار BIC ( مثال ، وصف ) ، ومع ذلك ، في حالتي ، أظهرت المعلمات المثلى من وجهة نظر هذا المعيار نفسها أسوأ من تلك الموضحة في الكود أدناه:
from sklearn.mixture import GaussianMixture n_components = 3 gmm_clf = GaussianMixture(n_components) gmm_clf.fit(X_train)
على افتراض أن صوت التشغيل العادي موصوف بواسطة توزيع تم تحديد معلماته أثناء عملية التدريب ، فمن الممكن قياس مدى قرب أي صوت من هذا التوزيع.
للقيام بذلك ، يمكنك حساب متوسط احتمال أعمدة الطيفية للإشارة قيد الدراسة ، ثم اختر عتبة تفصل احتمال أصوات العمل الجيد عن جميع الأعمدة الأخرى. المصداقية لكل ثانية هي كما يلي:
n_seconds = len(full_wav_data) // sr gmm_scores = []
إذا عرضت الاحتمالية التي تم الحصول عليها على الرسم البياني ، فسنحصل على الصورة التالية.
يُظهر الجزء العلوي الطيفية للإشارة المعروضة باستخدام مكتبة matplotlib. لا يمكن ملاحظة التغييرات التي تحدثها عن طريق النقر على النحو الوارد في المثال أعلاه (وهذا هو السبب في أنك رأيت صورتين هنا). ومع ذلك ، إذا نظرت عن كثب ، لا يزال من الممكن رؤيتها. الخطوط العمودية تحدد بداية ونهاية أوقات الضرب.

النتائج
كما ترون من الرسم البياني ، في وقت صوت الضربة ، انخفض الاحتمال حقًا دون العتبة ، مما يعني أنه يمكننا فصل هاتين الفئتين (العمل مع وبدون طرق). لكن يجب أن أقول إن هذه القيمة قريبة بما فيه الكفاية من العتبة وفي المناطق التي لا يسمع فيها المغلوب. هذا بسبب وجود ضوضاء غريبة في التسجيل ، مما يؤثر أيضًا على الاحتمالية.
نضيف هنا التدريب في بضع ثوان فقط من الصوت ، وظروف التسجيل الرديئة ، ويمكنك بالفعل أن تفاجأ على الإطلاق بأن التجربة كانت ناجحة إلى حد ما!
على الأرجح ، من أجل وضع هذه الطريقة موضع التنفيذ والتأكد من موثوقيتها ، سيتعين عليك تسجيل صوت أكثر من ذلك بكثير ، وكذلك وضع الميكروفون جيدًا لتقليل الضوضاء الناتجة عن إدخال التسجيلات.
هذه المقالة مجرد محاولة لحل مشكلة مماثلة ، وليس المطالبة بصحة مطلقة ، إذا كانت لديك أفكار واقتراحات ، أو ربما أسئلة ، فلنناقشها معًا في التعليقات أو شخصيًا.
رمز جيثب الكامل هنا