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. НЕ редактировать вручную.