47 lines
1.5 KiB
Python
47 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
from backend.app.services.processors.audio_processor import AudioProcessor
|
|
from backend.app.services.processors.base import ProcessedContent
|
|
|
|
|
|
class VideoProcessor:
|
|
def __init__(self, tmp_dir: Path):
|
|
self.tmp_dir = tmp_dir
|
|
|
|
def process(self, path: Path) -> ProcessedContent:
|
|
self.tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
audio_path = self.tmp_dir / f"{path.stem}.wav"
|
|
try:
|
|
subprocess.run(
|
|
[
|
|
"ffmpeg",
|
|
"-y",
|
|
"-i",
|
|
str(path),
|
|
"-vn",
|
|
"-acodec",
|
|
"pcm_s16le",
|
|
"-ar",
|
|
"16000",
|
|
"-ac",
|
|
"1",
|
|
str(audio_path),
|
|
],
|
|
check=True,
|
|
capture_output=True,
|
|
text=True,
|
|
)
|
|
processed = AudioProcessor().process(audio_path)
|
|
processed.title = f"Transcripcion {path.stem}"
|
|
processed.processor = "ffmpeg+deepgram"
|
|
return processed
|
|
except FileNotFoundError as exc:
|
|
raise RuntimeError("ffmpeg no esta instalado o no esta disponible en PATH") from exc
|
|
except subprocess.CalledProcessError as exc:
|
|
raise RuntimeError(f"No se pudo extraer audio del video: {exc.stderr}") from exc
|
|
finally:
|
|
audio_path.unlink(missing_ok=True)
|