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)