Spaces:
Running
Running
File size: 2,591 Bytes
d9efe10 e9d5607 83f07d9 d9efe10 83f07d9 d9efe10 83f07d9 d9efe10 83f07d9 d9efe10 83f07d9 e9d5607 4714e38 83f07d9 4714e38 d9efe10 e9d5607 f4064e9 e9d5607 d9efe10 4714e38 d9efe10 4714e38 d9efe10 83f07d9 d9efe10 83f07d9 d9efe10 |
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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
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
summary = summary_chain.run(text=article_text)
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()
|