File size: 7,243 Bytes
a235177
1748047
a235177
75642d2
c2542f3
419f14a
 
b1081f1
10ac278
 
 
 
 
341551d
10ac278
 
 
341551d
10ac278
 
 
ff0a552
10ac278
1ab460b
 
 
 
 
 
 
 
777324c
 
1ab460b
b46d61b
7b00e7b
 
 
 
 
 
 
777324c
 
7b00e7b
310b87d
b862fa4
310b87d
a5e39a0
a4d4c8f
a5e39a0
 
10ac278
b089d6a
6bf8b90
b089d6a
c2da80d
5c46438
c786d64
055e117
 
2b2d395
e01ef92
2b2d395
bbe1467
 
4598a69
001f294
bbe1467
777324c
2e65244
777324c
 
e624d12
777324c
4da7dd9
2b2d395
 
8e92529
 
2b2d395
 
bd42d08
8e92529
a33e7cb
 
4598a69
001f294
a33e7cb
 
 
4598a69
001f294
a33e7cb
8e92529
2b2d395
 
a3c2554
bda4d01
9ca0fe5
c881a86
2b2d395
8461fa2
93b762a
a33e7cb
 
 
001f294
a33e7cb
98209df
c881a86
 
98209df
a3c2554
98209df
 
b089d6a
09cf596
d460b3d
 
 
 
 
 
 
 
 
5205e31
a3c2554
5205e31
 
 
 
 
a3c2554
2fbd6b6
 
a235177
 
 
c2da80d
 
3c03888
8e92529
 
 
 
 
3c03888
8e92529
9c0b4b8
be9b837
777324c
8ecffb4
867cecb
 
688fae6
867cecb
 
 
688fae6
867cecb
 
688fae6
b3b21d5
 
 
688fae6
b3b21d5
5205e31
b089d6a
6212d30
25d6248
5dd8843
c54e11c
09f8707
5dd8843
a5e39a0
a4d4c8f
c1bf04e
5e8fad8
 
 
0e2c94e
5e8fad8
 
 
 
 
a4d4c8f
5e8fad8
a4d4c8f
 
 
 
c1bf04e
a4d4c8f
9a9808f
a4d4c8f
 
 
 
c2542f3
8ecffb4
867cecb
8ecffb4
 
5e8fad8
5205e31
a5e39a0
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
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 = """
<script>
function run(inn, url_in) {
    let url = String(url_in)
    console.log(inn);
    console.log(url);
    
    var frame_on = document.getElementById('frame' + String(inn));
    frame_on.style.display = 'block';
    var framediv = document.getElementById('framediv' + String(inn));
    let child0 = framediv.lastElementChild;
    while (child0) {
        framediv.removeChild(child0);
        child0=framediv.lastElementChild;
    }   
    const iframediv = document.createElement('iframe');
      iframediv.src = 'https://docs.google.com/viewer?url=' + url +'&embedded=true';
      iframediv.width = '100%'; 
      iframediv.height = '1000px';
      iframediv.frameborder="0";
      framediv.appendChild(iframediv);
}
</script>
<script>
function closefn(inn) {
    console.log(inn);
    var frame_off = document.getElementById('frame' + String(inn));
    var aud = document.getElementById('aud' + String(inn));
    var framediv = document.getElementById('framediv' + String(inn));
    frame_off.style.display = 'none';
    let child1 = aud.lastElementChild;
    while (child1) {
        aud.removeChild(child1);
        child1=aud.lastElementChild;
    }
    let child2 = framediv.lastElementChild;
    while (child2) {
        framediv.removeChild(child2);
        child2 = framediv.lastElementChild;
    }      
}
</script>
<script>
function readfn(inn, url_in, payload) {
    let url = String(url_in);
    console.log(inn);
    console.log(url);
    var readit = document.getElementById('aud' + String(inn));
    let api = 'https://broadfield-fast-voice.hf.space/?pdfurl=' + url + '&mod=' + payload['model'] + '&len=' + payload['length']+ '&nos=' + payload['noise']+ '&wid=' + payload['width'] + '&pau=' + payload['pause'];
    console.log(api);
    let child = readit.lastElementChild;
    while (child) {
        readit.removeChild(child);
        child=readit.lastElementChild;
    }    
    const iframe = document.createElement('iframe');
    
      iframe.src = api;
      iframe.width = '100%'; 
      iframe.height = '220px';
      readit.appendChild(iframe);
}
</script>
"""
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"""<div class='card_div' id='id{i}' onclick="run('{i}','{pdflink}')">
                   <div class='title_div'>{c['title']}</div>
                    <div style='color:white;'>{c['summary']}</div>
                    <div><a href='{pdflink}' target='_blank'>{pdflink}</a></div>
                   </div>
        <div id=frame{i} class='frame_class'>
        <div id=read{i} class='read_btn' onclick="readfn('{i}','{pdflink}',{payload})">Read</div>
        <div id=close{i} class='x_btn' onclick='closefn({i})'>X</div>
        <div id=aud{i}></div>
        <div id=framediv{i}></div>
        </div>"""
    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"<div><center>Showing {cur} through {new}</center></div>"
    return html_out

with gr.Blocks(css=style,head=head) as b:
    gr.HTML("""<center><div><h1 style='font-size:xxx-large;font-weight:900;'>arXiv Reader with Voice</h1>
    <h2>Read arXiv papers using Piper Text-to-Voice</h2></div><br>
    <div style="justify-self:center;">
    <h7 style="float:left;">Piper: <a href='https://github.com/rhasspy/piper' target='_blank'>https://github.com/rhasspy/piper</a></h7><br>
    <h7 style="float:left;">PyPiperTTS: <a href='https://github.com/broadfield-dev/PyPiperTTS' target='_blank'>https://github.com/broadfield-dev/PyPiperTTS</a></h7>
    </div></center>""")
    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)