Sebastien Rousseau

Audio Analyser: Azure Speech, NLP, and Translation Pipeline

ארכיטקטורה וצינור עיבוד של כלי ניתוח דיבור המבוסס על Azure

5 דקות קריאה
Banner for: Audio Analyser: Azure Speech, NLP, and Translation Pipeline

סיכום מנהלים / נקודות מפתח

  • Azure Batch Transcription API מקבל קבצי שמע עד 2.5 שעות (WAV/MP3/OGG/FLAC), מעבד אותם באופן אסינכרוני ומחזיר מערך JSON של recognizedPhrases עם מועמדי nBest לכל ביטוי, ציוני ביטחון, פלט מנורמל-טקסט-הפוך (ITN) ודיאריזציה אופציונלית של דוברים — אינו דורש חיבור הזרמה (Microsoft Azure, 2024).
  • מודלי האקוסטיקה העצביים של Microsoft הפחיתו את שיעור שגיאת המילים בכ-50% ביחס לבסיסי מודל מרקוב נסתר (HMM) קודמים על קנה המידה של Switchboard לדיבור שיחתי, והשיגו שוויון עם מתמלל אנושי מקצועי על מערך הנתונים הזה ב-~5.1% WER (Xiong et al., Microsoft Research, עדכון 2016/2021).
  • Azure Text Analytics (כעת חלק מ-Azure AI Language) מעבד טקסט תמליל דרך חילוץ ביטויי מפתח, זיהוי ישויות בשמות (NER), ניתוח רגש עם כריית דעות וזיהוי שפה — הכל בקריאת analyze_sentiment או begin_analyze_actions יחידה באמצעות Python SDK.
  • CherryPy מספק את שכבת האינטרנט: ניתוב URL, טיפול בהעלאת multipart, ניהול הפעלות ועיבוד תבניות Jinja2 בתהליך Python מינימלי שיכול לרוץ על VM יחיד בעלות נמוכה ללא תקורת תזמור.
  • Azure Translator NMT מזהה אוטומטית את שפת המקור ומתרגם תמלילים לכל אחת מ-135 שפות יעד, ומאפשר ניתוח NLP במורד הזרם גם על הטקסט המקורי וגם על המתורגם באותה הרצת צינור.

Audio Analyser ⧉ הוא יישום Python בקוד פתוח המחבר שלושה Azure Cognitive Services לזרימת עבודה אחת: Batch Transcription לדיבור-לטקסט, Azure AI Language (Text Analytics) ל-NLP ו-Azure Translator לפלט רב-לשוני. ממשק האינטרנט מוגש על ידי CherryPy, והתוצאות ניתנות לשמירה ב-JSON, טקסט רגיל או מסד נתונים SQLite מקומי.

מאמר זה מתאר את הארכיטקטורה הטכנית של כל שלב בצינור, חוזי Azure API והבחירות בעיצוב שנעשו בשכבת CherryPy.

כיצד עובד Audio Analyser: סקירת ארכיטקטורה #

לצינור חמישה שלבים נפרדים:

  1. העלאה — המשתמש שולח קובץ שמע דרך ממשק האינטרנט של CherryPy. CherryPy שומר את הקובץ בספרייה זמנית ומחזיר מזהה משימה.
  2. תמלול — Audio Analyser שולח את הקובץ ל-Azure Batch Transcription REST API. מכיוון שתמלול האצווה הוא אסינכרוני, היישום סוקר את נקודת הקצה של סטטוס המשימה במרווחים וממתין למצב Succeeded לפני שממשיך.
  3. NLP — טקסט התמליל הגולמי מועבר ל-Azure AI Language לחילוץ ביטויי מפתח, NER, ניתוח רגש וזיהוי שפה.
  4. תרגום (אופציונלי) — אם צוינה שפת יעד, התמליל נשלח ל-Azure Translator, וניתוח NLP מורץ מחדש על הטקסט המתורגם.
  5. פלט — התוצאות נכתבות לפורמט הפלט שנבחר (JSON, TXT או SQLite) ומוצגות בממשק האינטרנט של CherryPy.

תלות זמן הריצה היחידות מחוץ לספריית הסטנדרט של Python הן azure-cognitiveservices-speech, azure-ai-textanalytics, azure-ai-translation-text ו-cherrypy. כל אישורי Azure נקראים ממשתני סביבה.

Azure Cognitive Services: מנוע תמלול האצווה #

Azure Speech service batch transcription API (/speechtotext/v3.0/transcriptions) מקבל הפניה לקובץ שמע ב-Azure Blob Storage וגוף JSON של תצורה. Audio Analyser מעלה את הקובץ המקומי ל-Blob Storage באמצעות SAS URL חתום מראש, ואז שולח את משימת התמלול.

עומס עבודה מינימלי לשליחת משימה:

{
  "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 בתגובה מכיל אובייקט אחד לכל היגד שזוהה. כל רשומה כוללת:

כיוונון עדין של 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 מאפשר רגש ברמת היבט: ה-API מחזיר לא רק קוטביות ברמת המסמך אלא גם זוגות ספציפיים של מטרה–הערכה (למשל, מטרה="איכות שמע", הערכה="גרועה"). זה הופך את הפלט לשימושי לזיהוי בעיות קונקרטיות בניתוח שיחות שירות לקוחות.

זיהוי ישויות בשמות מסווג טווחים כאחד מ: 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 מריץ אופציונלית את מעבר NLP של Text Analytics על הטקסט המתורגם כך שפלטי ביטויי המפתח והרגש זמינים גם בשפת המקור וגם בשפת היעד.

בחירת פורמט הפלט (JSON, TXT, SQLite) נקבעת בהפעלה. פלט SQLite שומר כל הפעלת ניתוח כשורה עם עמודות למזהה משימה, חותמת זמן, שפת מקור, תמליל, תמליל מתורגם, ציוני רגש וביטויי מפתח כ-blob JSON — ומאפשר שאילתות SQL בין הפעלות.

CherryPy כשכבת אינטרנט #

CherryPy ממפה נתיבי URL לשיטות Python באמצעות בקרים מבוססי-מחלקה. Audio Analyser משתמש בשלושה נתיבים:

נתיב שיטה תיאור
GET / index() מעבד את טופס ההעלאה
POST /analyse analyse() מקבל העלאת multipart, מפעיל צינור, מחזיר מזהה משימה
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 URL לטווח קצר ונמחקים מהספרייה המקומית הזמנית לאחר השלמת ההעלאה. שמירת blobs ב-Azure Blob Storage תלויה במדיניות מחזור חיי הקונטיינר; כברירת מחדל, Audio Analyser אינו מגדיר מדיניות מחיקה מפורשת, לכן מומלץ להגדיר כלל TTL קצר (למשל, מחק blobs ישנים מיום 1) בפורטל Azure לפריסות ייצור.

האם ניתן להפעיל ניתוח NLP ללא תרגום? כן. תרגום הוא שלב צינור אופציונלי הנשלט על ידי דגל CLI --target-lang או תפריט נפתח של שפת יעד בממשק האינטרנט. כאשר לא נבחרת שפת יעד, הצינור מפעיל רק דיבור-לטקסט ו-Text Analytics.

הפניות #

  1. Microsoft. Batch transcription overview — Azure AI services. Microsoft Learn, 2024. https://learn.microsoft.com/en-us/azure/ai-services/speech-service/batch-transcription
  2. Xiong, W. et al. "Achieving Human Parity in Conversational Speech Recognition." Microsoft Research Technical Report, 2016; updated 2021. https://arxiv.org/abs/1610.05256
  3. Microsoft. What is Azure AI Language? Microsoft Learn, 2024. https://learn.microsoft.com/en-us/azure/ai-services/language-service/overview
  4. Microsoft. Azure AI Translator — Supported languages. Microsoft Learn, 2024. https://learn.microsoft.com/en-us/azure/ai-services/translator/language-support

נסקר לאחרונה .

נסקר לאחרונה .