File size: 2,688 Bytes
4300fed
610f79e
4300fed
61c12f6
c84c9fa
 
3661e80
7ffbb2d
4300fed
 
4fbe883
2227484
c84c9fa
532dc11
c84c9fa
3661e80
8bb652f
3661e80
 
c84c9fa
 
3661e80
 
a3bb4a3
610f79e
a3bb4a3
 
8bb652f
 
a3bb4a3
 
 
 
 
 
 
 
 
c84c9fa
 
 
 
 
 
a3bb4a3
c84c9fa
 
 
 
 
 
a3bb4a3
1821dd9
a3bb4a3
1821dd9
a3bb4a3
610f79e
4fbe883
c84c9fa
61c12f6
4fbe883
 
 
a3bb4a3
 
 
 
4fbe883
 
 
 
a3bb4a3
 
4fbe883
 
a3bb4a3
4300fed
a3bb4a3
 
 
4300fed
610f79e
a3bb4a3
4300fed
610f79e
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
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)