From 4dca198d3c7560103b7d74fada4458faa08ffab8 Mon Sep 17 00:00:00 2001 From: poturaevpetr Date: Thu, 16 Apr 2026 22:39:51 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BE=20=D0=B2=D1=81=D0=B5?= =?UTF-8?q?=D0=BC=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b2bdd55..c18ad27 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,26 @@ # FileAudioAPI +## Назначение и роль в экосистеме + +**FileAudioAPI** — сервис **учёта аудио и результатов распознавания** между диском, GPU-распознаванием и веб-клиентом. На **FastAPI**: хранит метаданные и статусы в БД, складывает файлы в общий каталог **`AUDIOFILES_PATH`** (тот же volume `audiofiles`, что у **GigaAM_API** и **Calls_WEB_Client_main**), инициирует ASR в **GigaAM_API**, принимает обратно текст/заключение, при необходимости дергает webhook в **Calls_WEB_Client_main**. + +| Направление | Роль | +|-------------|------| +| **Внутренние файлы** | Регистрация, очереди `process-all`, статусы `recognition_*`, связь с `AiConclusion`. | +| **Внешние файлы** | Загрузка с опциональным `callback_url`, сохранение под UUID-именем в общей папке, **всегда** постановка на распознавание в GigaAM. | +| **Интеграция** | `GIGAAM_API_URL`, `CALLS_WEB_CLIENT_URL` / `WEBHOOK_API_KEY` для доставки результатов в основное приложение. | + +Swagger: **`/api/v1/docs`** (см. ниже). + +--- + Сервис для хранения аудиофайлов, индексации файлов, записи и выдачи результатов распознавания, реализованный на **FastAPI**. ## 🚀 Быстрый старт ```bash -# Клонировать и перейти в директорию -cd /Users/petr/SpeechAnalytics/FileAudioAPI +# Перейти в директорию сервиса (от корня репозитория SpeechAnalytics) +cd FileAudioAPI # Запуск с Docker (рекомендуется) docker-compose up -d From d7b85e4755d0f0b4ade7b57339be1068e7fc2308 Mon Sep 17 00:00:00 2001 From: Petr <65958350+PoturaevPetr@users.noreply.github.com> Date: Tue, 25 Aug 2026 11:50:43 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5,=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D1=81=D1=82=D1=80=D1=8F=D0=B2=D1=88=D0=B8?= =?UTF-8?q?=D0=B7=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apiApp/routers/ai_conclusion_router.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/apiApp/routers/ai_conclusion_router.py b/apiApp/routers/ai_conclusion_router.py index eb5341c..f10bef5 100644 --- a/apiApp/routers/ai_conclusion_router.py +++ b/apiApp/routers/ai_conclusion_router.py @@ -228,15 +228,39 @@ async def mark_recognition_failed(request: RecognitionFailedRequest, db: Session """ audio = db.query(Audio).filter(Audio.filename == request.filename).first() if not audio: + logger.warning(f"⚠️ Попытка пометить failed для несуществующего аудио: {request.filename}, error={request.error}") raise HTTPException(status_code=404, detail=f"Файл не найден: {request.filename}") audio.recognition_status = "failed" audio.recognition_last_error = request.error db.commit() + logger.warning(f"❌ Распознавание помечено failed для {request.filename}. Причина: {request.error}") + + # Отправляем вебхук об ошибке в Calls_WEB_Client_main, чтобы синхронизировать pipeline_status + try: + if (audio.sourse or "").lower() != "external": + failed_webhook_payload = { + "audio_id": str(audio.id), + "filename": request.filename, + "status": "failed", + "error": request.error + } + webhook_url = f"{CALLS_WEB_CLIENT_URL}/api/transcription/failed" + logger.info(f"📤 Отправка failed-webhook в Calls_WEB_Client_main: {webhook_url}") + requests.post( + webhook_url, + json=failed_webhook_payload, + headers={"X-Webhook-Key": WEBHOOK_API_KEY}, + timeout=10 + ) + except Exception as e: + logger.error(f"❌ Ошибка отправки failed-webhook в Calls_WEB: {e}") + return AiConclusionResponse( success=True, message="Recognition marked as failed", audio_id=str(audio.id), filename=audio.filename ) +