File size: 3,963 Bytes
d3ddd31
 
 
 
 
 
ed3c017
d3ddd31
 
 
ed3c017
d3ddd31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import edge_tts
import asyncio
import os
# https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken=6A5AA1D4EAFF4E9FB37E23D68491D6F4
SUPPORTED_VOICES = {
    'Vivienne': 'fr-FR-VivienneMultilingualNeural',
    'Denise': 'fr-FR-DeniseNeural',
    'Eloise': 'fr-FR-EloiseNeural',
    'Remy': 'fr-FR-RemyMultilingualNeural',
    'Henri': 'fr-FR-HenriNeural'
}

# Modification de voix
def changeVoice(voices):
    example = SUPPORTED_VOICES[voices]
    example_file = os.path.join(os.path.dirname(__file__), "example/"+example+".mp3")
    return example_file

# Text to Speech
async def textToSpeech(text, voices, rate, volume):
    output_file = "output.mp3"
    voices = SUPPORTED_VOICES[voices]
    if (rate >= 0):
        rates = rate = "+" + str(rate) + "%"
    else:
        rates = str(rate) + "%"
    if (volume >= 0):
        volumes = "+" + str(volume) + "%"
    else:
        volumes = str(volume) + "%"
    communicate = edge_tts.Communicate(text,
                                       voices,
                                       rate=rates,
                                       volume=volumes,
                                       proxy=None)
    await communicate.save(output_file)
    audio_file = os.path.join(os.path.dirname(__file__), "output.mp3")
    if (os.path.exists(audio_file)):
        return audio_file
    else:
        raise gr.Error("La création a échoué!")
        return FileNotFoundError


# Effacer le texte et rendu
def clearSpeech():
    output_file = os.path.join(os.path.dirname(__file__), "output.mp3")
    if (os.path.exists(output_file)):
        os.remove(output_file)
    return None, None


with gr.Blocks(css="style.css", title="Text To Speech") as demo:
    gr.Markdown("""
    # Text-to-Speech FR
    Conversion texte en audio vocal avec edge-tts
    """)
    with gr.Row():
        with gr.Column():
            text = gr.TextArea(label="Entrez votre texte", elem_classes="text-area")
            btn = gr.Button("Convertir en audio vocal", elem_id="submit-btn")
        with gr.Column():
            voices = gr.Dropdown(choices=[
                "Vivienne", "Denise", "Eloise", "Remy",
                "Henri"
            ],
                                 value="Vivienne",
                                 label="Modèle de voix",
                                 info="Choix du modèle vocal FR (France)",
                                 interactive=True)
            
            example = gr.Audio(label="Exemple",
                              value="example/fr-FR-VivienneMultilingualNeural.mp3",
                              interactive=False,
                              autoplay=False,
                              elem_classes="example")

            voices.change(fn=changeVoice,inputs=voices,outputs=example)
            rate = gr.Slider(-100,
                             100,
                             step=1,
                             value=0,
                             label="Vitesse de parole",
                             info="Accélérer ou ralentir la voix",
                             interactive=True)
            
            volume = gr.Slider(-100,
                               100,
                               step=1,
                               value=0,
                               label="Volume",
                               info="Augmenter ou baisser le volume audio",
                               interactive=True)
            audio = gr.Audio(label="Rendu audio",
                             interactive=False,
                             elem_classes="audio")
            clear = gr.Button("Effacer", elem_id="clear-btn")
            btn.click(fn=textToSpeech,
                      inputs=[text, voices, rate, volume],
                      outputs=[audio])
            clear.click(fn=clearSpeech, outputs=[text, audio])

if __name__ == "__main__":
    demo.launch()