الملخص التنفيذي / أبرز النقاط
- تقبل واجهة Azure Batch Transcription API ملفات صوتية تصل مدتها إلى 2.5 ساعة (WAV/MP3/OGG/FLAC)، وتعالجها بشكل غير متزامن، وترجع مصفوفة JSON من
recognizedPhrasesتحتوي على مرشحاتnBestلكل عبارة ودرجات الثقة ومخرجات التطبيع العكسي للنص (ITN) وتمييز المتحدثين الاختياري — دون الحاجة إلى اتصال بثّ (Microsoft Azure، 2024).- قلّلت نماذج الصوتيات العصبية من Microsoft معدل خطأ الكلمات بنسبة تقارب 50% مقارنةً بخطوط الأساس القديمة لنماذج ماركوف المخفية (HMM) على معيار Switchboard للمحادثة، لتصل إلى مستوى مساوٍ للمُنسِّخين البشريين المحترفين على تلك البيانات بمعدل WER يبلغ ~5.1% (Xiong وآخرون، Microsoft Research، تحديث 2016/2021).
- تعالج Azure Text Analytics (المدرجة الآن ضمن Azure AI Language) نص النسخة من خلال استخراج العبارات الرئيسية، والتعرف على الكيانات المُسمَّاة (NER)، وتحليل المشاعر مع استخراج الآراء، واكتشاف اللغة — كل ذلك في استدعاء واحد لـ
analyze_sentimentأوbegin_analyze_actionsباستخدام Python SDK.- توفر CherryPy طبقة الويب: توجيه URL، ومعالجة رفع الملفات متعدد الأجزاء، وإدارة الجلسات، وعرض قوالب Jinja2 في عملية Python بسيطة تعمل على جهاز افتراضي واحد منخفض التكلفة دون أي عبء تنسيق.
- تكتشف Azure Translator NMT لغة المصدر تلقائيًا وتترجم النصوص إلى أي من 135 لغة هدف، مما يتيح إجراء تحليل NLP في المراحل اللاحقة على كل من النص الأصلي والمترجم ضمن نفس تشغيل خط الأنابيب.
Audio Analyser ⧉ هو تطبيق Python مفتوح المصدر يربط ثلاثة خدمات من Azure Cognitive Services في سير عمل واحد: Batch Transcription لتحويل الكلام إلى نص، وAzure AI Language (Text Analytics) لمعالجة اللغة الطبيعية، وAzure Translator للمخرجات متعددة اللغات. تُقدَّم واجهة الويب عبر CherryPy، ويمكن حفظ النتائج بصيغ JSON أو نص عادي أو قاعدة بيانات SQLite محلية.
تصف هذه المقالة البنية التقنية لكل مرحلة في خط الأنابيب، وعقود Azure API، وخيارات التصميم التي اتُّخذت في طبقة CherryPy.
كيف يعمل Audio Analyser: نظرة عامة على البنية #
يتكون خط الأنابيب من خمس مراحل منفصلة:
- الرفع — يقدّم المستخدم ملف صوتي عبر واجهة ويب CherryPy. تخزّن CherryPy الملف في دليل مؤقت وترجع معرّف المهمة.
- النسخ — يرسل Audio Analyser الملف إلى Azure Batch Transcription REST API. نظرًا لأن النسخ الدفعي غير متزامن، تستطلع التطبيق نقطة نهاية حالة المهمة على فترات وتنتظر حالة
Succeededقبل المتابعة. - NLP — يُمرَّر نص النسخة الخام إلى Azure AI Language لاستخراج العبارات الرئيسية وNER وتحليل المشاعر واكتشاف اللغة.
- الترجمة (اختياري) — إذا حُدِّدت لغة هدف، أُرسل النسخة إلى Azure Translator، وأُعيد تشغيل تحليل NLP على النص المترجم.
- المخرجات — تُكتب النتائج بالصيغة المختارة (JSON أو TXT أو SQLite) وتُعرض في واجهة ويب CherryPy.
التبعيات الوحيدة في وقت التشغيل خارج مكتبة Python القياسية هي azure-cognitiveservices-speech وazure-ai-textanalytics وazure-ai-translation-text وcherrypy. تُقرأ جميع بيانات اعتماد Azure من متغيرات البيئة.
Azure Cognitive Services: محرك النسخ الدفعي #
تقبل واجهة برمجة تطبيقات النسخ الدفعي لخدمة Azure Speech (/speechtotext/v3.0/transcriptions) مرجعًا لملف صوتي في Azure Blob Storage وجسم JSON للتكوين. يرفع Audio Analyser الملف المحلي إلى Blob Storage باستخدام رابط SAS مُوقَّع مسبقًا، ثم يرسل مهمة النسخ.
الحمولة الدنيا لإرسال مهمة:
{
"contentUrls": ["https://<account>.blob.core.windows.net/<container>/<file>.wav?<sas>"],
"locale": "en-US",
"displayName": "audio-analyser-job-001",
"properties": {
"diarizationEnabled": true,
"wordLevelTimestampsEnabled": true,
"punctuationMode": "DictatedAndAutomatic",
"profanityFilterMode": "Masked"
}
}
تحتوي مصفوفة recognizedPhrases في الاستجابة على كائن واحد لكل تعبير صوتي مُعترَف به. يتضمن كل إدخال:
nBest[0].confidence— رقم عائم بين 0 و1nBest[0].lexical— الكلمات الخام كما نُطقتnBest[0].itn— الصيغة المُطبَّعة عكسيًا (أرقام وتواريخ وعملات مُوسَّعة)nBest[0].display— مُنسَّق للقراءة مع علامات الترقيمspeaker— معرّف المتحدث الصحيح عند تفعيل تمييز المتحدثين
يتوفر الضبط الدقيق لـ Custom Speech للمفردات الخاصة بالمجال. يؤدي رفع معجم النطق أو مجموعة بيانات التكيّف (مجموعة من الجمل النصية تمثّل المجال) إلى ضبط نموذج اللغة ويمكنه تقليل معدل WER بشكل ملحوظ على المحتوى المتخصص مثل المصطلحات المالية أو المصطلحات الطبية.
معالجة اللغة الطبيعية مع Azure AI Language #
بعد النسخ، يرسل Audio Analyser نص النسخة بصيغة العرض إلى Azure AI Language عبر Python SDK من azure-ai-textanalytics:
from azure.ai.textanalytics import TextAnalyticsClient
from azure.core.credentials import AzureKeyCredential
client = TextAnalyticsClient(
endpoint=os.environ["AZURE_LANGUAGE_ENDPOINT"],
credential=AzureKeyCredential(os.environ["AZURE_LANGUAGE_KEY"])
)
documents = [{"id": "1", "language": detected_lang, "text": transcript}]
sentiment_result = client.analyze_sentiment(documents, show_opinion_mining=True)
for doc in sentiment_result:
print(f"Sentiment: {doc.sentiment}")
print(f"Scores: pos={doc.confidence_scores.positive:.2f} "
f"neg={doc.confidence_scores.negative:.2f} "
f"neu={doc.confidence_scores.neutral:.2f}")
for sentence in doc.sentences:
for opinion in sentence.mined_opinions:
print(f" Target: {opinion.target.text}, "
f"Assessment: {[a.text for a in opinion.assessments]}")
keyphrases_result = client.extract_key_phrases(documents)
entities_result = client.recognize_entities(documents)
يُفعِّل show_opinion_mining=True تحليل المشاعر على مستوى الجوانب: لا تُعيد الواجهة البرمجية القطبية على مستوى المستند فحسب، بل تُعيد أيضًا أزواج هدف-تقييم محددة (مثلًا: target="جودة الصوت"، assessment="ضعيفة"). يجعل هذا المخرجات مفيدة لتحديد المشكلات الملموسة في تحليل مكالمات خدمة العملاء.
يصنّف التعرف على الكيانات المُسمَّاة النصوص ضمن إحدى الفئات: Person، Organization، Location، Event، Product، DateTime، Quantity، IP، URL، Email، PersonType، Skill، Address، PhoneNumber.
الدعم متعدد اللغات عبر Azure Translator #
يُستدعى Azure Translator بعد اكتشاف اللغة عندما يطلب المستخدم لغة هدف. تدعم الخدمة 135 لغة ولهجة بالترجمة الآلية العصبية (NMT). يستخدم Audio Analyser نقطة النهاية /translate REST مع autodetect كمعامل from، لذا لا تلزم مواصفة لغة المصدر:
import requests, uuid
url = "https://api.cognitive.microsofttranslator.com/translate"
params = {"api-version": "3.0", "to": target_lang}
headers = {
"Ocp-Apim-Subscription-Key": os.environ["AZURE_TRANSLATOR_KEY"],
"Ocp-Apim-Subscription-Region": os.environ["AZURE_TRANSLATOR_REGION"],
"Content-type": "application/json",
"X-ClientTraceId": str(uuid.uuid4())
}
body = [{"text": transcript}]
response = requests.post(url, params=params, headers=headers, json=body)
translated_text = response.json()[0]["translations"][0]["text"]
detected_language = response.json()[0]["detectedLanguage"]["language"]
بعد الترجمة، يُعيد Audio Analyser اختياريًا تشغيل معالجة Text Analytics NLP على النص المترجم، لتتوفر مخرجات العبارات الرئيسية والمشاعر في كل من لغة المصدر واللغة الهدف.
يُضبط اختيار صيغة المخرجات (JSON أو TXT أو SQLite) عند بدء التشغيل. تخزّن مخرجات SQLite كل جلسة تحليل صفًا بأعمدة لمعرّف المهمة والطابع الزمني ولغة المصدر والنسخة والنسخة المترجمة ودرجات المشاعر والعبارات الرئيسية بوصفها JSON blob — مما يتيح استعلامات SQL عبر الجلسات.
CherryPy كطبقة ويب #
تربط CherryPy مسارات URL بأساليب Python باستخدام وحدات تحكم قائمة على الفصائل. يستخدم Audio Analyser ثلاثة مسارات:
| المسار | الأسلوب | الوصف |
|---|---|---|
GET / |
index() |
يعرض نموذج الرفع |
POST /analyse |
analyse() |
يقبل الرفع متعدد الأجزاء، ويشغّل خط الأنابيب، ويُعيد معرّف المهمة |
GET /results/<job_id> |
results() |
يستطلع حالة المهمة؛ يعرض صفحة النتائج عند الاكتمال |
يحافظ الحد الأدنى من التكوين على صغر حجم بصمة الخادم:
import cherrypy
cherrypy.config.update({
"server.socket_host": "0.0.0.0",
"server.socket_port": 8080,
"tools.sessions.on": True,
"tools.sessions.timeout": 60
})
cherrypy.quickstart(AudioAnalyserApp(), "/", conf)
تحتفظ حالة الجلسة بمعرّف المهمة الحالي وصيغة المخرجات المختارة ولغة الترجمة الهدف. يعتمد تخزين الجلسة المدمج في CherryPy بشكل افتراضي على الملفات، دون الحاجة إلى طبقة تخزين مؤقت خارجية.
الأسئلة الشائعة #
ما صيغ الصوت وأحجام الملفات التي يقبلها Audio Analyser؟ تدعم واجهة Azure Batch Transcription API ملفات WAV وMP3 وOGG وFLAC بمدة تصل إلى 2.5 ساعة. يجب تقسيم الملفات الأطول قبل الرفع. تُقبل الملفات الاستريو ولا حاجة للتحويل إلى أحادية الصوت.
كيف يعمل تمييز المتحدثين؟
يؤدي تعيين diarizationEnabled: true في طلب النسخ الدفعي إلى تنشيط نموذج فصل المتحدثين في Azure. يتضمن كل recognizedPhrase في الاستجابة حقلًا صحيحًا speaker. يحدد النموذج المتحدثين من خلال الخصائص الصوتية ويمنح معرّفات ثابتة ضمن الجلسة، لكنه لا يعرّف هويات المتحدثين دون خطوة تسجيل ملف صوتي منفصلة.
هل تُحتفظ بملفات الصوت بعد النسخ؟ تُرفع ملفات الصوت إلى Azure Blob Storage باستخدام رابط SAS قصير الأجل وتُحذف من الدليل المحلي المؤقت بعد اكتمال الرفع. يعتمد الاحتفاظ بالكائنات الثنائية في Azure Blob Storage على سياسة دورة حياة الحاوية؛ لا يُعيّن Audio Analyser بشكل افتراضي سياسة حذف صريحة، لذا يُوصى في النشرات الإنتاجية بتكوين قاعدة TTL قصيرة (مثل حذف الكائنات الأقدم من يوم) في بوابة Azure.
هل يمكن تشغيل تحليل NLP بدون ترجمة؟
نعم. الترجمة مرحلة اختيارية في خط الأنابيب يتحكم فيها الإشارة --target-lang في واجهة سطر الأوامر أو قائمة اللغة الهدف في واجهة الويب. عند عدم تحديد لغة هدف، يُشغِّل خط الأنابيب فقط تحويل الكلام إلى نص و Text Analytics.
المراجع #
- Microsoft. نظرة عامة على النسخ الدفعي — خدمات Azure AI. Microsoft Learn، 2024. https://learn.microsoft.com/en-us/azure/ai-services/speech-service/batch-transcription
- Xiong, W. وآخرون. "Achieving Human Parity in Conversational Speech Recognition." تقرير Microsoft Research التقني، 2016؛ تحديث 2021. https://arxiv.org/abs/1610.05256
- Microsoft. ما هو Azure AI Language؟ Microsoft Learn، 2024. https://learn.microsoft.com/en-us/azure/ai-services/language-service/overview
- Microsoft. Azure AI Translator — اللغات المدعومة. Microsoft Learn، 2024. https://learn.microsoft.com/en-us/azure/ai-services/translator/language-support
آخر مراجعة .
آخر مراجعة .
