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 |
|---|---|
.wav | audio/wav |
.json | application/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_id | string | Уникален идентификатор на заявката |
timestamp | string | ISO 8601 timestamp (трансформира се в TimeGenerated) |
host | string | Host label на ASR сървъра |
machine_id | string | Хардуерен отпечатък на клиента |
client_ip | string | IP адрес на клиента |
language_requested | string | Заявен език |
language_detected | string | Детектиран/използван език |
task | string | transcribe или translate |
audio_duration_sec | real | Продължителност на аудиото в секунди |
audio_size_bytes | long | Размер на WAV файла в байтове |
sample_rate | int | Sample rate на аудиото |
model_name | string | ASR модел (canary-1b-v2) |
asr_ms | real | ASR латентност в милисекунди |
postprocess_ms | real | LLM post-processing латентност |
total_ms | real | Обща латентност |
status | string | completed, error, disconnected, lock_timeout |
transcription | string | Суров текст от ASR |
postprocessed_text | string | Коригиран текст от LLM |
blob_url | string | URL към аудио файла в Blob Storage |
postprocess_enabled | boolean | Дали post-processing е бил включен |
error | string | Съобщение за грешка (ако има) |
Конфигурация
Environment Variables
| Променлива | По подразбиране | Описание |
|---|---|---|
AZURE_STORAGE_CONNECTION_STRING | -- | Connection string за Azure Blob Storage |
AZURE_STORAGE_CONTAINER | asr-recordings | Име на blob container |
LOG_ANALYTICS_DCE_ENDPOINT | -- | URL на Data Collection Endpoint |
LOG_ANALYTICS_DCR_RULE_ID | -- | ID на Data Collection Rule |
LOG_ANALYTICS_STREAM_NAME | Custom-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_LABEL | gx10-804f | Label за организация на 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 Account | Azure Blob Storage | -- |
asr-recordings | Blob Container | -- |
dictaro-dce | Data Collection Endpoint | northeurope |
| DCR | Data Collection Rule | northeurope |
workspace-dictarorgcwdv | Log Analytics Workspace | northeurope |
Docker
Data Collector работи като лек Python 3.12 контейнер:
- Base image:
python:3.12-slim - Порт: 8767 (вътрешен, не е изложен на хоста)
- Restart:
unless-stopped - GPU: Не е нужен