import gradio as gr from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain.llms import HuggingFacePipeline from transformers import pipeline from bs4 import BeautifulSoup import requests from TTS.api import TTS import tempfile # Setup summarization LLM summary_pipe = pipeline("text2text-generation", model="google/flan-t5-base", device=-1) llm = HuggingFacePipeline(pipeline=summary_pipe) # Prompt for more engaging summary summary_prompt = PromptTemplate.from_template(""" Summarize the following article content in a clear, warm, and motivational tone like a preacher speaking to an audience: {text} Summary: """) summary_chain = LLMChain(llm=llm, prompt=summary_prompt) # TTS model setup (multi-lingual, expressive) tts_model = TTS(model_name="tts_models/multilingual/multi-dataset/your_tts", progress_bar=False, gpu=False) def extract_main_content(url): try: response = requests.get(url, timeout=10) soup = BeautifulSoup(response.content, "html.parser") for tag in soup(["nav", "header", "footer", "aside", "script", "style", "noscript"]): tag.decompose() paragraphs = soup.find_all("p") content = "\n".join([p.get_text() for p in paragraphs if len(p.get_text()) > 60]) return content.strip() except Exception as e: return f"Error extracting article content: {str(e)}" def generate_human_like_audio(text): try: temp_path = tempfile.NamedTemporaryFile(delete=False, suffix=".wav") tts_model.tts_to_file(text=text, file_path=temp_path.name) return temp_path.name except Exception as e: return None def url_to_audio_summary(url): try: article_text = extract_main_content(url) if article_text.startswith("Error"): return article_text, None # Truncate for model's 512-token limit if len(article_text) > 1500: article_text = article_text[:1500] + "..." summary = summary_chain.invoke({"text": article_text}) summary = summary["text"] if isinstance(summary, dict) and "text" in summary else summary audio_path = generate_human_like_audio(summary) if not audio_path: return summary, None return summary, audio_path except Exception as e: return f"Error: {str(e)}", None iface = gr.Interface( fn=url_to_audio_summary, inputs=gr.Textbox(label="Article URL", placeholder="Paste a news/blog URL here..."), outputs=[ gr.Textbox(label="Summary"), gr.Audio(label="Preacher-style Audio Summary") ], title="Preaching-Style URL to Audio Agent", description="Summarizes article content and reads it aloud in a warm, preacher-style voice using YourTTS. CPU-only." ) if __name__ == "__main__": iface.launch()