VideoQuERI / whisper_result.py
MohamedAlgebali's picture
initial commit
2ca28b3
import time
import streamlit as st
from gradio_client import Client
import yt_dlp
import pytube
from pytube.exceptions import VideoUnavailable
client = Client("https://sanchit-gandhi-whisper-jax.hf.space/")
def get_whisper_res_if_the_video_is_youtube_video(video_url, max_recursion_time=20):
start_time = time.time() # Get the start time
while True:
try:
result = client.predict(
video_url, # str in 'YouTube URL' Textbox component
"translate", # str in 'Task' Radio component
True, # bool in 'Return timestamps' Checkbox component
fn_index=6)
# print('return from fn_index=6')
return result
except:
try:
result = client.predict(
video_url, # str in 'YouTube URL' Textbox component
"translate", # str in 'Task' Radio component
True, # bool in 'Return timestamps' Checkbox component
fn_index=7)
# print('return from fn_index=7')
return result
except:
try:
result = client.predict(
video_url, # str in 'YouTube URL' Textbox component
"translate", # str in 'Task' Radio component
True, # bool in 'Return timestamps' Checkbox component
api_name="/predict_2")
# print('return from /predict_2')
return result
except:
if time.time() - start_time > max_recursion_time:
# result = get_whisper_res_if_the_video_is_not_youtube_video(video_url)
# return result
return
time.sleep(2)
continue
def get_whisper_res_if_the_video_is_not_youtube_video(video_url, max_recursion_time = 20):
start_time = time.time() # Get the start time
while True:
try:
result = client.predict(
video_url, # str (filepath or URL to file) in 'inputs' Audio component
"translate", # str in 'Task' Radio component
True, # bool in 'Return timestamps' Checkbox component
api_name="/predict")
return result
except:
try:
result = client.predict(
video_url, # str in 'YouTube URL' Textbox component
"translate", # str in 'Task' Radio component
True, # bool in 'Return timestamps' Checkbox component
api_name="/predict_1")
return result
except:
if time.time() - start_time > max_recursion_time:
result = get_whisper_res_if_the_video_is_youtube_video(video_url)
return result
time.sleep(2)
continue
def postprocess_timestamps(result, index):
output_list = []
for text in result[index].split('\n'):
start = text.split(' -> ')[0][1:]
if len(start.split(':')) == 2: #there are only minutes and seconds
min = int(start.split(':')[0])
sec = int(float(start.split(':')[1]))
index_of_space = text[24:].find(' ')
# text = text[24+index_of_space:]
text = ':'.join([str(min), str(sec)]) + text[24+index_of_space:]
output_list.append(text)
else: #there are hours also
start = text.split(' -> ')[0][1:]
hour = int(start.split(':')[0])
min = int(start.split(':')[1])
sec = int(float(start.split(':')[2]))
# text = text[30:]
text = ':'.join([str(hour),str(min),str(sec)]) + text[30:]
output_list.append(text)
return output_list
def postprocess_whisper_jax_output(result):
# index = 1 if youtube video, else if non-youtube video
try:
output_list = postprocess_timestamps(result, index=1)
except:
output_list = postprocess_timestamps(result, index=0)
return ', '.join(output_list)
def get_audio_info(url):
with yt_dlp.YoutubeDL() as ydl:
info = ydl.extract_info(url, download = False)
return info
def get_whisper_result(video_url):
# if the link is youtube video
if 'youtube.com/watch?v=' in video_url:
try:
video = pytube.YouTube(video_url)
video.check_availability()
result = get_whisper_res_if_the_video_is_youtube_video(video_url)
transcript = postprocess_whisper_jax_output(result)
return transcript
except VideoUnavailable:
return False
# if the link is not a youtube video
else:
result = get_whisper_res_if_the_video_is_not_youtube_video(video_url)
if result:
transcript = postprocess_whisper_jax_output(result)
return transcript
return False