Spaces:
Sleeping
Sleeping
File size: 2,112 Bytes
7419e5c 2592a7b 7419e5c 56aa734 59ad8b8 dfb51ff 7419e5c 2592a7b 56aa734 2592a7b 56aa734 7419e5c 2592a7b 7419e5c dfb51ff 2592a7b 7419e5c 56aa734 7419e5c 56aa734 7419e5c 59ad8b8 7419e5c fdbe523 4ffbed1 56aa734 7419e5c 56aa734 7419e5c 59ad8b8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
from youtubeaudio import YoutubeMedia
import subprocess
import os
import uuid
import logging
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
import ffmpeg
class Url(BaseModel):
url: str
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.DEBUG,
datefmt="%H:%M:%S")
MODEL=os.environ['model']
BASE_DIR="/tmp/holosubs"
VIDEO_DIR=os.path.join(BASE_DIR,"videos")
app = FastAPI()
app.mount("/videos", StaticFiles(directory=VIDEO_DIR), name="videos")
# CORS
origins = ["*"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.post("/captions/")
def read_root(url: Url, request: Request):
requestID=str(uuid.uuid4())
# Download wav file and get filename
ytaudio=YoutubeMedia(url, os.path.join(BASE_DIR,requestID))
ytaudio.download()
audio_filename, video_filename = ytaudio.audio_filename, ytaudio.video_filename
# Resample file
ytaudio.resample('16k')
# Generate subtitles
subtitle_filename=os.path.join("/tmp/holosubs/tracks", requestID)
logging.info(f'Output will be writen to {subtitle_filename}.srt')
cmd=['/usr/local/bin/whisper','-m',f'/home/user/root/models/ggml-{MODEL}.bin'
,'-f',audio_filename, '-of', subtitle_filename, '-tr', '-osrt', '-mc', '0']
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
(output, err) = p.communicate()
p_status = p.wait()
if err:
logging.error("Translation failed with error",err)
raise HTTPException(status_code=500, detail="Whisper translation failed")
media=ffmpeg.input(video_filename)
ffmpeg.concat(media.video. \
filter('subtitles', subtitle_filename+".srt"), \
media.audio, v=1, a=1). \
output(os.path.join(VIDEO_DIR,requestID+".mp4")).run()
# Return video url delivered
return {"video": f'/videos/{requestID+".mp4"}'}
|