Sebastien Rousseau

Audio Analyser: Azure Speech, NLP, and Translation Pipeline

Arhitectura și pipeline-ul unui instrument de analiză a vorbirii bazat pe Azure

6 min de citit
Banner for: Audio Analyser: Azure Speech, NLP, and Translation Pipeline

Rezumat executiv / Concluzii cheie

  • Azure Batch Transcription API acceptă fișiere audio de până la 2,5 ore (WAV/MP3/OGG/FLAC), le procesează asincron și returnează un array JSON recognizedPhrases cu candidați nBest per frază, scoruri de încredere, ieșire normalizată invers (ITN) și diarizare opțională a vorbitorului — nu este necesară o conexiune în flux (Microsoft Azure, 2024).
  • Modelele acustice neuronale Microsoft au redus rata de eroare a cuvintelor cu aproximativ 50% față de bazele anterioare ale modelului Markov ascuns (HMM) pe benchmark-ul conversațional Switchboard, atingând paritatea cu transcriitorii umani profesioniști pe acel set de date la ~5,1% WER (Xiong et al., Microsoft Research, actualizare 2016/2021).
  • Azure Text Analytics (acum parte din Azure AI Language) procesează textul transcrierii prin extragerea frazelor cheie, recunoașterea entităților numite (NER), analiza sentimentului cu opinion mining și detectarea limbii — toate printr-un singur apel analyze_sentiment sau begin_analyze_actions folosind Python SDK.
  • CherryPy furnizează stratul web: rutarea URL, gestionarea încărcărilor multipart, managementul sesiunilor și randarea șabloanelor Jinja2 într-un proces Python minimal care poate rula pe o singură VM de cost redus fără overhead de orchestrare.
  • Azure Translator NMT detectează automat limba sursă și traduce transcrierile în oricare dintre cele 135 de limbi țintă, permițând analiza NLP în aval atât pe textul original, cât și pe cel tradus în cadrul aceluiași rulaj al conductei.

Audio Analyser ⧉ este o aplicație Python open-source care conectează trei Azure Cognitive Services într-un singur flux de lucru: Batch Transcription pentru speech-to-text, Azure AI Language (Text Analytics) pentru NLP și Azure Translator pentru ieșire multilingvă. Interfața web este deservită de CherryPy, iar rezultatele pot fi persistate în JSON, text simplu sau o bază de date SQLite locală.

Acest articol descrie arhitectura tehnică a fiecărei etape a conductei, contractele Azure API și deciziile de proiectare luate în stratul CherryPy.

Cum funcționează Audio Analyser: prezentare generală a arhitecturii #

Conducta are cinci etape distincte:

  1. Încărcare — utilizatorul trimite un fișier audio prin interfața web CherryPy. CherryPy stochează fișierul într-un director temporar și returnează un ID de job.
  2. Transcriere — Audio Analyser trimite fișierul la Azure Batch Transcription REST API. Deoarece transcrierea batch este asincronă, aplicația interogează periodic endpoint-ul de status al job-ului și așteaptă starea Succeeded înainte de a continua.
  3. NLP — textul brut al transcrierii este transmis la Azure AI Language pentru extragerea frazelor cheie, NER, analiza sentimentului și detectarea limbii.
  4. Traducere (opțional) — dacă este specificată o limbă țintă, transcrierea este trimisă la Azure Translator, iar analiza NLP este re-rulată pe textul tradus.
  5. Ieșire — rezultatele sunt scrise în formatul de ieșire selectat (JSON, TXT sau SQLite) și randate în interfața web CherryPy.

Singurele dependențe de rulare din afara bibliotecii standard Python sunt azure-cognitiveservices-speech, azure-ai-textanalytics, azure-ai-translation-text și cherrypy. Toate credențialele Azure sunt citite din variabilele de mediu.

Azure Cognitive Services: motorul de transcriere batch #

Azure Speech service batch transcription API (/speechtotext/v3.0/transcriptions) acceptă o referință la un fișier audio din Azure Blob Storage și un corp JSON de configurare. Audio Analyser încarcă fișierul local în Blob Storage folosind un SAS URL pre-semnat, apoi trimite job-ul de transcriere.

Un payload minim de trimitere a job-ului:

{
  "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"
  }
}

Array-ul recognizedPhrases din răspuns conține un obiect per enunț recunoscut. Fiecare intrare include:

Ajustarea fină Custom Speech este disponibilă pentru vocabularul specific domeniului. Încărcarea unui lexicon de pronunție sau a unui corpus de adaptare (un set de propoziții text reprezentative pentru domeniu) ajustează modelul de limbă și poate reduce substanțial WER pentru conținut specializat, cum ar fi termeni financiari sau jargon medical.

Procesarea limbajului natural cu Azure AI Language #

După transcriere, Audio Analyser trimite transcrierea în forma de afișare la Azure AI Language prin 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 activează sentimentul la nivel de aspect: API-ul returnează nu doar polaritatea la nivel de document, ci și perechi specifice țintă–evaluare (de ex., țintă="calitate audio", evaluare="slabă"). Aceasta face ieșirea utilă pentru identificarea problemelor concrete în analiza apelurilor serviciului clienți.

Recunoașterea entităților numite clasifică fragmentele ca una dintre: Person, Organization, Location, Event, Product, DateTime, Quantity, IP, URL, Email, PersonType, Skill, Address, PhoneNumber.

Suport multilingv prin Azure Translator #

Azure Translator este invocat după detectarea limbii când utilizatorul solicită o limbă țintă. Serviciul suportă 135 de limbi și dialecte cu traducere automată neurală (NMT). Audio Analyser folosește endpoint-ul REST /translate cu autodetect ca parametru from, astfel încât nu este necesară specificarea limbii sursă:

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"]

După traducere, Audio Analyser re-rulează opțional pasul NLP Text Analytics pe textul tradus, astfel încât ieșirile de fraze cheie și sentiment sunt disponibile atât în limba sursă, cât și în cea țintă.

Selecția formatului de ieșire (JSON, TXT, SQLite) este setată la pornire. Ieșirea SQLite stochează fiecare sesiune de analiză ca un rând cu coloane pentru ID job, marcaj temporal, limbă sursă, transcriere, transcriere tradusă, scoruri de sentiment și fraze cheie ca blob JSON — permițând interogări SQL între sesiuni.

CherryPy ca strat web #

CherryPy mapează rutele URL la metodele Python folosind controlere bazate pe clase. Audio Analyser folosește trei rute:

Rută Metodă Descriere
GET / index() Randează formularul de încărcare
POST /analyse analyse() Acceptă încărcare multipart, declanșează conducta, returnează ID job
GET /results/<job_id> results() Interogează statusul job-ului; randează pagina de rezultate când este completă

Configurația minimă menține amprenta serverului mică:

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)

Starea sesiunii deține ID-ul job-ului curent, formatul de ieșire selectat și limba țintă de traducere. Stocarea sesiunilor încorporată în CherryPy este susținută de fișiere implicit, fără a necesita un strat extern de cache.

Întrebări frecvente #

Ce formate audio și dimensiuni de fișiere acceptă Audio Analyser? Azure Batch Transcription API suportă fișiere WAV, MP3, OGG și FLAC cu o durată de până la 2,5 ore. Fișierele în afara acestui interval trebuie împărțite înainte de încărcare. Fișierele stereo sunt acceptate; conversia la mono nu este necesară.

Cum funcționează diarizarea vorbitorului? Setarea diarizationEnabled: true în cererea de transcriere batch activează modelul de separare a vorbitorului Azure. Fiecare recognizedPhrase din răspuns include un câmp întreg speaker. Modelul identifică vorbitorii prin caracteristici acustice și atribuie ID-uri consistente în cadrul unei sesiuni, dar nu identifică cine sunt vorbitorii fără un pas separat de înregistrare a profilului vocal.

Sunt păstrate fișierele audio după transcriere? Fișierele audio sunt încărcate în Azure Blob Storage cu un SAS URL de scurtă durată și șterse din directorul temporar local după finalizarea încărcării. Păstrarea blob-urilor în Azure Blob Storage depinde de politica ciclului de viață a containerului; implicit, Audio Analyser nu setează o politică explicită de ștergere, deci configurarea unei reguli TTL scurte (de ex., ștergere blob-uri mai vechi de 1 zi) în portalul Azure este recomandată pentru implementările de producție.

Poate analiza NLP să fie rulată fără traducere? Da. Traducerea este o etapă opțională a conductei controlată de indicatorul CLI --target-lang sau meniul derulant al limbii țintă din interfața web. Când nu este selectată nicio limbă țintă, conducta rulează doar speech-to-text și Text Analytics.

Referințe #

  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

Ultima revizuire .

Ultima revizuire .