66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
"""Vstupní bod aplikace audio-transcription.
|
|
|
|
Stateless FastAPI služba běžící v AppFactory za reverse proxy `/apps/<app-id>`.
|
|
Přijímá audio + parametry v POST, přepisuje ho paralelně (Deepgram + OpenAI Whisper)
|
|
a volitelně slučuje do jednoho co nejlepšího přepisu. Výstup je vždy JSON.
|
|
|
|
API klíče se předávají per-request v X- hlavičkách, nikdy se neukládají ani nelogují.
|
|
"""
|
|
import os
|
|
|
|
from fastapi import FastAPI
|
|
|
|
from .config import APP_NAME, APP_VERSION, ROOT_PATH
|
|
from .errors import register_exception_handlers
|
|
from .logging_config import configure_logging
|
|
from .routers import meta, transcribe
|
|
|
|
configure_logging()
|
|
|
|
DESCRIPTION = """
|
|
Přepis hovorů / audia dvěma engine (Deepgram + OpenAI) a jejich AI sloučení do jednoho
|
|
co nejpřesnějšího přepisu — vše v jednom requestu.
|
|
|
|
### Přihlašovací údaje (hlavičky)
|
|
Secrets se předávají v hlavičkách u každého requestu — nikdy v těle ani v URL:
|
|
|
|
- `X-Deepgram-Api-Key` — Deepgram API klíč (Deepgram Console → API Keys)
|
|
- `X-OpenAI-Api-Key` — OpenAI API klíč (platform.openai.com → API keys)
|
|
|
|
### Endpoint
|
|
- `POST /dual-with-merge` — audio přepíše paralelně Deepgramem i OpenAI (whisper-1) a oba
|
|
texty sloučí přes OpenAI Chat dle `combine_prompt`. Vrací JSON
|
|
`{"gpt": ..., "deepgram": ..., "merge": ...}`
|
|
(`gpt` = OpenAI whisper-1, `deepgram` = Deepgram, `merge` = sloučený výsledek).
|
|
|
|
Audio se posílá jako proměnná `file` (multipart/form-data). Ostatní parametry
|
|
(modely, jazyk, prompt) jsou form fields v POST.
|
|
|
|
### Chyby
|
|
JSON `{error, message, detail}`. 400 = špatný/prázdný nebo nepodporovaný audio soubor,
|
|
401 = chybějící nebo upstreamem odmítnutý API klíč, 429 = rate limit, 502 = výpadek
|
|
upstreamu.
|
|
"""
|
|
|
|
app = FastAPI(
|
|
title=APP_NAME,
|
|
version=APP_VERSION,
|
|
description=DESCRIPTION,
|
|
root_path=ROOT_PATH,
|
|
)
|
|
|
|
register_exception_handlers(app)
|
|
|
|
app.include_router(meta.router)
|
|
app.include_router(transcribe.router)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
import uvicorn
|
|
|
|
uvicorn.run(
|
|
"app.main:app",
|
|
host="0.0.0.0",
|
|
port=int(os.getenv("PORT", "8000")),
|
|
)
|