LipsyncDocker / app.py
Shadhil's picture
Upload 425 files
1a79cb6 verified
raw
history blame contribute delete
No virus
2.11 kB
import os
import shutil
import subprocess
import tempfile
import urllib.request
from typing import Tuple, Optional
import asyncio
from fastapi import FastAPI, File, UploadFile, HTTPException
from fastapi.responses import FileResponse
from pydantic import BaseModel, HttpUrl
app = FastAPI()
class VideoAudioRequest(BaseModel):
face_url: HttpUrl
audio_url: HttpUrl
def download_file(url: str, destination: str) -> None:
try:
with urllib.request.urlopen(str(url)) as response, open(destination, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
except Exception as e:
raise HTTPException(status_code=500, detail=f"Failed to download file from {url}: {e}")
async def process_video_and_audio(face_url: str, audio_url: str) -> Tuple[str, Optional[str]]:
print("process started")
temp_dir = tempfile.mkdtemp(prefix="fastapi_processing_")
face_path = os.path.join(temp_dir, "face.mp4")
audio_path = os.path.join(temp_dir, "audio.mp3")
try:
download_file(face_url, face_path)
download_file(audio_url, audio_path)
print(face_path,audio_path)
except HTTPException as e:
return "", str(e)
outfile_path = os.path.join(temp_dir, "result.mp4")
command = f"python3 inference.py --face {face_path} --audio {audio_path} --outfile {outfile_path}"
try:
process = await asyncio.create_subprocess_shell(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
_, error = await process.communicate()
if process.returncode == 0:
return outfile_path, None
else:
return "", f"Error occurred during processing: {error.decode()}"
except Exception as e:
return "", f"Error occurred during processing: {e}"
@app.post("/process_video_audio")
async def process_video_audio(request_data: VideoAudioRequest):
result, error = await process_video_and_audio(request_data.face_url, request_data.audio_url)
if result:
return FileResponse(result, media_type="video/mp4")
else:
raise HTTPException(status_code=500, detail=error)