import gradio as gr from openai import OpenAI import tempfile import time import typing as tp from pathlib import Path from pydub import AudioSegment from dotenv import load_dotenv load_dotenv() client = OpenAI() class FileCleaner: def __init__(self, file_lifetime: float = 3600): self.file_lifetime = file_lifetime self.files = [] def add(self, path: tp.Union[str, Path]): self._cleanup() self.files.append((time.time(), Path(path))) def _cleanup(self): now = time.time() for time_added, path in list(self.files): if now - time_added > self.file_lifetime: if path.exists(): path.unlink() self.files.pop(0) else: break file_cleaner = FileCleaner() intro = AudioSegment.from_mp3("intro.mp3") DEFAULT_SYSTEM_PROMPT = """ You are a podcast editor that specialized to create a script out of a webpage. [TASKS] - You will receive a link to a webpage about some content. - You will create a script out of the content. - The script should be 1 minute long if you read it out loud. - Start with an intro to peak the interest of the listener. - Then, summarize the content in a way that is easy to understand. Ask questions about the the content and answer them. - Conclude with the most intriguing part of the content. - Refrain from adding section headers in the script like [INTRUCTION], [CONTENT], [CONCLUSION]. - The script should be inspiring, written in colloquialism with english words and proverbs understood around the world. - Write in a relax tone. - Use filler words like 'um', 'ah', 'well' etc. to make it sound more natural. [BREAKS] - Use the tag to add a pause in the speech. Use it after each paragraph and after a sentence when appropriate to get to a relax tone. - Use for longer pauses, to emphasize a point. """ def generate_episode(system_prompt, weblink): response = client.chat.completions.create( model="gpt-4o", messages=[ {"role": "system", "content": system_prompt}, {"role": "user", "content": weblink}, ] ) script = response.choices[0].message.content response = client.audio.speech.create( model="tts-1", voice="fable", input=script, ) with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as podcast_file: podcast_file.write(response.content) file_cleaner.add(podcast_file.name) podcast = AudioSegment.from_mp3(podcast_file.name) merged_audio = intro + podcast with tempfile.NamedTemporaryFile(suffix=".mp3", delete=False) as final_file: merged_audio.export(final_file.name, format="mp3") print("MP3 files merged successfully!") return final_file.name, script demo = gr.Interface( fn=generate_episode, inputs=[ gr.Textbox(label="System Prompt"), gr.Textbox(label="Weblink"), ], outputs=[gr.Audio(label="Podcast Audio"), gr.Textbox(label="Podcast Script")], examples=[ [DEFAULT_SYSTEM_PROMPT, "https://en.wikipedia.org/wiki/Mount_Tambora"], [DEFAULT_SYSTEM_PROMPT, "https://en.wikipedia.org/wiki/Great_Wall_of_China"], [DEFAULT_SYSTEM_PROMPT, "https://en.wikipedia.org/wiki/Apollo_11"], ], title="Webpage To Podcast", description="""
Welcome to our Podcast Script Generator! This tool transforms web content into captivating podcast scripts in a relaxed and natural tone. Simply provide a weblink, and in just moments, you’ll receive an engaging, one-minute script and audio version. Perfect for creating short podcast episodes from online articles and summaries!
""" ) if __name__ == "__main__": demo.launch()