import gradio as gr
import xmltodict
import requests
import json
import uuid
from pypipertts import PyPiper
pp=PyPiper()
style="""
.title_div{
font-size: x-large;
font-weight: 700;
margin-bottom: 10px;
color: white;
}
.card_div{
background: #050523;
color: white;
margin: 10px;
padding: 15px;
border-radius: 5px;
cursor: pointer;
}
.x_btn{
font-size: xx-large;
font-weight: 900;
background: chocolate;
width: fit-content;
padding: 0 10px;
border-radius: 10px 10px 0 0;
float: right;
cursor: pointer;
}
.read_btn{
font-size: xx-large;
font-weight: 900;
background: chocolate;
width: fit-content;
padding: 0 10px;
border-radius: 10px 10px 0 0;
float: left;
cursor: pointer;
}
.frame_class{
display:none;
}
#big_btn {
height:5em;
border-radius:15px;
}
"""
head = """
"""
def update_voice(names,length,noise,width,sen_pause):
payload={
"model": names,
"length": length,
"noise": noise,
"width": width,
"pause": sen_pause
}
return payload
def search(q,rn,st,names,length,noise,width,sen_pause):
payload={
"model": names,
"length": length,
"noise": noise,
"width": width,
"pause": sen_pause
}
api=f"http://export.arxiv.org/api/query?search_query={str(q)}&start={str(st)}&max_results={str(rn)}"
r=requests.get(api)
cont=xmltodict.parse(r.content)['feed']['entry']
html=""
for i,c in enumerate(cont):
pdflink=c['id'].replace('/abs/','/pdf/').replace('http:','https:')
print(pdflink)
html+=f"""
{c['title']}
{c['summary']}
"""
return html
def next_show(cur):
new=int(cur)+10
return gr.update(interactive=True),new
def prev_show(cur):
if int(cur)-10 <=0:
new=0
out_gr=gr.update(interactive=False)
else:
new=int(cur)-10
out_gr=gr.update(interactive=True)
return out_gr,new
def show_num(cur):
new=int(cur)+10
html_out=f"Showing {cur} through {new}"
return html_out
with gr.Blocks(css=style,head=head) as b:
gr.HTML("""arXiv Reader with Voice
Read arXiv papers using Piper Text-to-Voice
""")
with gr.Row():
gr.Column(scale=1)
with gr.Column(scale=3):
with gr.Group():
query=gr.Textbox(label="Query",info="Search arXiv papers")
with gr.Accordion("Voice Controls",open=False):
names=gr.Dropdown(label="Voice", choices=pp.key_list,value="en_US-lessac-high")
length=gr.Slider(label="Length", minimum=0.01, maximum=10.0, value=1)
noise=gr.Slider(label="Noise", minimum=0.01, maximum=3.0, value=0.5)
width=gr.Slider(label="Noise Width", minimum=0.01, maximum=3.0, value=0.5)
sen_pause=gr.Slider(label="Sentence Pause", minimum=0.1, maximum=10.0, value=1)
upd_btn=gr.Button("Update")
sub=gr.Button(elem_id='big_btn')
with gr.Group():
with gr.Row():
prev_btn=gr.Button("Previous",interactive=False)
next_btn=gr.Button("Next")
show_html=gr.HTML()
gr.Column(scale=1)
html_out=gr.HTML()
with gr.Column(visible=False):
num=gr.Number(label="Count",step=1,value=10,interactive=False)
json_out=gr.JSON()
hid_start=gr.Number(step=1,value=0,visible=False, interactive=False)
next_btn.click(next_show,[hid_start],[prev_btn,hid_start]).then(show_num,hid_start,show_html).then(search,[query,num,hid_start],[html_out])
prev_btn.click(prev_show,[hid_start],[prev_btn,hid_start]).then(show_num,hid_start,show_html).then(search,[query,num,hid_start],[html_out])
upd_btn.click(search,[query,num,hid_start,names,length,noise,width,sen_pause],[html_out]).then(show_num,hid_start,show_html)
sub.click(search,[query,num,hid_start,names,length,noise,width,sen_pause],[html_out]).then(show_num,hid_start,show_html)
b.queue(default_concurrency_limit=20).launch(max_threads=40)