File size: 4,583 Bytes
a18a113 4d8a5fc 3bed379 17ca647 752e0a6 17ca647 a18a113 17ca647 a18a113 0cfb05e 4d8a5fc 0cfb05e a18a113 17ca647 752e0a6 377c676 752e0a6 0653992 752e0a6 17ca647 752e0a6 a18a113 0cfb05e 17ca647 a18a113 17ca647 a18a113 17ca647 a18a113 |
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 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
import gradio as gr
import torchaudio
import torchaudio.transforms as T
from transformers import pipeline
import requests
from pydub import AudioSegment
from pydub.silence import split_on_silence
import io
import os
from bs4 import BeautifulSoup
import re
import numpy as np
from moviepy.editor import VideoFileClip
import soundfile as sf
from spellchecker import SpellChecker
import tempfile
# Load the transcription model
transcription_pipeline = pipeline("automatic-speech-recognition", model="facebook/wav2vec2-base-960h")
spell = SpellChecker()
def download_audio_from_url(url):
try:
if "share" in url:
print("Processing shareable link...")
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
video_tag = soup.find('video')
if video_tag and 'src' in video_tag.attrs:
video_url = video_tag['src']
print(f"Extracted video URL: {video_url}")
else:
raise ValueError("Direct video URL not found in the shareable link.")
else:
video_url = url
print(f"Downloading video from URL: {video_url}")
response = requests.get(video_url)
audio_bytes = response.content
print(f"Successfully downloaded {len(audio_bytes)} bytes of data")
return audio_bytes
except Exception as e:
print(f"Error in download_audio_from_url: {str(e)}")
raise
def correct_spelling(text):
words = text.split()
corrected_words = [spell.correction(word) or word for word in words]
return ' '.join(corrected_words)
def format_transcript(transcript):
sentences = transcript.split('.')
formatted_transcript = []
current_speaker = None
for sentence in sentences:
if ':' in sentence:
speaker, content = sentence.split(':', 1)
if speaker != current_speaker:
formatted_transcript.append(f"\n\n{speaker.strip()}:{content.strip()}.")
current_speaker = speaker
else:
formatted_transcript.append(f"{content.strip()}.")
else:
formatted_transcript.append(sentence.strip() + '.')
return ' '.join(formatted_transcript)
def transcribe_audio(video_bytes):
try:
with open("temp_video.mp4", "wb") as f:
f.write(video_bytes)
video = VideoFileClip("temp_video.mp4")
audio = video.audio
audio.write_audiofile("temp_audio.wav", fps=16000, nbytes=2, codec='pcm_s16le')
audio_data, sample_rate = sf.read("temp_audio.wav")
if len(audio_data.shape) > 1:
audio_data = audio_data.mean(axis=1)
audio_data = audio_data.astype(np.float32) / np.max(np.abs(audio_data))
result = transcription_pipeline(audio_data)
transcript = result['text']
transcript = correct_spelling(transcript)
transcript = format_transcript(transcript)
os.remove("temp_video.mp4")
os.remove("temp_audio.wav")
return transcript
except Exception as e:
print(f"Error in transcribe_audio: {str(e)}")
raise
def transcribe_video(url):
try:
print(f"Attempting to download audio from URL: {url}")
audio_bytes = download_audio_from_url(url)
print(f"Successfully downloaded {len(audio_bytes)} bytes of audio data")
print("Starting audio transcription...")
transcript = transcribe_audio(audio_bytes)
print("Transcription completed successfully")
return transcript
except Exception as e:
error_message = f"An error occurred: {str(e)}"
print(error_message)
return error_message
def download_transcript(transcript):
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.txt') as temp_file:
temp_file.write(transcript)
temp_file_path = temp_file.name
return temp_file_path
# Create the Gradio interface
with gr.Blocks(title="Video Transcription") as demo:
gr.Markdown("# Video Transcription")
video_url = gr.Textbox(label="Video URL")
transcribe_button = gr.Button("Transcribe")
transcript_output = gr.Textbox(label="Transcript", lines=20)
download_button = gr.Button("Download Transcript")
download_link = gr.File(label="Download Transcript")
transcribe_button.click(fn=transcribe_video, inputs=video_url, outputs=transcript_output)
download_button.click(fn=download_transcript, inputs=transcript_output, outputs=download_link)
demo.launch() |