File size: 5,916 Bytes
344b0ca
 
 
c1e96e4
 
 
 
 
 
 
 
 
33f847e
 
 
 
 
 
 
 
 
7c99d61
f5a482e
 
83b0834
 
93b1dd3
83b0834
8da7c99
3f83581
 
7f314ef
 
8da7c99
3f83581
c1e96e4
 
98c23d1
 
 
 
 
 
 
 
 
2f65f79
 
 
 
 
5b338ae
2f65f79
 
7632898
35154f1
 
 
 
 
 
 
 
 
e32709c
 
 
 
 
 
 
6ce4056
 
c1e96e4
a7848ca
 
 
 
 
 
 
 
7c99d61
3456ab2
7c99d61
 
0ff1a70
7c65e81
0ff1a70
 
aa3375f
 
 
235b4a7
 
d41816d
68f8ecb
 
 
90ade3c
ba77b50
f436550
 
fd4559f
9a290a3
2f65f79
9a290a3
7c99d61
 
 
 
9a290a3
 
f6fec6a
f904385
33f847e
4e820fe
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
# credits
# https://piper.ttstool.com/

import gradio as gr
import subprocess
import os
import json
import uuid
import requests
from pypipertts import PyPiper
pp=PyPiper()

my_examples = """
An der Zäit hunn sech den Nordwand an d’Sonn gestridden, wie vun hinnen zwee wuel méi staark wier,
wéi e Wanderer, deen an ee waarme Mantel agepak war, iwwert de Wee koum. 
Si goufen sech eens, datt deejéinege fir dee Stäerkste gëlle sollt, deen de Wanderer forcéiere géif, säi Mantel auszedoen. 
Den Nordwand huet mat aller Force geblosen, awer wat e méi geblosen huet, wat de Wanderer sech méi a säi Mantel agewéckelt huet. 
Um Enn huet den Nordwand säi Kampf opginn. Dunn huet d’Sonn d’Loft mat hire frëndleche Strale gewiermt, 
a schonn no kuerzer Zäit huet de Wanderer säi Mantel ausgedoen. Do huet den Nordwand missen zouginn, 
datt d’Sonn vun hinnen zwee dee Stäerkste wier."""

def init():
    key_list=pp.key_list
    # key_list=['lb_LU-marylux-medium']
    # print(key_list)
    return(gr.update(label="Voice",choices=key_list,value="lb_LU-marylux-medium",interactive=True))

def load_mod(instr="lb_LU-marylux-medium"):
    load_mes=gr.Info(f"""Loading Model...<br>{instr}""",duration=2)
    pp.load_mod(instr=instr) 
    with open(pp.json_ob,'r') as f:
        #json_ob=json.dumps(f.read(),indent=4)
        json_ob=f.read()
    load_mes=gr.Info(f"Model Loaded<br>{instr}",duration=2)
    return json_ob


def save_set(model,length,noise,width,sen_pause):
    if not os.path.isdir(f'{os.getcwd()}/saved'):
        os.mkdir(f'{os.getcwd()}/saved')
    set_json={"model":model,"length":length,"noise":noise,"width":width,"pause":sen_pause}
    file_name=f'{model}__{length}__{noise}__{width}__{sen_pause}'.replace(".","_")
    with open(f'{os.getcwd()}/saved/{file_name}.json','w') as file:
        file.write(json.dumps(set_json,indent=4))
    file.close()
    return(f'{os.getcwd()}/saved/{file_name}.json')

def load_set(set_file):
    with open(set_file,'r') as file:
        set_json=json.loads(file.read())
    file.close()
    return(gr.update(value=set_json['model']),gr.update(value=set_json['length']),
          gr.update(value=set_json['noise']),gr.update(value=set_json['width']),
          gr.update(value=set_json['pause']))
txt="""PiperTTS is a powerful text-to-speech TTS node designed to convert written text into high-quality spoken audio. This node leverages advanced voice synthesis models to generate natural-sounding speech, making it an invaluable tool for AI developers looking to add a vocal element to their projects."""
# def exp1():
#    exp_file=f"./example/en_US-libritts-high__1_4__0_3__0_2__1.json"
#    return(gr.update(value=txt),gr.update(value=exp_file))
# def exp2():
#    exp_file=f"./example/en_US-ryan-high__1__0_6__0_01__1.json"
#    return(gr.update(value=txt),gr.update(value=exp_file))
# def exp3():
#    exp_file=f"./example/en_US-ljspeech-high__1__1__0_5__1.json"
#    return(gr.update(value=txt),gr.update(value=exp_file))
def button_on(stream):
    if stream==True:
        return gr.update(interactive=True,visible=True),gr.update(interactive=False,visible=False)
    if stream==False:
        return gr.update(interactive=False,visible=False),gr.update(interactive=True,visible=True)
def clear_aud():
    return None
with gr.Blocks() as b:
    gr.HTML("<h1>Rhasspy Piper LU Streaming</h1>")
    with gr.Row():
        with gr.Column(scale=2):
            in_txt=gr.Textbox(label="Text",lines=10)
            names=gr.Dropdown()
            with gr.Row():
                stream_btn=gr.Button("Stream",interactive=True,visible=True)
                sub_btn=gr.Button(interactive=False,visible=False)
                cancel_btn=gr.Button("Stop")
            out_aud=gr.Audio(streaming=True, autoplay=True)        
        with gr.Column(scale=1):
            with gr.Accordion("Control", open=False):
                stream=gr.Checkbox(label="Stream",info="Streaming is fast, but lower quality",value=True,interactive=True)
                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=1, visible=True)
                # noise=1
                width=gr.Slider(label="Noise Width", minimum=0.01, maximum=3.0, value=1, visible=True)
                sen_pause=gr.Slider(label="Sentence Pause", minimum=0.1, maximum=10.0, value=1, visible=True)
                with gr.Tab("Save Settings"):
                    save_btn=gr.Button("Save")
                    save_file=gr.File()
                with gr.Tab("Load Settings"):
                    load_file=gr.File()
        # with gr.Column(scale=1):
            # expbtn1=gr.Button("Example 1").click(exp1,None,[in_txt,load_file])
            # expbtn2=gr.Button("Example 2").click(exp2,None,[in_txt,load_file])
            # expbtn3=gr.Button("Example 3").click(exp3,None,[in_txt,load_file])
            with gr.Accordion("Model Config", open=False):
                json_ob=gr.JSON(label="JSON")
            # with gr.Row():
                # gr.Textbox(label="Beispill", value=my_examples)
    f1=stream.change(button_on,stream,[stream_btn,sub_btn])
    f2=save_btn.click(save_set,[names,length,noise,width,sen_pause],save_file)
    f3=load_file.change(load_set,load_file,[names,length,noise,width,sen_pause])
    f4=names.change(load_mod,names,json_ob).then(clear_aud,None,out_aud)
    f5=stream_btn.click(clear_aud,None,out_aud)
    f6=stream_btn.click(pp.stream_tts,[in_txt,names,length,noise,width,sen_pause],out_aud)
    f7=sub_btn.click(clear_aud,None,out_aud)
    f8=sub_btn.click(pp.tts,[in_txt,names,length,noise,width,sen_pause],out_aud)
    cancel_btn.click(None,None,None,cancels=[f1,f2,f3,f4,f5,f6,f7,f8])
    # cancel_btn.click(None,None,None,cancels=[f1,f3,f5,f6,f7,f8])
    b.load(init,None,names)

# b.queue(default_concurrency_limit=20).launch(max_threads=40)
b.launch()