Spaces:
Build error
Build error
from transformers import pipeline | |
import gradio as gr | |
import moviepy.editor as mp | |
from pytube import YouTube | |
import math | |
pipe = pipeline(model="Campfireman/whisper-small-hi") # change to "your-username/the-name-you-picked" | |
segment_length = 25 # 25s per segment | |
def download_video(url): | |
print("Downloading...") | |
local_file = ( | |
YouTube(url) | |
.streams.filter(progressive=True, file_extension="mp4") | |
.first() | |
.download() | |
) | |
print("Downloaded") | |
global my_clip | |
global original_wav | |
my_clip = mp.VideoFileClip(local_file) | |
my_clip.audio.write_audiofile("AUDIO_ORIGINAL.wav") | |
original_wav = mp.AudioFileClip("AUDIO_ORIGINAL.wav") | |
global audio_length | |
audio_length = original_wav.duration | |
print("Overall audio time elapsed: "+str(audio_length)) | |
return local_file | |
def validate_youtube(url): | |
#This creates a youtube object | |
try: | |
yt = YouTube(url) | |
except Exception: | |
print("Hi the URL seems not a valid YouTube video link") | |
return True | |
#This will return the length of the video in sec as an int | |
video_length = yt.length | |
if video_length > 600: | |
print("Your video is longer than 10 minutes") | |
return False | |
else: | |
print("Your video is less than 10 minutes") | |
return True | |
def validate_url(url): | |
import validators | |
if not validators.url(url): | |
return True | |
else: | |
return False | |
def audio_clipper(index, seg_total): | |
my_audio = "audio_out"+str(index)+".wav" | |
audio_clipped_obj = mp.AudioFileClip.copy(original_wav) | |
print("Segment "+str(index)+":") | |
# Clipping | |
if (index > 0): | |
print("Clipped: 0 ~ " + str(segment_length * (index)) + "sec") | |
audio_clipped_obj = mp.AudioFileClip.cutout(audio_clipped_obj, 0, segment_length * (index)) | |
if (index < seg_total - 1): | |
print("Clipped: " + str(segment_length * (index + 1)) + "~ " + str(audio_length) +" sec") | |
audio_clipped_obj = mp.AudioFileClip.cutout(audio_clipped_obj, segment_length * (index + 1), audio_length) | |
# Write out the temporary segment data | |
mp.AudioFileClip.write_audiofile(audio_clipped_obj, my_audio) | |
#audio_clipped_obj.audio.write_audiofile(my_audio) | |
return my_audio | |
def transcribe(video_url): | |
text = "" | |
if validate_url(video_url): | |
if not validate_youtube(video_url): | |
return "The URL seems not for Youtube videos or the video is too long. Check out the errors in the log. " | |
else: | |
download_video(video_url) | |
else: | |
return "Invalid URL. Please check the format of your link. " | |
segment_count = math.ceil(audio_length / segment_length) | |
print("Total segments: "+str(segment_count)) | |
if segment_count <= 0: | |
return "Corrupted Video Data! Invalid length of "+str(segment_count * 25)+" second(s)." | |
else: | |
for x in range(segment_count): | |
audio = audio_clipper(x, segment_count) | |
seg_text = pipe(audio, batch_size=512, truncation=True)["text"] | |
print("Segtext: ") | |
print(seg_text) | |
text = text + seg_text | |
return text | |
def transcribe2(audio): | |
text = pipe(audio)["text"] | |
return text | |
iface = gr.Interface( fn=transcribe, | |
inputs=gr.Textbox(label = "Enter the URL of the Youtube video clip here (without prefixes like http://):"), | |
outputs="text", | |
title="Whisper Small SE", | |
description="Video Swedish Transcriptior", | |
) | |
iface2 = gr.Interface( | |
fn=transcribe2, | |
inputs=gr.Audio(source="microphone", type="filepath"), | |
outputs="text", | |
title="Whisper Small Swedish", | |
description="Realtime demo for Swedish speech recognition using a fine-tuned Whisper small model.", | |
) | |
demo = gr.TabbedInterface([iface, iface2],["Swedish YouTube Video to Text", "Swedish Audio to Text"]) | |
demo.launch() | |