|
|
|
@ -149,6 +149,19 @@ def process_audio_file(audio_id: str, db: Session): |
|
|
|
|
|
|
|
|
|
|
|
logger.info(f"🎵 Запуск распознавания для {audio.filename}") |
|
|
|
logger.info(f"🎵 Запуск распознавания для {audio.filename}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Проверяем что файл существует на диске |
|
|
|
|
|
|
|
from apiApp.config import AUDIOFILES_PATH |
|
|
|
|
|
|
|
import os |
|
|
|
|
|
|
|
file_path = os.path.join(AUDIOFILES_PATH, audio.filename) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not os.path.exists(file_path): |
|
|
|
|
|
|
|
logger.error(f"❌ Файл не найден на диске в FileAudioAPI: {file_path}") |
|
|
|
|
|
|
|
# Помечаем audio как проблемный |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
file_size = os.path.getsize(file_path) |
|
|
|
|
|
|
|
logger.info(f"📁 Файл найден: {file_path} (размер: {file_size} bytes)") |
|
|
|
|
|
|
|
|
|
|
|
# Формируем запрос в GigaAM API - ИСПОЛЬЗУЕМ АСИНХРОННЫЙ ENDPOINT |
|
|
|
# Формируем запрос в GigaAM API - ИСПОЛЬЗУЕМ АСИНХРОННЫЙ ENDPOINT |
|
|
|
from apiApp.config import GIGAAM_API_URL |
|
|
|
from apiApp.config import GIGAAM_API_URL |
|
|
|
api_url = f"{GIGAAM_API_URL}/api/call/process/async" |
|
|
|
api_url = f"{GIGAAM_API_URL}/api/call/process/async" |
|
|
|
@ -169,6 +182,13 @@ def process_audio_file(audio_id: str, db: Session): |
|
|
|
else: |
|
|
|
else: |
|
|
|
logger.error(f"❌ Ошибка запуска распознавания для {audio.filename}: {response.status_code} - {response.text}") |
|
|
|
logger.error(f"❌ Ошибка запуска распознавания для {audio.filename}: {response.status_code} - {response.text}") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Дополнительная диагностика для 404 |
|
|
|
|
|
|
|
if response.status_code == 404: |
|
|
|
|
|
|
|
logger.error(f"🔍 Диагностика 404:") |
|
|
|
|
|
|
|
logger.error(f" - FileAudioAPI путь: {file_path}") |
|
|
|
|
|
|
|
logger.error(f" - Файл существует: {os.path.exists(file_path)}") |
|
|
|
|
|
|
|
logger.error(f" - GigaAM API URL: {api_url}") |
|
|
|
|
|
|
|
|
|
|
|
except requests.exceptions.Timeout: |
|
|
|
except requests.exceptions.Timeout: |
|
|
|
# Для асинхронного endpoint таймаут маловероятен, но обрабатываем |
|
|
|
# Для асинхронного endpoint таймаут маловероятен, но обрабатываем |
|
|
|
logger.warning(f"⏱️ Таймаут при отправке задачи для {audio.filename}") |
|
|
|
logger.warning(f"⏱️ Таймаут при отправке задачи для {audio.filename}") |
|
|
|
@ -338,12 +358,19 @@ async def get_audio_stats(db: Session = Depends(get_db)): |
|
|
|
# Проверяем существование файлов на диске |
|
|
|
# Проверяем существование файлов на диске |
|
|
|
all_audio = db.query(Audio).all() |
|
|
|
all_audio = db.query(Audio).all() |
|
|
|
existing_count = 0 |
|
|
|
existing_count = 0 |
|
|
|
|
|
|
|
missing_files = [] |
|
|
|
for audio in all_audio: |
|
|
|
for audio in all_audio: |
|
|
|
file_path = os.path.join(AUDIOFILES_PATH, audio.filename) |
|
|
|
file_path = os.path.join(AUDIOFILES_PATH, audio.filename) |
|
|
|
if os.path.exists(file_path): |
|
|
|
if os.path.exists(file_path): |
|
|
|
existing_count += 1 |
|
|
|
existing_count += 1 |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
missing_files.append({ |
|
|
|
|
|
|
|
"audio_id": str(audio.id), |
|
|
|
|
|
|
|
"filename": audio.filename, |
|
|
|
|
|
|
|
"index_date": audio.index_date.isoformat() if audio.index_date else None |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
|
stats = { |
|
|
|
"total_audio": total_audio, |
|
|
|
"total_audio": total_audio, |
|
|
|
"with_conclusion": with_conclusion, |
|
|
|
"with_conclusion": with_conclusion, |
|
|
|
"without_conclusion": without_conclusion, |
|
|
|
"without_conclusion": without_conclusion, |
|
|
|
@ -351,6 +378,13 @@ async def get_audio_stats(db: Session = Depends(get_db)): |
|
|
|
"missing_on_disk": total_audio - existing_count |
|
|
|
"missing_on_disk": total_audio - existing_count |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Добавляем список отсутствующих файлов (первые 50) |
|
|
|
|
|
|
|
if missing_files: |
|
|
|
|
|
|
|
stats["missing_files_sample"] = missing_files[:50] |
|
|
|
|
|
|
|
logger.warning(f"⚠️ Найдено {len(missing_files)} отсутствующих файлов") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return stats |
|
|
|
|
|
|
|
|
|
|
|
except Exception as e: |
|
|
|
except Exception as e: |
|
|
|
logger.error(f"❌ Ошибка при получении статистики: {e}") |
|
|
|
logger.error(f"❌ Ошибка при получении статистики: {e}") |
|
|
|
raise HTTPException( |
|
|
|
raise HTTPException( |
|
|
|
|