Podcastify / app.py
eswardivi's picture
Added gradio_client API
c84c9fa
raw
history blame
2.69 kB
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 fetch_text(url):
print("Entered Webpage Extraction")
prefix_url = "https://r.jina.ai/"
url = prefix_url + url
response = httpx.get(url, timeout=120.0)
print("Response Received")
return response.text
@spaces.GPU
def synthesize(article_url, progress=gr.Progress()):
text = fetch_text(article_url)
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 = json.loads(conversation)
for i, turn in enumerate(conversation["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=speed, pbar=progress.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 final_audio_path
with gr.Blocks() as demo:
gr.Markdown("# Not Ready to USE")
gr.Markdown("# Turn Any Article into Podcast")
gr.Markdown("## Easily convert articles from URLs into listenable audio Podcast.")
with gr.Group():
text = gr.Textbox(label="Article Link")
btn = gr.Button("Podcasitfy", variant="primary")
aud = gr.Audio(interactive=False)
btn.click(synthesize, inputs=[text], outputs=[aud])
demo.queue(api_open=True, default_concurrency_limit=10).launch(show_api=True,share=True)