File size: 6,884 Bytes
7e9eac8
d853661
b6e1649
7e9eac8
 
b6e1649
 
7e9eac8
98329d0
7e9eac8
 
1bf2dab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e9eac8
 
5b5f8d9
7e9eac8
9e20056
684c796
69f50e2
7e9eac8
5b5f8d9
 
bfd6986
5b5f8d9
 
bfd6986
5b5f8d9
bfd6986
 
 
 
 
 
 
5b5f8d9
bfd6986
 
 
5b5f8d9
bfd6986
 
5b5f8d9
 
bfd6986
 
7e9eac8
 
 
 
5b5f8d9
 
 
7e9eac8
 
 
5b5f8d9
 
 
7e9eac8
 
 
5b5f8d9
7e9eac8
5b5f8d9
7e9eac8
 
 
dd6a80b
5b5f8d9
dd6a80b
7e9eac8
dd6a80b
7e9eac8
 
 
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
import logging
import os
import time
import uuid
import gradio as gr
import soundfile as sf
from model import get_pretrained_model, language_to_models

title = "# Conversão de texto para fala (TTS)"

description = """
**Projeto Open Source de Text-to-Speech para Produção de Conteúdo com Inteligência Artificial: Voz Inteligente para Criadores de Cursos e Podcasters**

---

**Visão Geral do Projeto:**

O projeto Text-to-Speech (TTS) de código aberto visa capacitar criadores de cursos online e podcasters a produzirem conteúdo de alta qualidade através da aplicação de tecnologias avançadas de inteligência artificial. Ao oferecer uma solução robusta e flexível, o projeto busca democratizar o acesso a vozes naturais e envolventes, eliminando barreiras linguísticas e proporcionando uma experiência de aprendizado ou entretenimento mais inclusiva.

---

**Principais Recursos:**

1. **Voz Natural e Expressiva:** Utiliza modelos de síntese de voz avançados para gerar vozes que soam naturais, expressivas e adaptáveis ao contexto do conteúdo.

2. **Suporte Multilíngue:** Incorpora diversos idiomas para atender a uma audiência global, permitindo aos criadores atingir uma ampla variedade de públicos.

3. **Personalização de Voz:** Oferece ferramentas para ajustar a entonação, velocidade e estilo da voz, permitindo que os criadores personalizem a experiência auditiva de acordo com suas preferências e o tom do conteúdo.

4. **Integração de Acentos e Dialeto:** Inclui suporte para diferentes acentos e dialetos, enriquecendo a autenticidade da experiência de audição.

5. **Controle de Emoções:** Permite a inserção de nuances emocionais na voz, tornando possível transmitir entusiasmo, empatia ou seriedade conforme necessário.

6. **API Amigável:** Disponibiliza uma API intuitiva para facilitar a integração com plataformas de criação de conteúdo, ambientes de aprendizado online e ferramentas de produção de podcasts.

7. **Modelo de Treinamento Aberto:** Encoraja a contribuição da comunidade para a melhoria contínua do modelo, permitindo que a inteligência artificial se aprimore com o tempo e a diversidade de dados.

---

**Objetivos do Projeto:**

1. **Acessibilidade Global:** Tornar a produção de conteúdo acessível a todos, independentemente do idioma ou localização geográfica.

2. **Facilitar a Criação de Cursos Online:** Capacitar educadores a criar cursos envolventes e interativos, melhorando a experiência de aprendizado dos alunos.

3. **Aprimorar Produções de Podcast:** Permitir que podcasters forneçam narrativas cativantes e experiências auditivas excepcionais aos ouvintes.

4. **Desenvolvimento Sustentável:** Fomentar uma comunidade aberta e colaborativa para garantir a evolução contínua do projeto.

---

**Como Contribuir:**

O projeto Text-to-Speech é totalmente aberto à contribuição da comunidade. Se você é um desenvolvedor, designer, linguista ou entusiasta da inteligência artificial, sua participação é bem-vinda. Contribua com códigos, sugestões de recursos, correções de bugs ou simplesmente compartilhe suas experiências para enriquecer a diversidade de perspectivas.

Junte-se a nós na missão de tornar a produção de conteúdo mais acessível, envolvente e impactante com a magia da inteligência artificial aplicada à síntese de voz!
"""

css = """.result {display:flex;flex-direction:column}.result_item {padding:15px;margin-bottom:8px;border-radius:15px;width:100%}.result_item_success {background-color:mediumaquamarine;color:white;align-self:start}.result_item_error {background-color:#ff7070;color:white;align-self:start}"""

examples = [["Portuguese", "csukuangfj/vits-mms-por", "Computação é arte.", 0, 1.0]]

language_choices = ["Portuguese"]

def update_model_dropdown(language):
    return gr.Dropdown(choices=language_to_models.get(language, []), value=language_to_models.get(language, [""])[0], interactive=True)

def build_html_output(s, style="result_item_success"):
    return f"""<div class='result'><div class='result_item {style}'>{s}</div></div>"""

def process(language, repo_id, text, sid, speed):
    logging.info(f"Input text: {text}. sid: {sid}, speed: {speed}")
    sid = int(sid)
    tts = get_pretrained_model(repo_id, speed)
    start = time.time()
    audio = tts.generate(text, sid=sid)
    end = time.time()
    if len(audio.samples) == 0:
        raise ValueError("Error in generating audios. Please read previous error messages.")
    duration = len(audio.samples) / audio.sample_rate
    elapsed_seconds = end - start
    rtf = elapsed_seconds / duration
    info = f"""Wave duration  : {duration:.3f} s <br/>Processing time: {elapsed_seconds:.3f} s <br/>RTF: {elapsed_seconds:.3f}/{duration:.3f} = {rtf:.3f} <br/>"""
    logging.info(info)
    logging.info(f"\nrepo_id: {repo_id}\ntext: {text}\nsid: {sid}\nspeed: {speed}")
    filename = str(uuid.uuid4()) + ".wav"
    sf.write(filename, audio.samples, samplerate=audio.sample_rate, subtype="PCM_16")
    return filename, build_html_output(info)

demo = gr.Blocks(css=css)

with demo:
    gr.Markdown(title)
    language_radio = gr.Radio(label="Language", choices=language_choices, value=language_choices[0])
    model_dropdown = gr.Dropdown(choices=language_to_models["Portuguese"], label="Select a model", value=language_to_models["Portuguese"][0])
    language_radio.change(update_model_dropdown, inputs=language_radio, outputs=model_dropdown)

    with gr.Tabs():
        with gr.TabItem("Please input your text"):
            input_text = gr.Textbox(label="Input text", info="Your text", lines=3, placeholder="Please input your text here")
            input_sid = gr.Textbox(label="Speaker ID", info="Speaker ID", lines=1, max_lines=1, value="0", placeholder="Speaker ID. Valid only for mult-speaker model")
            input_speed = gr.Slider(minimum=0.1, maximum=10, value=1, step=0.1, label="Speed (larger->faster; smaller->slower)")
            input_button = gr.Button("Submit")
            output_audio = gr.Audio(label="Output")
            output_info = gr.HTML(label="Info")
            gr.Examples(examples=examples, fn=process, inputs=[language_radio, model_dropdown, input_text, input_sid, input_speed], outputs=[output_audio, output_info])

        input_button.click(process, inputs=[language_radio, model_dropdown, input_text, input_sid, input_speed], outputs=[output_audio, output_info])

    gr.Markdown(description)

def download_espeak_ng_data():
    os.system("""cd /tmp; wget -qq https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/espeak-ng-data.tar.bz2; tar xf espeak-ng-data.tar.bz2""")

if __name__ == "__main__":
    download_espeak_ng_data()
    formatter = "%(asctime)s %(levelname)s [%(filename)s:%(lineno)d] %(message)s"
    logging.basicConfig(format=formatter, level=logging.INFO)
    demo.launch()