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): try: if file and url: return None, "Please provide either a PDF file or a URL, not both." if file: if not file.name.lower().endswith('.pdf'): return None, "Please upload a PDF file." pdf_reader = pypdf.PdfReader(file.name) text = "" for page in pdf_reader.pages: text += page.extract_text() elif url: text = extract_text_from_url(url) else: return None, "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.") script = generate_script(SYSTEM_PROMPT, truncated_text, tone, length) audio_segments = [] transcript = "" try: for item in script.dialogue: audio_file = generate_audio(item.text, item.speaker) audio_segment = AudioSegment.from_mp3(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=".mp3") as temp_audio: combined_audio.export(temp_audio.name, format="mp3") temp_audio_path = temp_audio.name return temp_audio_path, transcript except Exception as e: return None, f"An error occurred: {str(e)}" instructions = """ # Podcast Generator Welcome to the Podcast Generator project! This tool creates custom podcast episodes using AI-generated content. ## Features * Generate podcast scripts from PDF content or web pages * Convert text to speech for a natural listening experience * Choose the tone of your podcast (Humorous, Casual, or Formal) * Export episodes as MP3 files ## How to Use 1. Upload a PDF file OR enter a URL (content will be truncated to 2048 tokens if longer) 2. Select the desired tone: - Humorous: Expect jokes, puns, and playful banter - Casual: Colloquial language, like a conversation between college students - Formal: Professional podcast style with well-structured arguments 3. Choose the podcast length 4. Click "Generate" to create your podcast 5. Listen to the generated audio and review the transcript Note: This tool uses the LLaMa 3.1 70B model for script generation and gTTS for text-to-speech conversion. The podcast features Sarah (American accent) and Maria (British accent) as hosts. """ iface = gr.Interface( fn=generate_podcast, inputs=[ gr.File(label="Upload PDF file (optional)", file_types=[".pdf"]), gr.Textbox(label="OR Enter URL"), gr.Radio(["humorous", "casual", "formal"], label="Select podcast tone", value="casual"), gr.Radio(["Short (1-2 min)", "Medium (3-5 min)"], label="Podcast length", value="Medium (3-5 min)") ], outputs=[ gr.Audio(label="Generated Podcast"), gr.Markdown(label="Transcript") ], title="Custom NotebookLM-type Podcast Generator (2048 token limit)", description=instructions, allow_flagging="never", theme=gr.themes.Soft() ) if __name__ == "__main__": iface.launch()