File size: 2,185 Bytes
416840c
be89ec7
f0db570
ecb2850
7263dd8
ecb2850
7263dd8
416840c
be89ec7
 
 
7263dd8
be89ec7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7263dd8
 
 
 
 
 
3e62a46
7263dd8
 
 
 
 
 
3e62a46
7263dd8
ea2bf21
7263dd8
 
 
 
 
 
 
 
ea2bf21
 
7263dd8
 
 
f0db570
ea2bf21
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
import gradio as gr
from utils import generate_script, generate_audio, truncate_text, extract_text_from_url
from prompts import SYSTEM_PROMPT
from pydub import AudioSegment
import pypdf
import os
import tempfile

def generate_podcast(file, url, tone, length):
    if file and url:
        raise gr.Error("Please provide either a PDF file or a URL, not both.")
    
    if file:
        if not file.name.lower().endswith('.pdf'):
            raise gr.Error("Please upload a PDF file.")
        
        try:
            pdf_reader = pypdf.PdfReader(file.name)
            text = ""
            for page in pdf_reader.pages:
                text += page.extract_text()
        except Exception as e:
            raise gr.Error(f"Error reading the PDF file: {str(e)}")
    elif url:
        try:
            text = extract_text_from_url(url)
        except Exception as e:
            raise gr.Error(f"Error extracting text from URL: {str(e)}")
    else:
        raise gr.Error("Please provide either a PDF file or a URL.")
    
    truncated_text = truncate_text(text)
    if len(truncated_text) < len(text):
        print("Warning: The input text was truncated to fit within 2048 tokens.")
    
    try:
        script = generate_script(SYSTEM_PROMPT, truncated_text, tone, length)
    except Exception as e:
        raise gr.Error(f"Error generating script: {str(e)}")
    
    audio_segments = []
    transcript = ""
    try:
        for item in script.dialogue:
            audio_file = generate_audio(item.text, item.speaker)
            audio_segment = AudioSegment.from_wav(audio_file)
            audio_segments.append(audio_segment)
            transcript += f"**{item.speaker}**: {item.text}\n\n"
            os.remove(audio_file)  # Clean up temporary audio file
    except Exception as e:
        raise gr.Error(f"Error generating audio: {str(e)}")
    
    combined_audio = sum(audio_segments)
    
    with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
        combined_audio.export(temp_audio.name, format="wav")
        temp_audio_path = temp_audio.name
    
    return temp_audio_path, transcript

# The rest of the app.py file remains the same