Update routers/editor.py
Browse files- routers/editor.py +24 -14
routers/editor.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
from fastapi import APIRouter, HTTPException, UploadFile, File, Form
|
| 2 |
-
from fastapi.responses import StreamingResponse
|
| 3 |
from pydantic import BaseModel
|
| 4 |
from typing import Optional, List, Dict, Any, AsyncGenerator, Tuple
|
| 5 |
import os
|
|
@@ -45,6 +45,12 @@ class SmartCutRequest(BaseModel):
|
|
| 45 |
window_end: float
|
| 46 |
instruction: str
|
| 47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
# analyze_media has no request model — unlike every other endpoint here, it
|
| 49 |
# takes a direct multipart upload (UploadFile + Form fields), not a JSON
|
| 50 |
# body, precisely to avoid needing a hosted `media_url` at all (see
|
|
@@ -291,19 +297,23 @@ CATÁLOGO DE AÇÕES DISPONÍVEIS (campos entre colchetes são opcionais):
|
|
| 291 |
"remove o silêncio desse vídeo", "corta as pausas", "tira os momentos
|
| 292 |
sem fala", "deixa o vídeo mais dinâmico cortando o silêncio". Diferente
|
| 293 |
de smart_cut_video: essa ação NÃO julga o CONTEÚDO da fala (não escolhe
|
| 294 |
-
"as melhores partes"
|
| 295 |
-
corta
|
| 296 |
-
|
| 297 |
-
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 307 |
|
| 308 |
No máximo UMA ação assíncrona (smart_cut_video, analyze_media OU
|
| 309 |
remove_silence_video — nunca duas ou mais na mesma resposta) por resposta —
|
|
|
|
| 1 |
from fastapi import APIRouter, HTTPException, UploadFile, File, Form
|
| 2 |
+
from fastapi.responses import StreamingResponse, JSONResponse
|
| 3 |
from pydantic import BaseModel
|
| 4 |
from typing import Optional, List, Dict, Any, AsyncGenerator, Tuple
|
| 5 |
import os
|
|
|
|
| 45 |
window_end: float
|
| 46 |
instruction: str
|
| 47 |
|
| 48 |
+
class DetectPausesRequest(BaseModel):
|
| 49 |
+
video_url: str
|
| 50 |
+
# Same window convention as SmartCutRequest above.
|
| 51 |
+
window_start: float
|
| 52 |
+
window_end: float
|
| 53 |
+
|
| 54 |
# analyze_media has no request model — unlike every other endpoint here, it
|
| 55 |
# takes a direct multipart upload (UploadFile + Form fields), not a JSON
|
| 56 |
# body, precisely to avoid needing a hosted `media_url` at all (see
|
|
|
|
| 297 |
"remove o silêncio desse vídeo", "corta as pausas", "tira os momentos
|
| 298 |
sem fala", "deixa o vídeo mais dinâmico cortando o silêncio". Diferente
|
| 299 |
de smart_cut_video: essa ação NÃO julga o CONTEÚDO da fala (não escolhe
|
| 300 |
+
"as melhores partes", não tem `instruction`) — ela transcreve o clipe e
|
| 301 |
+
corta qualquer trecho SEM PALAVRA RECONHECIDA. Isso é deliberadamente
|
| 302 |
+
diferente de só medir o volume do áudio: uma pausa de um palestrante pra
|
| 303 |
+
receber aplausos/risadas da plateia não é SILENCIOSA (a plateia faz
|
| 304 |
+
barulho), mas também não tem fala reconhecida — então essa ação corta
|
| 305 |
+
isso corretamente, o que um limiar de volume sozinho não conseguiria. Só
|
| 306 |
+
use "minSilenceSeconds" quando o usuário der um número explícito (ex:
|
| 307 |
+
"remove pausas de mais de 1 segundo" → `"minSilenceSeconds": 1`); sem
|
| 308 |
+
isso, omita o campo e deixe o editor usar o padrão dele (~0.6s).
|
| 309 |
+
"elementId" tem que ser um elemento de vídeo real do arquivo anexado
|
| 310 |
+
(nunca um `refId` de um elemento que você acabou de criar). Essa ação
|
| 311 |
+
NÃO é aplicada na hora — o editor ainda precisa transcrever o áudio do
|
| 312 |
+
clipe primeiro (mais rápido que smart_cut_video, que ainda por cima
|
| 313 |
+
precisa de uma segunda passada do Gemini pra decidir o que manter — aqui
|
| 314 |
+
não há essa segunda passada). Por isso, quando usar essa ação, o texto da
|
| 315 |
+
sua resposta deve deixar isso claro (ex: "Vou ouvir o áudio e cortar as
|
| 316 |
+
pausas."), nunca afirmar que o corte já foi feito.
|
| 317 |
|
| 318 |
No máximo UMA ação assíncrona (smart_cut_video, analyze_media OU
|
| 319 |
remove_silence_video — nunca duas ou mais na mesma resposta) por resposta —
|