Преминете към основното съдържание

Data Collector

Data Collector е sidecar услуга, която получава данни от ASR сървъра и ги персистира в Azure. Качва аудио записи в Azure Blob Storage и метаданни в Azure Log Analytics чрез Data Collection Rules (DCR) API.

Архитектура

Поток на данните

API

POST /collect

Получава данни от ASR сървъра за всяка завършена транскрипция.

Headers:

Authorization: Bearer <SERVER_API_KEY>

Request body:

{
"id": "uuid",
"timestamp": 1234567890.0,
"client_ip": "192.168.1.100",
"sample_rate": 16000,
"audio_duration_sec": 5.2,
"audio_size_bytes": 166400,
"audio_base64": "UklGR...",
"metadata": {
"language": "bg",
"task": "transcribe",
"machine_id": "a1b2c3..."
},
"result": {
"text": "Здравейте, как сте?",
"segments": [...],
"language": "bg",
"postprocessed_text": "Здравейте, как сте?",
"postprocess_ms": 150
},
"asr_ms": 450.2,
"postprocess_ms": 150.0,
"processing_time_ms": 600.2,
"status": "completed"
}

Response:

{
"status": "ok",
"request_id": "uuid",
"blob_url": "https://storageaccount.blob.core.windows.net/asr-recordings/gx10-804f/2026/03/14/uuid.wav"
}

GET /health

{
"status": "ok",
"blob_enabled": true,
"log_analytics_enabled": true
}

Компоненти

BlobUploader

Отговаря за качването на аудио файлове и метаданни в Azure Blob Storage.

Blob организация

Файловете се организират по следната структура:

asr-recordings/
{host_label}/
{YYYY}/
{MM}/
{DD}/
{request_id}.wav # WAV аудио файл
{request_id}.json # Метаданни JSON

Пример:

asr-recordings/
gx10-804f/
2026/
03/
14/
a1b2c3d4-e5f6-7890-abcd-ef1234567890.wav
a1b2c3d4-e5f6-7890-abcd-ef1234567890.json

Content types

ФайлContent-Type
.wavaudio/wav
.jsonapplication/json

Metadata JSON формат

JSON файлът съдържа пълния record, който се изпраща и към Log Analytics:

{
"request_id": "uuid",
"timestamp": "2026-03-14T10:30:00+00:00",
"host": "gx10-804f",
"machine_id": "a1b2c3...",
"client_ip": "192.168.1.100",
"language_requested": "bg",
"language_detected": "bg",
"task": "transcribe",
"audio_duration_sec": 5.2,
"audio_size_bytes": 166400,
"sample_rate": 16000,
"model_name": "canary-1b-v2",
"asr_ms": 450.2,
"postprocess_ms": 150.0,
"total_ms": 600.2,
"status": "completed",
"transcription": "Здравейте, как сте?",
"postprocessed_text": "Здравейте, как сте?",
"postprocess_enabled": true,
"blob_url": "https://...",
"error": null
}

Тези JSON файлове са проектирани за заявки от Azure Synapse Serverless SQL pools.

LogAnalyticsWriter

Изпраща метаданни към Azure Log Analytics чрез Logs Ingestion API.

Автентикация

Използва Service Principal (Client Credentials flow) чрез azure-identity:

ClientSecretCredential(
tenant_id=...,
client_id=...,
client_secret=...,
)

Data Collection Rule (DCR)

DCR дефинира схемата на custom table Custom-AsrRequests_CL и KQL трансформация:

source
| extend TimeGenerated = todatetime(timestamp)
| project-away timestamp

Схема на Custom-AsrRequests_CL

КолонаТипОписание
request_idstringУникален идентификатор на заявката
timestampstringISO 8601 timestamp (трансформира се в TimeGenerated)
hoststringHost label на ASR сървъра
machine_idstringХардуерен отпечатък на клиента
client_ipstringIP адрес на клиента
language_requestedstringЗаявен език
language_detectedstringДетектиран/използван език
taskstringtranscribe или translate
audio_duration_secrealПродължителност на аудиото в секунди
audio_size_byteslongРазмер на WAV файла в байтове
sample_rateintSample rate на аудиото
model_namestringASR модел (canary-1b-v2)
asr_msrealASR латентност в милисекунди
postprocess_msrealLLM post-processing латентност
total_msrealОбща латентност
statusstringcompleted, error, disconnected, lock_timeout
transcriptionstringСуров текст от ASR
postprocessed_textstringКоригиран текст от LLM
blob_urlstringURL към аудио файла в Blob Storage
postprocess_enabledbooleanДали post-processing е бил включен
errorstringСъобщение за грешка (ако има)

Конфигурация

Environment Variables

ПроменливаПо подразбиранеОписание
AZURE_STORAGE_CONNECTION_STRING--Connection string за Azure Blob Storage
AZURE_STORAGE_CONTAINERasr-recordingsИме на blob container
LOG_ANALYTICS_DCE_ENDPOINT--URL на Data Collection Endpoint
LOG_ANALYTICS_DCR_RULE_ID--ID на Data Collection Rule
LOG_ANALYTICS_STREAM_NAMECustom-AsrRequests_CLИме на Log Analytics stream
AZURE_CLIENT_ID--Service Principal client ID
AZURE_CLIENT_SECRET--Service Principal secret
AZURE_TENANT_ID--Azure AD tenant ID
COLLECTOR_HOST_LABELgx10-804fLabel за организация на blob пътища
SERVER_API_KEY--API ключ за автентикация от ASR сървъра

Условно включване

Услугите се включват на базата на наличните environment variables:

Обработка на грешки

Data Collector е проектиран като fire-and-forget услуга:

  • ASR сървърът изпраща данни чрез asyncio.create_task() -- не чака отговор
  • Ако Data Collector е недостъпен, ASR сървърът логва грешката на debug ниво и продължава
  • Ако Blob upload или Log Analytics ingest се провалят, грешката се логва, но HTTP отговорът към ASR е 200 OK (частичен успех)
  • Всяка от трите операции (WAV upload, metadata JSON upload, Log Analytics ingest) е независима -- провал в една не спира останалите

Azure ресурси

РесурсТипЛокация
Storage AccountAzure Blob Storage--
asr-recordingsBlob Container--
dictaro-dceData Collection Endpointnortheurope
DCRData Collection Rulenortheurope
workspace-dictarorgcwdvLog Analytics Workspacenortheurope

Docker

Data Collector работи като лек Python 3.12 контейнер:

  • Base image: python:3.12-slim
  • Порт: 8767 (вътрешен, не е изложен на хоста)
  • Restart: unless-stopped
  • GPU: Не е нужен