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

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: Не е нужен