غالبًا ما يحدث ذلك عندما يكون هناك الكثير من التحويلات ، ويكون سعرها مقبولاً ، ولا تنمو المبيعات بل تنخفض. هنا التحليلات "قبل الربح لكل نقرة" لم تعد كافية لمعرفة السبب. ثم يأتي التحليل "قبل الربح من المدير" للإنقاذ. لأنه بغض النظر عن الطريقة المثالية لإعداد الإعلان ، يتفاعل العملاء أولاً مع المديرين ، وبعد ذلك فقط يتخذون القرار. يعتمد نجاح عملك على جودة عمل الموظفين.
تستخدم أنظمة التحليلات التقليدية CRM لتسجيل حقيقة البيع / الاتصال بمدير. ومع ذلك ، فإن هذا النهج لا يحل المشكلة إلا جزئيًا: فهو يقيم كفاءة الموظف "في المحصلة النهائية". أي أنه يُظهر المبيعات والتحويل ، لكنه يترك التواصل مع العميل "في الخارج". لكن النتيجة تعتمد على مستوى الاتصال.
لسد الفجوة ، قمنا بتطوير أداة ستربط تلقائيًا كل مكالمة بالمدير الذي تعامل معها. لا يتعين عليك استخدام CRM وخدمات الجهات الخارجية. في الواقع ، يضع نظامنا علامة "اسم المدير" على كل مكالمة واردة.
لذلك سيتحكم رؤساء قسم المبيعات / خدمة العملاء في جودة العمل ، والعثور على مناطق المشكلات وبناء التحليلات. سيساعد في ذلك التقسيم السريع للمكالمات إلى المديرين الذين يستقبلونها.
صياغة المشكلة
المهمة التي حددناها لأنفسنا هي كما يلي: دع النظام يعرف أنماط الكلام لجميع المديرين الذين يمكنهم تلقي المكالمات. ثم بالنسبة للمكالمة الجديدة ، يلزمك وضع علامة على المدير ، الذي يكون صوته هو الأكثر "تشابهًا" في المحادثة من قائمة الأصوات المعروفة.
في هذه الحالة ، يعتبر أن المكالمة الهاتفية الجديدة ناجحة. أي أن المحادثة بين المدير والعميل حدثت بالفعل. بشكل غير رسمي ، يمكن أن تُنسب هذه المهمة إلى فئة مهام "التدريس مع المعلم" ، أي التصنيف.
ككائنات - تسجيلات صوتية متجهة (رقمية) بطريقة ما ، حيث يكون صوت المدير فقط هو الصوت. الردود عبارة عن تصنيفات فئة (أسماء مديرين). ثم تكون مهمة خوارزمية العلامات هي:
- استخراج ميزات ذات مغزى من الملفات الصوتية
- اختيار خوارزمية التصنيف الأنسب
- تعلم الخوارزمية وحفظ نماذج المدير
- تقييم جودة الخوارزمية وتعديل معاملاتها
- وضع علامات (تصنيف) على المكالمات الجديدة
تقع بعض هذه المهام في مهام فرعية منفصلة. هذا يرجع إلى تفاصيل الظروف التي يجب أن تعمل الخوارزمية فيها. عادة ما تكون المكالمات الهاتفية صاخبة. يمكن للعميل في محادثة واحدة التواصل مع العديد من المديرين. أيضًا ، لن يتم ذلك على الإطلاق ، وغالبًا ما تتضمن المكالمات الرد الصوتي التفاعلي ، إلخ.
على سبيل المثال ، يمكن تقسيم مهمة وضع علامات على المكالمات الجديدة إلى:
- التحقق من الدعوة للنجاح (حقيقة وجود مكالمة)
- تقسيم الاستريو إلى مسارات أحادية
- تصفية الضوضاء
- تحديد مناطق الكلام (ترشيح الموسيقى والأصوات الغريبة الأخرى)
في المستقبل سوف نتحدث عن كل مهمة فرعية من هذا القبيل على حدة. في غضون ذلك ، سنقوم بصياغة القيود الفنية التي نفرضها على بيانات الإدخال ، والحل الناتج ، وكذلك على خوارزمية التصنيف نفسها.
قيود الحل
تملي الحاجة إلى القيود جزئيًا من خلال تقنية ومتطلبات تعقيد التنفيذ ، وكذلك من خلال التوازن بين عالمية الخوارزمية ودقة تشغيلها.
القيود على ملف الإدخال وملفات عينات التدريب:
- التنسيق - wav أو wave (يمكنك إعادة ترميزه إلى mp3)
- يجب تقسيم الستيريو لاحقًا إلى مسارين - المشغل والعميل
- معدل أخذ العينات - 16000 هرتز وما فوق
- عمق البت - من 16 بت وأكثر
- يجب ألا يقل طول ملف تدريب النموذج عن 30 ثانية وأن يحتوي فقط على صوت مدير معين
- , , ,
تمت صياغة جميع المتطلبات المذكورة أعلاه باستثناء آخر واحد نتيجة لسلسلة من التجارب التي أجريت في مرحلة إعداد الخوارزميات. أثبت هذا المزيج أنه الأكثر فعالية من حيث تقليل احتمالية الخطأ ، أي سوء التصنيف في ظل ظروف ضبط سهلة.
على سبيل المثال ، من الواضح أنه كلما زاد طول الملف في مجموعة التدريب ، كلما كان المصنف أكثر دقة. ولكن كلما زادت صعوبة العثور على مثل هذا الملف في سجل المكالمات (نموذج التدريب الخاص بنا). لذلك ، تعد مدة 30 ثانية بمثابة حل وسط بين دقة الإعدادات وتعقيدها. الشرط الأخير (النجاح) ضروري. يجب ألا يقوم النظام بوضع علامة على مدير لمكالمة لم تكن هناك محادثة فعلية.
أدت قيود الخوارزمية إلى الحل التالي:
- , . « ». . - , .
- . , , .
الشرط الأول جاء من التجريب. ثم اتضح أن المدير "المجهول" يعقد بنية الحل. لهذا من الضروري تحديد العتبات التي سيتم بعدها تصنيف الموظف على أنه "غير معترف به". أيضًا ، يقلل المدير "غير المعروف" الدقة بمقدار 10 نقاط مئوية.
بالإضافة إلى ذلك ، يظهر خطأ من النوع الثاني عندما يتم تصنيف مدير معروف على أنه غير معروف. يتراوح احتمال حدوث مثل هذا الخطأ من 7 إلى 10 ٪ ، اعتمادًا على عدد الأخطاء المعروفة. يمكن أن يسمى هذا الشرط أساسي. يُلزم موالف الخوارزمية بالإشارة إلى جميع المديرين في عينة التدريب. وأيضًا تقديم نماذج للموظفين الجدد هناك وإزالة أولئك الذين تركوا العمل.
يأتي المطلب الثاني من الاعتبارات العملية وبنية الخوارزمية التي نستخدمها. باختصار ، تقسم الخوارزمية الصوت الذي تم تحليله إلى أجزاء كلام و "تقارن" كل منها بكل نماذج المدير المدربة واحدة تلو الأخرى.
نتيجة لذلك ، يتم تعيين "علامة مصغرة" لكل جزء من الأجزاء الصغيرة. باستخدام هذا النهج ، هناك احتمال كبير بأن يتم التعرف على بعض الأجزاء بشكل غير صحيح. على سبيل المثال ، إذا ظلوا صاخبين أو كان طولهم قصيرًا جدًا.
بعد ذلك ، إذا تم عرض جميع "العلامات المصغرة" في الحل النهائي ، فسيتم عرض الكثير من "المهملات" بالإضافة إلى علامة المدير الحقيقي. لذلك ، يتم عرض العلامة "الأكثر تكرارًا" فقط.
وصف بيانات الإدخال / الإخراج
سنقسم بيانات الإدخال إلى نوعين:
البيانات عند مدخلات الخوارزمية لتوليد نماذج المديرين (بيانات للتدريب):
- ملف صوتي + تسمية فئة
البيانات عند إدخال خوارزمية وضع العلامات (بيانات للاختبار / التشغيل العادي):
- بيانات خارجية (ملف صوتي)
- البيانات الداخلية (النماذج المحفوظة)
يتم تقسيم الإخراج أيضًا إلى نوعين:
- بيانات الإخراج لخوارزمية توليد النموذج
- نماذج المديرين المدربين
- الإخراج من خوارزمية وضع العلامات
- علامة المدير
عند إدخال الخوارزمية ، في أي وضع لتشغيلها ، يتم استلام ملف صوتي يفي بالمتطلبات. هم في قسم "القيود".
عند إدخال خوارزمية إنشاء النموذج ، يُسمح بأن تتوافق عدة ملفات إدخال مع فئة واحدة (مدير). لكن لا يمكن أن يتوافق ملف واحد مع مديرين متعددين. يمكن وضع اسم تسمية الفئة في اسم الملف. أو قم فقط بإنشاء دليل منفصل لكل موظف.
تولد خوارزمية التدريب النموذجية القائمة على المدخلات العديد من النماذج التي يمكن تحميلها أثناء التدريب. يتوافق عددهم مع عدد العلامات المختلفة في مجموعة الملفات الصوتية.
وبالتالي ، إذا كانت هناك ملفات M مميزة بعلامة n تسميات الفصل المختلفة ، تقوم الخوارزمية بإنشاء نماذج n للمديرين في مرحلة التدريب:
- Model_manager_1.pkl
- Model_manager_2.pkl
- ...
- Model_manager_n.pkl
حيث بدلاً من " manager _... " هو اسم الفصل.
المدخلات إلى خوارزمية وضع العلامات عبارة عن ملف صوتي غير مسمى ، حيث توجد مسبقًا محادثة بين المدير والعميل ، بالإضافة إلى نماذج الموظفين. نتيجة لذلك ، تقوم الخوارزمية بإرجاع علامة - اسم فئة المدير "الأكثر قبولًا".
معالجة البيانات
تتم معالجة الملفات الصوتية مسبقًا. إنه متسلسل ويعمل في وضع العلامات وفي وضع التدريب النموذجي:
- التحقق من نجاح المكالمة - فقط في مرحلة وضع العلامات
- تقسيم الاستريو إلى مسارين أحاديين والعمل الإضافي فقط مع مسار المشغل
- الرقمنة - استخراج معلمات الإشارة الصوتية
- تصفية الضوضاء
- إزالة فترات التوقف "الطويلة" - تحديد الأجزاء بالصوت
- تصفية الأجزاء غير الكلامية - إزالة الموسيقى والخلفية وما إلى ذلك.
- اندماج الشظايا بالكلام (فقط في مرحلة التدريب)
لن نتطرق إلى مرحلة التحقق من النجاح. هذا موضوع لمقال منفصل. باختصار ، جوهر المسرح هو أن المكالمة مصنفة حسب ما إذا كانت هناك محادثة "أناس أحياء" فيها. نعني بكلمة "أشخاص أحياء" عميلاً ومديرًا ، وليس مساعدًا صوتيًا ، أو موسيقى ، وما إلى ذلك.
يتم التحقق من نجاح المكالمة باستخدام مُصنِّف مُدرَّب بشكل خاص مع حد خارجي - "الحد الأدنى لمدة المحادثة التي تعتبر بعدها المكالمة ناجحة".
في المرحلة الثانية ، يتم تقسيم ملف الاستريو إلى مسارين: المدير والعميل. يتم إجراء مزيد من المعالجة فقط لمسار الموظف.
في مرحلة الرقمنة ، يتم استخراج معلمات "الميزة" من مسار المشغل ، والتي تمثل التمثيل الرقمي للإشارة. نحن في Calltouch نستخدم مكونات الطباشير cepstral. بالإضافة إلى ذلك ، يتم استخراج المعلمات على جزء صغير جدًا يسمى عرض النافذة (0.025 ثانية). في هذه الحالة ، يتم تطبيع جميع الميزات.
nfft=2048 //
appendEnergy = False
def get_MFCC(sr,audio): // , sr=16000 -
features = mfcc.mfcc(audio, sr, 0.025, 0.01, 13, 26, nfft, 0, 1000, appendEnergy)
features = preprocessing.scale(features)
return features
count = 1
features = np.asarray(()) //
for path in file_paths: //
path = path.strip()
sr,audio = read(source + path) //
vector = get_MFCC (sr, audio) #
if features.size == 0:
features = vector
else:
features = np.vstack((features, vector))
عند الإخراج ، يتحول كل ملف صوتي إلى مصفوفة ، يتم فيها تسجيل خصائص mel-cepstral لكل جزء من 0.025 ثانية سطرًا بسطر.
تتمثل المعالجة الإضافية للملف في تصفية الضوضاء ، وإزالة فترات التوقف الطويلة (وليس التوقف المؤقت بين الأصوات) ، والبحث عن الكلام. يمكن إنجاز هذه المهام باستخدام أدوات مختلفة. في حلنا ، استخدمنا طرقًا من مكتبة تحليل الصوت:
clear_noise(fname,outname,ch_n) # .
- fname - ملف الإدخال
- الاسم الخارجي - ملف الإخراج
- ch_n - عدد القنوات
عند الإخراج ، نحصل على اسم الملف ، الذي يحتوي على الصوت ، الذي تم تنظيفه من الضوضاء ، من الملف fname.
silenceRemoval(x, Fs, stWin, stStep) # « »
- x - مجموعة الإدخال (إشارة رقمية)
- Fs - معدل أخذ العينات
- stWin - عرض نافذة استخراج الميزة
- stStep - حجم خطوة الإزاحة
عند الإخراج ، نحصل على مصفوفة من النموذج:
[l_1، r_1]
[l_2، r_2]
[l_3، r_3]
...
[l_N، r_N]
حيث l_i هو وقت بدء المقطع i (ثانية) ، r_i هو وقت نهاية المقطع الأول (ثانية) ).
detect_audio_segment(x,thrs) # .
- x - مجموعة الإدخال (إشارة رقمية)
- ساعات - الحد الأدنى لطول جزء الكلام المكتشف (بالثواني)
عند الإخراج ، نحصل على تلك الأجزاء [l_i، r_i] التي تحتوي على كلام يستمر لمدة ثواني.
نتيجة للمعالجة المسبقة ، يتم تحويل ملف صوت الإدخال إلى شكل مصفوفة:
[l_1، r_1]
[l_2، r_2]
[l_3، r_3]
…
[l_N، r_N] ،
حيث يمثل كل جزء فترة زمنية لملف الكلام الذي تم تنظيفه.
وبالتالي ، يمكننا مطابقة كل جزء من هذا القبيل بمصفوفة من الميزات (خصائص cepstral الصغيرة) ، والتي سيتم استخدامها لتدريب النموذج وفي مرحلة وضع العلامات.
الأساليب / الخوارزميات المستخدمة
كما هو مذكور أعلاه ، يعتمد حلنا على مكتبة التحليل pyaudioanalysis المكتوبة بلغة Python 2.7. نظرًا لحقيقة أن حلنا العام تم تنفيذه في Python 3.7 ، فقد تم تعديل بعض وظائف المكتبة وتكييفها مع هذا الإصدار من اللغة.
بشكل عام ، يمكن تقسيم خوارزمية الأداة الخاصة بمديري العلامات إلى جزأين:
- تدريب مدير النموذج
- وضع العلامات
وصف أكثر تفصيلا لكل جزء يبدو مثل هذا.
تدريب مدير النموذج:
- تحميل عينة التدريب
- معالجة البيانات
- حساب عدد الفصول
- إنشاء نموذج مدير لكل فئة
- حفظ النموذج
وضع العلامات:
- تحميل المكالمة
- التحقق من الدعوة للنجاح
- المعالجة المسبقة لمكالمة ناجحة
- تحميل جميع نماذج المديرين المدربين
- تصنيف كل جزء من المكالمة المعالجة
- العثور على نموذج المدير الأكثر احتمالا
- وضع العلامات
لقد ناقشنا بالفعل بالتفصيل مهام المعالجة المسبقة للبيانات. الآن دعونا نلقي نظرة على طرق إنشاء نماذج المدير.
استخدمنا خوارزمية GMM (نموذج خليط غاوسي) كنموذج . يقوم بنمذجة بياناتنا على افتراض أنها تحققات لمتغير عشوائي بتوزيع موصوف بواسطة مزيج من Gaussians - لكل منهم تباينه الخاص وتوقعاته الرياضية الخاصة.
من المعروف أن الخوارزمية الأكثر شيوعًا للعثور على المعلمات المثلى لمثل هذا الخليط هي خوارزمية EM (تعظيم التوقعات) . يقسم المشكلة الصعبة المتمثلة في تعظيم احتمال وجود متغير عشوائي متعدد الأبعاد إلى سلسلة من مشاكل التعظيم ذات البعد الأدنى.
نتيجة لسلسلة من التجارب ، توصلنا إلى المعلمات التالية لخوارزمية GMM:
gmm = GMM(n_components = 16, n_iter = 200, covariance_type='diag',n_init = 3)
يتم إنشاء مثل هذا النموذج لكل مدير ، ثم يتم تدريبه - يتم ضبط معلماته على بيانات محددة.
gmm.fit(features)
بعد ذلك ، يتم حفظ النموذج لاستخدامه في مرحلة وضع العلامات:
picklefile = path[path.find('/')+1:path.find('.')]+".gmm"
pickle.dump(gmm,open(dest + picklefile,'wb'))
في مرحلة وضع العلامات ، نقوم بتحميل النماذج المحفوظة مسبقًا:
gmm_files = [os.path.join(modelpath,fname) for fname in
os.listdir(modelpath) if fname.endswith('.gmm')]
modelpath هو الدليل الذي حفظنا فيه النماذج.
models = [pickle.load(open(fname,'rb'),encoding='latin1') for fname in gmm_files]
وأيضًا قم بتحميل أسماء النماذج (هذه هي علاماتنا):
speakers = [fname.split("/")[-1].split(".gmm")[0] for fname
in gmm_files]
ملف الصوت الذي تم تحميله ، والذي تحتاج إلى وضع علامة عليه ، يتم تحويله ومعالجته مسبقًا. علاوة على ذلك ، تتم مقارنة كل جزء مع الكلام الموجود فيه بالنماذج المدربة ويتم تحديد الفائز من حيث الحد الأقصى لوغاريتم الاحتمال:
log_likelihood = np.zeros(len(models)) #
for i in range(len(models)):
gmm = models[i] #
scores = np.array(gmm.score(vector))
log_likelihood[i] = scores.sum() # i –
winner = np.argmax(log_likelihood) #
print("\tdetected as - ", speakers[winner])
نتيجة لذلك ، فإن الخوارزمية الخاصة بنا لها الاستنتاج التالي تقريبًا:
يبدأ في: 1.92 ينتهي بـ: تم
اكتشاف 8.72 [-10400.93604115 -12111.38278205] على
أنه -
يبدأ Olga : 9.22 وينتهي بـ: 15.72
[-10193.80504138 -11911.11095894] تم
اكتشافه على أنه -
يبدأ Olga في: 26.7 ينتهي في: 29،82
[-4867،97641331 -5506،44233563]
الكشف عن - إيفان
يبدأ في: ينتهي في 33.34: 47.14
[-21143،02629011 -24796،44582627]
الكشف عن - إيفان
يبدأ في: ينتهي في 52.56: 59.24
[-10916،83282132 -12124،26855538]
الكشف عن - أولجا
يبدأ في: 116.32 ينتهي بـ: 134.56
[-36764.94876054 -34810.38959083] تم
اكتشافه كـ - أولغا
يبدأ في: 151.18 وينتهي بـ: 154.86
تم اكتشاف [-8041.33666572 -6859.14253903]
كـ -
يبدأ Olga في: 159.7 ينتهي بـ: 162.92
[-6421.72235531 -5983.90538059] تم
اكتشافه على أنه -
يبدأ Olga في: 185.02 وينتهي بـ: 208.7
...
يبدأ في: 442.04 وينتهي بـ: 445.5
[-7451.0289772 -6286.6619 ] تم
اكتشافه كـ - Olga
*******
WINNER - Olga
يفترض هذا المثال أن هناك فصلين على الأقل - [Olga ، Ivan] . يتم تقطيع الملف الصوتي إلى مقاطع [1.92 ، 8.72] ، [9.22 ، 15.72] ، ... ، [442.04 ، 445.5] ويتم تحديد النموذج الأنسب لكل مقطع .
يظهر لوغاريتم الاحتمالية التراكمي بين قوسين بجانب كل قطعة:[-10400.93604115 -12111.38278205] ، العنصر الأول هو احتمال أولجا والثاني هو إيفان . نظرًا لأن الوسيطة الأولى أكبر من الثانية ، يتم تصنيف هذا المقطع على أنه أولغا . الفائز النهائي يتم تحديده بأغلبية "أصوات" الأجزاء.
النتائج
في البداية ، صممنا الخوارزمية على افتراض أن مديرًا "غير معروف" قد يكون موجودًا في المكالمات الواردة - أي أن نموذجه غير موجود في عينة التدريب.
لاكتشاف مثل هذا المستخدم ، نحتاج إلى إدخال بعض المقاييس في متجه log_likability . بحيث تشير بعض قيمه إلى أنه على الأرجح لم يتم وصف هذا الجزء بشكل كافٍ بواسطة أي من النماذج الحالية. اقترحنا المقياس التالي كاختبار:
Leukl=(log_likelihood-np.min(log_likelihood))/(np.max(log_likelihood)-np.min(log_likelihood))
-sorted(-np.array(Leukl))[1]<T
تشير هذه القيمة إلى كيفية توزيع الدرجات "بالتساوي" في متجه احتمال تسجيل الدخول . إن توحيد التقديرات (قربها من بعضها البعض) يعني أن جميع النماذج تتصرف بنفس الطريقة ولا يوجد قائد واضح.
يشير هذا إلى أن جميع النماذج على الأرجح خاطئة وأن لدينا مديرًا لم يكن في مرحلة التدريب. تظهر العلاقة بين T وجودة التصنيف في الأشكال.
الشكل: 1.
أ) دقة التصنيف الثنائي للمديرين المعروفين وغير المعروفين.
ب) دقة تصنيف المديرين المشهورين.
الشكل: 2.
أ) نسبة المديرين المشهورين المخصصة لفئة المشهورين.
ب) نسبة المديرين المجهولين المخصصة لفئة المعروفين.
الشكل: 3.
أ) حصة المديرين المجهولين المخصصة لفئة المجهولين.
ب) نسبة المديرين المشهورين المخصصة لفئة المجهولين.
الشكل: 4.
أ) اكتمال التصنيف الثنائي (استدعاء).
ب) دقة التصنيف الثنائي (الدقة).
العلاقة بين قيمة العتبة T وجودة التصنيف (وضع العلامات) واضحة. كلما كانت T أكبر ( كلما كانت شروط تعيين مدير لفئة غير معروفين أكثر صرامة) ، قل احتمال تصنيف مدير معروف على أنه غير معروف. ومع ذلك ، فمن المرجح أن "يغيب" مدير غير معروف.
قيمة الحد الأمثل هي 0.8 . لأننا نصنف المديرين المشهورين بدقة تصل إلى 90٪وتحديد "المجهول" بدقة 81٪ . إذا افترضنا أن جميع المديرين "مألوفون" بالنسبة لنا ، فستكون الدقة حوالي 98٪ .
الاستنتاجات
في المقال ، وصفنا الأفكار العامة لعمل أداتنا لتحديد المديرين في المكالمات. بالطبع ، نحن لا نتظاهر بأن خوارزمية لدينا هي الأمثل وغير قادرة على التحسين.
يعتمد على عدد من الافتراضات التي لا يتم الوفاء بها دائمًا في الممارسة العملية. على سبيل المثال ، قد نواجه مديرًا غير معروف إذا لم تكن هناك بيانات عنه. أو يمكن لمديرين أو أكثر إجراء محادثة مع العميل "بحصص متساوية". من وجهة نظر الخوارزمية ، يمكن اقتراح الاتجاهات التالية لمزيد من التحسينات:
- اختيار نموذج خوارزمية مختلف عن GMM
- تحسين معلمات GMM
- اختيار مقياس مختلف لاكتشاف مدير جديد
- ابحث عن أهم ميزات إشارة الكلام
- الجمع بين أدوات المعالجة الصوتية المختلفة وتحسين معلمات هذه الطرق