File size: 5,070 Bytes
344b0ca
 
 
c1e96e4
 
 
 
 
 
 
 
 
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
 
cd0abec
 
 
235b4a7
 
f05b573
68f8ecb
 
 
9a290a3
 
7c99d61
9a290a3
2f65f79
9a290a3
7c99d61
 
 
 
9a290a3
 
f6fec6a
f904385
e32709c
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
# 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()

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"):
                json_ob=gr.JSON(label="JSON")
    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)