yt-chunking / app.py
imsoumya18's picture
update
9860708
Raw
History Blame Contribute Delete
1.95 kB
import os
# from pytube import YouTube
from pytubefix import YouTube
from pytubefix.cli import on_progress
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
import gradio as gr
def seconds_to_hms(seconds):
if type(seconds).__name__ != 'float':
return seconds
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60
return f"{int(hours):02}:{int(minutes):02}:{int(seconds):02}"
def chunk_youtube(yt_url):
yt = YouTube(yt_url, on_progress_callback=on_progress)
audio = yt.streams.filter(only_audio=True, file_extension='mp4').first()
audio.download(filename="audio.mp3")
yield "Stage 1: Audio download DONE"
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
torch.cuda.empty_cache()
model_id = "openai/whisper-large-v3"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id, torch_dtype=torch_dtype, low_cpu_mem_usage=True, use_safetensors=True
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
max_new_tokens=128,
chunk_length_s=30,
batch_size=16,
return_timestamps=True,
torch_dtype=torch_dtype,
device=device,
)
result = pipe("audio.mp3", return_timestamps=True)
transcript = result["chunks"]
yield "Stage 2: LLM processing DONE"
output = ""
for i in transcript:
output += str(seconds_to_hms(i["timestamp"][0])) + " - " + str(seconds_to_hms(i["timestamp"][1])) + ":\n" + i[
"text"] + "\n"
yield output
iface = gr.Interface(fn=chunk_youtube, inputs="text", outputs="text", live=True)
iface.launch()