Перейти к содержанию

STT (Speech-to-Text) Сервис

Автоматически сгенерировано: 2026-02-19 11:02:19

⚠️ ВАЖНО: Документация генерируется из РЕАЛЬНОГО кода (stt_service.py)

Обзор

STT сервис используется для автоматической транскрипции записей звонков.

⚠️ PRODUCTION AI сервер 85.29.137.199НЕ ТРОГАТЬ!

Реальная технология (из кода)

Из исходного кода stt_service.py:

import httpx

async def transcribe_recording(cdr_id: int, audio_path: str) -> dict:
    async with httpx.AsyncClient(timeout=settings.STT_TIMEOUT) as client:
        files = {"audio": (audio_file.name, f, "audio/wav")}
        data = {"call_id": str(cdr_id)}

        response = await client.post(
            settings.STT_API_URL,
            files=files,
            data=data
        )
Параметр Значение Источник
URL http://85.29.137.199:5001/stt Конфиг: STT_API_URL
Timeout 300 сек Конфиг: STT_TIMEOUT
Протокол HTTP POST multipart/form-data Код: httpx.AsyncClient.post()
Модель Whisper (предположительно) Из комментариев в коде

Формат запроса (из кода)

POST http://85.29.137.199:5001/stt

# multipart/form-data
files = {"audio": (filename, binary_data, "audio/wav")}
data = {"call_id": str(cdr_id)}

Формат ответа (из кода)

Ожидаемый JSON:

{
  "status": "success",
  "text": "транскрипция...",
  "processing_time": 1.23,
  "language": "kk",
  "model_used": "whisper-kk"
}

Обработка в коде:

return {
    "status": "success",
    "text": result.get("text", ""),
    "processing_time": result.get("processing_time", 0),
    "language": result.get("language", "unknown"),
    "model_used": result.get("model_used", "unknown")
}

Раздельные каналы (из кода)

Поддержка caller/operator:

async def transcribe_separate_channels(
    cdr_id: int, 
    caller_path: str, 
    operator_path: str
) -> dict:
    # Транскрибируем канал абонента
    caller_result = await transcribe_recording(cdr_id, caller_path)

    # Транскрибируем канал оператора
    operator_result = await transcribe_recording(cdr_id, operator_path)

    return {
        "transcription_caller": caller_result.get("text", ""),
        "transcription_operator": operator_result.get("text", ""),
        ...
    }

SFTP скачивание записей (из кода)

Автоматическое получение с VoIP серверов:

def _fetch_recording_via_sftp(file_name: str, local_path: Path) -> bool:
    remote_path = "/var/spool/asterisk/monitor/{file_name}"
    # Пробует все VoIP серверы (voip-1, voip-2)
    for host in hosts:
        sftp.get(remote_path, str(local_path))

Интеграция с CallBox

Процесс транскрипции

graph LR
    A[Окончание звонка] --> B[MixMonitor WAV]
    B --> C[SFTP с voip-1/voip-2]
    C --> D[POST к STT API]
    D --> E[JSON ответ]
    E --> F[Сохранение в БД]
    F --> G[LLM суммаризация]

Используется в

  • Backend: app/services/stt_service.py
  • API: POST /api/organizations/{tenant_id}/recordings/{cdr_id}/transcribe
  • БД: call_detail_records.transcription

Обработка ошибок (из кода)

Timeout:

except httpx.TimeoutException:
    raise STTError(f"STT timeout after {settings.STT_TIMEOUT}s")

HTTP errors:

if response.status_code != 200:
    raise STTError(f"STT API returned {response.status_code}")

Мониторинг

Логи:

docker logs callbox-backend | grep STT

Статистика:

SELECT COUNT(*) FROM call_detail_records WHERE transcription IS NOT NULL;

Критические правила

⚠️ Сервер 85.29.137.199: - НЕ делать SSH - НЕ перезапускать сервисы - НЕ изменять конфигурацию - ТОЛЬКО HTTP-запросы к API


Документация генерируется из реального кода stt_service.py. НЕ редактировать вручную.