Spaces:
Running
on
Zero
Running
on
Zero
File size: 3,642 Bytes
4300fed 610f79e 4300fed 61c12f6 c84c9fa 1bb2f76 3661e80 7ffbb2d 4300fed 4fbe883 2227484 c84c9fa 532dc11 c84c9fa 1bb2f76 3661e80 8bb652f 3661e80 1bb2f76 610f79e 1bb2f76 88c49f0 1bb2f76 a3bb4a3 1bb2f76 8bb652f a3bb4a3 c84c9fa a3bb4a3 c84c9fa a3bb4a3 1bb2f76 a3bb4a3 4fbe883 1bb2f76 4fbe883 a3bb4a3 1bb2f76 4fbe883 a3bb4a3 1bb2f76 4fbe883 a3bb4a3 4300fed 1bb2f76 4300fed 610f79e 1bb2f76 70cbf96 c84c9fa |
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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
import gradio as gr
import spaces
import os, torch, io
import json
import re
os.system("python -m unidic download")
import httpx
# print("Make sure you've downloaded unidic (python -m unidic download) for this WebUI to work.")
from melo.api import TTS
import tempfile
import wave
from pydub import AudioSegment
from gradio_client import Client
client = Client("eswardivi/AIO_Chat")
def validate_url(url):
try:
response = httpx.get(url, timeout=60.0)
response.raise_for_status()
return response.text
except httpx.RequestError as e:
return f"An error occurred while requesting {url}: {str(e)}"
except httpx.HTTPStatusError as e:
return f"Error response {e.response.status_code} while requesting {url}"
except Exception as e:
return f"An unexpected error occurred: {str(e)}"
def fetch_text(url):
print("Entered Webpage Extraction")
prefix_url = "https://r.jina.ai/"
full_url = prefix_url + url
return validate_url(full_url)
@spaces.GPU
def synthesize(article_url,progress_audio=gr.Progress()):
if not article_url.startswith("http://") and not article_url.startswith("https://"):
return "URL must start with 'http://' or 'https://'",None
text = fetch_text(article_url)
if "Error" in text:
return text, None
device = "cuda" if torch.cuda.is_available() else "cpu"
template = """
{
"conversation": [
{"speaker": "", "text": ""},
{"speaker": "", "text": ""}
]
}
"""
result = client.predict(
f"{text} \n Convert the text as Elaborate Conversation between two people as Podcast.\nfollowing this template and return only JSON \n {template}",
0.9,
True,
1024,
api_name="/chat"
)
pattern = r"\{(?:[^{}]|(?:\{[^{}]*\}))*\}"
json_match = re.search(pattern, result)
if json_match:
conversation=json_match.group()
else:
conversation = template
speed = 1.0
models = {"EN": TTS(language="EN", device=device)}
speakers = ["EN-Default", "EN-US"]
combined_audio = AudioSegment.empty()
conversation_dict = json.loads(conversation)
for i, turn in enumerate(conversation_dict["conversation"]):
bio = io.BytesIO()
text = turn["text"]
speaker = speakers[i % 2]
speaker_id = models["EN"].hps.data.spk2id[speaker]
models["EN"].tts_to_file(text, speaker_id, bio, speed=1.0, pbar=progress_audio.tqdm, format="wav")
bio.seek(0)
audio_segment = AudioSegment.from_file(bio, format="wav")
combined_audio += audio_segment
final_audio_path = "final.mp3"
combined_audio.export(final_audio_path, format="mp3")
return conversation, final_audio_path
with gr.Blocks() as demo:
gr.Markdown("# Turn Any Article into a Podcast")
gr.Markdown("## Easily convert articles from URLs into listenable audio podcasts.")
gr.Markdown("### Instructions")
gr.Markdown("""
- **Step 1:** Paste the URL of the article you want to convert into the textbox.
- **Step 2:** Click on "Podcastify" to generate the podcast.
- **Step 3:** Listen to the podcast or view the conversation.
""")
with gr.Group():
text = gr.Textbox(label="Article Link")
btn = gr.Button("Podcastify", variant="primary")
with gr.Row():
conv_display = gr.Textbox(label="Conversation", interactive=False)
aud = gr.Audio(interactive=False)
btn.click(synthesize, inputs=[text], outputs=[conv_display, aud])
demo.queue(api_open=True, default_concurrency_limit=10).launch(show_api=True,share=True)
|