SimpleLearn_2 / src /video_processing.py
MrSimple01's picture
Update src/video_processing.py
244c212 verified
import os
import requests
import uuid
import subprocess
import time
import os
import tempfile
import subprocess
from typing import Optional, Tuple, List
import pytube
import docx
import PyPDF2
import re
from src.quiz_processing import analyze_document
def extract_audio_from_video(video_path, output_format="mp3"):
if not video_path:
return None
output_path = f"audio_{uuid.uuid4().hex[:6]}.{output_format}"
try:
cmd = [
"ffmpeg",
"-i", video_path,
"-vn",
"-c:a", "libmp3lame" if output_format == "mp3" else output_format,
"-q:a", "9",
"-ac", "1",
"-ar", "12000",
"-y", output_path
]
subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if os.path.exists(output_path):
return output_path
else:
raise Exception("Audio extraction failed")
except Exception as e:
raise Exception(f"Error extracting audio: {str(e)}")
def transcribe_audio(audio_path, elevenlabs_api_key, model_id="scribe_v1"):
import requests
import tempfile
try:
url = "https://api.elevenlabs.io/v1/speech-to-text"
headers = {"xi-api-key": elevenlabs_api_key}
with open(audio_path, "rb") as file:
files = {"file": file}
data = {"model_id": model_id}
response = requests.post(
url,
headers=headers,
files=files,
data=data,
timeout=120
)
if response.status_code == 200:
result = response.json()
transcription = result.get('text', '')
# Save transcription to file
transcript_path = tempfile.mktemp(suffix='.txt')
with open(transcript_path, 'w', encoding='utf-8') as f:
f.write(transcription)
return transcription, transcript_path, "Transcription completed successfully"
else:
return None, None, f"Transcription failed: {response.text}"
except Exception as e:
return None, None, f"Transcription error: {str(e)}"
def process_video_file(video_path, audio_format, elevenlabs_api_key, model_id, gemini_api_key, language, content_type):
try:
audio_path = extract_audio_from_video(video_path, audio_format)
transcription, transcript_path, transcription_status = transcribe_audio(
audio_path,
elevenlabs_api_key,
model_id
)
if not transcription:
return audio_path, "Audio extracted, but transcription failed", None, transcription_status, None, None, None
# Generate summary or quiz from transcription
formatted_output, json_path, txt_path = analyze_document(
transcription,
gemini_api_key,
language,
content_type
)
return audio_path, "Processing completed successfully", transcript_path, transcription_status, formatted_output, txt_path, json_path
except Exception as e:
error_message = f"Error processing video: {str(e)}"
return None, error_message, None, error_message, error_message, None, None
def process_youtube_video(youtube_url, audio_format, elevenlabs_api_key, model_id, gemini_api_key, language, content_type):
try:
yt = pytube.YouTube(youtube_url)
stream = yt.streams.filter(progressive=True, file_extension='mp4').order_by('resolution').desc().first()
if not stream:
raise Exception("No suitable video stream found")
video_path = tempfile.mktemp(suffix='.mp4')
stream.download(filename=video_path)
audio_path = extract_audio_from_video(video_path, audio_format)
transcription, transcript_path, transcription_status = transcribe_audio(
audio_path,
elevenlabs_api_key,
model_id
)
if not transcription:
return audio_path, "Audio extracted, but transcription failed", None, transcription_status, None, None, None
# Generate summary or quiz from transcription
formatted_output, json_path, txt_path = analyze_document(
transcription,
gemini_api_key,
language,
content_type
)
return audio_path, "Processing completed successfully", transcript_path, transcription_status, formatted_output, txt_path, json_path
except Exception as e:
error_message = f"Error processing YouTube video: {str(e)}"
return None, error_message, None, error_message, error_message, None, None
def process_audio_document(audio_path, elevenlabs_api_key, model_id, gemini_api_key, language, content_type):
try:
# Transcribe the audio
transcription, transcript_path, transcription_status = transcribe_audio(
audio_path,
elevenlabs_api_key,
model_id
)
if not transcription:
return "Transcription failed", None, None, None, None
# Generate summary or quiz from transcription
formatted_output, json_path, txt_path = analyze_document(
transcription,
gemini_api_key,
language,
content_type
)
return "Processing completed successfully", transcript_path, formatted_output, txt_path, json_path
except Exception as e:
error_message = f"Error processing audio: {str(e)}"
return error_message, None, error_message, None, None