Spaces:
Runtime error
Runtime error
Update Gradio app for Aurora-1.6b-complete TTS
Browse files- .gitattributes +0 -33
- README.md +51 -12
- app.py +201 -0
- requirements.txt +11 -0
.gitattributes
CHANGED
@@ -1,35 +1,2 @@
|
|
1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
-
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
-
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
-
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
-
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
-
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
-
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
-
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
-
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
-
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
-
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
-
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
*.pt filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
2 |
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
README.md
CHANGED
@@ -1,12 +1,51 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
# 🎙️ Aurora-1.6b-complete Text-to-Speech Demo
|
3 |
+
|
4 |
+
Questa è una dimostrazione del modello Aurora-1.6b-complete per la sintesi vocale (Text-to-Speech), un modello fine-tuned basato su Dia-1.6B con pesi completi.
|
5 |
+
|
6 |
+
## 📋 Funzionalità
|
7 |
+
|
8 |
+
- **Conversione testo-voce** in italiano, inglese, spagnolo, francese e tedesco
|
9 |
+
- **Controllo della velocità** per regolare il ritmo dell'audio generato
|
10 |
+
- **Interfaccia intuitiva** con esempi predefiniti
|
11 |
+
|
12 |
+
## 🇮🇹 Ottimizzazione per l'italiano
|
13 |
+
|
14 |
+
Questo modello è stato ottimizzato specificamente per la lingua italiana, offrendo una pronuncia più naturale e fluida rispetto al modello base.
|
15 |
+
|
16 |
+
## 💻 Come utilizzare
|
17 |
+
|
18 |
+
1. Inserisci il testo che desideri convertire in voce
|
19 |
+
2. Seleziona la lingua del testo
|
20 |
+
3. Regola la velocità della voce se necessario
|
21 |
+
4. Clicca su "Genera Audio" per creare l'audio
|
22 |
+
|
23 |
+
## 🔬 Dettagli tecnici
|
24 |
+
|
25 |
+
- Modello base: [nari-labs/Dia-1.6B](https://huggingface.co/nari-labs/Dia-1.6B)
|
26 |
+
- Versione fine-tuned: [Lorenzob/aurora-1.6b](https://huggingface.co/Lorenzob/aurora-1.6b)
|
27 |
+
- Versione completa: [Lorenzob/aurora-1.6b-complete](https://huggingface.co/Lorenzob/aurora-1.6b-complete)
|
28 |
+
- Architettura: SpeechT5
|
29 |
+
|
30 |
+
## 📚 Limitazioni
|
31 |
+
|
32 |
+
- Il modello può avere difficoltà con testi molto lunghi
|
33 |
+
- Alcune parole tecniche o rare potrebbero non essere pronunciate correttamente
|
34 |
+
- I tempi di generazione dipendono dalle risorse disponibili sul server
|
35 |
+
|
36 |
+
## 📝 Citazione
|
37 |
+
|
38 |
+
Se utilizzi questo modello nei tuoi progetti, ti preghiamo di citare:
|
39 |
+
|
40 |
+
@misc{aurora-tts-2023,
|
41 |
+
author = {Lorenzo B.},
|
42 |
+
title = {Aurora-1.6b-complete: Italian-optimized Text-to-Speech model with full weights},
|
43 |
+
year = {2023},
|
44 |
+
publisher = {Hugging Face},
|
45 |
+
url = {https://huggingface.co/Lorenzob/aurora-1.6b-complete}
|
46 |
+
}
|
47 |
+
|
48 |
+
## 🙏 Riconoscimenti
|
49 |
+
|
50 |
+
- [nari-labs](https://huggingface.co/nari-labs) per il modello Dia-1.6B
|
51 |
+
- [Hugging Face](https://huggingface.co) per l'infrastruttura e gli strumenti
|
app.py
ADDED
@@ -0,0 +1,201 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
import gradio as gr
|
3 |
+
import torch
|
4 |
+
import os
|
5 |
+
from transformers import AutoProcessor, AutoModelForSpeechGeneration, set_seed
|
6 |
+
import numpy as np
|
7 |
+
from scipy import signal
|
8 |
+
import warnings
|
9 |
+
warnings.filterwarnings("ignore")
|
10 |
+
|
11 |
+
# Imposta un seed per la riproducibilità
|
12 |
+
set_seed(42)
|
13 |
+
|
14 |
+
# Definizioni di variabili globali
|
15 |
+
MODEL_REPO = "Lorenzob/aurora-1.6b-complete" # Repository aggiornata con il modello completo
|
16 |
+
SAMPLE_RATE = 24000 # Frequenza di campionamento per il modello TTS
|
17 |
+
|
18 |
+
# Cache per il modello e il processor (per evitare di ricaricarli ad ogni richiesta)
|
19 |
+
model = None
|
20 |
+
processor = None
|
21 |
+
|
22 |
+
def load_model_and_processor():
|
23 |
+
"""Carica il modello e il processor solo se non sono già stati caricati"""
|
24 |
+
global model, processor
|
25 |
+
|
26 |
+
if model is None or processor is None:
|
27 |
+
try:
|
28 |
+
print("📂 Caricamento del modello Aurora-1.6b-complete...")
|
29 |
+
processor = AutoProcessor.from_pretrained(MODEL_REPO)
|
30 |
+
model = AutoModelForSpeechGeneration.from_pretrained(
|
31 |
+
MODEL_REPO,
|
32 |
+
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
|
33 |
+
device_map="auto"
|
34 |
+
)
|
35 |
+
print("✅ Modello caricato con successo!")
|
36 |
+
except Exception as e:
|
37 |
+
print(f"❌ Errore nel caricamento del modello: {e}")
|
38 |
+
# Fallback al modello originale di Dia se il caricamento fallisce
|
39 |
+
print("⚠️ Tentativo di fallback al modello Dia-1.6B...")
|
40 |
+
processor = AutoProcessor.from_pretrained("nari-labs/Dia-1.6B")
|
41 |
+
model = AutoModelForSpeechGeneration.from_pretrained(
|
42 |
+
"nari-labs/Dia-1.6B",
|
43 |
+
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
|
44 |
+
device_map="auto"
|
45 |
+
)
|
46 |
+
print("✅ Modello di fallback caricato con successo!")
|
47 |
+
|
48 |
+
return model, processor
|
49 |
+
|
50 |
+
def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=False):
|
51 |
+
"""Converte testo in voce utilizzando il modello TTS"""
|
52 |
+
if not text.strip():
|
53 |
+
return None, "Per favore, inserisci del testo da convertire in voce."
|
54 |
+
|
55 |
+
# Log di debug
|
56 |
+
if show_log:
|
57 |
+
print(f"Richiesta TTS ricevuta: '{text}' (Lingua: {language}, Speaker: {speaker_id}, Velocità: {speed})")
|
58 |
+
|
59 |
+
try:
|
60 |
+
# Carica il modello e il processor (se non già caricati)
|
61 |
+
model, processor = load_model_and_processor()
|
62 |
+
|
63 |
+
# Prepara gli input per il modello
|
64 |
+
inputs = processor(
|
65 |
+
text=text,
|
66 |
+
language=language,
|
67 |
+
return_tensors="pt"
|
68 |
+
)
|
69 |
+
|
70 |
+
# Sposta gli input sul dispositivo di calcolo
|
71 |
+
for k, v in inputs.items():
|
72 |
+
if hasattr(v, "to"):
|
73 |
+
inputs[k] = v.to(model.device)
|
74 |
+
|
75 |
+
# Parametri per la generazione
|
76 |
+
gen_params = {
|
77 |
+
"do_sample": True,
|
78 |
+
"temperature": 0.7,
|
79 |
+
"top_k": 50,
|
80 |
+
"top_p": 0.95,
|
81 |
+
}
|
82 |
+
|
83 |
+
# Genera il speech
|
84 |
+
with torch.no_grad():
|
85 |
+
speech = model.generate(**inputs, **gen_params)
|
86 |
+
|
87 |
+
# Converti il tensore in un array numpy
|
88 |
+
speech_array = speech.cpu().numpy().squeeze()
|
89 |
+
|
90 |
+
# Applica il controllo della velocità
|
91 |
+
if speed != 1.0:
|
92 |
+
# Usa scipy.signal per ricampionare l'audio e cambiare la velocità
|
93 |
+
speech_array = signal.resample(speech_array, int(len(speech_array) / speed))
|
94 |
+
|
95 |
+
if show_log:
|
96 |
+
print(f"✅ Audio generato con successo! Lunghezza: {len(speech_array)} campioni")
|
97 |
+
|
98 |
+
return (SAMPLE_RATE, speech_array), None
|
99 |
+
except Exception as e:
|
100 |
+
error_msg = f"Errore nella generazione dell'audio: {str(e)}"
|
101 |
+
print(f"❌ {error_msg}")
|
102 |
+
return None, error_msg
|
103 |
+
|
104 |
+
# Esempi predefiniti per l'interfaccia
|
105 |
+
examples = [
|
106 |
+
["Ciao, mi chiamo Aurora e sono un assistente vocale italiano.", "it", 0, 1.0, False],
|
107 |
+
["Hello, my name is Aurora and I'm an Italian voice assistant.", "en", 0, 1.0, False],
|
108 |
+
["Hola, me llamo Aurora y soy un asistente de voz italiano.", "es", 0, 1.0, False],
|
109 |
+
["La vita è bella e il sole splende nel cielo azzurro.", "it", 0, 1.0, False],
|
110 |
+
["Mi piace viaggiare e scoprire nuove città e culture.", "it", 0, 1.2, False],
|
111 |
+
["L'intelligenza artificiale sta trasformando il modo in cui interagiamo con i computer e con il mondo che ci circonda.", "it", 0, 0.9, False]
|
112 |
+
]
|
113 |
+
|
114 |
+
# Definizione dell'interfaccia Gradio
|
115 |
+
with gr.Blocks(title="Aurora-1.6b TTS Demo", theme=gr.themes.Soft()) as demo:
|
116 |
+
gr.Markdown("""
|
117 |
+
# 🎙️ Aurora-1.6b Text-to-Speech Demo
|
118 |
+
|
119 |
+
Questa demo utilizza il modello **Aurora-1.6b-complete** per la sintesi vocale (TTS), un modello fine-tuned basato su Dia-1.6B con pesi completi.
|
120 |
+
|
121 |
+
Il modello supporta italiano, inglese, spagnolo, francese e tedesco, ma è stato ottimizzato per l'italiano.
|
122 |
+
""")
|
123 |
+
|
124 |
+
with gr.Row():
|
125 |
+
with gr.Column(scale=2):
|
126 |
+
text_input = gr.Textbox(
|
127 |
+
label="Testo da convertire in voce",
|
128 |
+
placeholder="Inserisci qui il testo da convertire...",
|
129 |
+
lines=5,
|
130 |
+
value="Ciao, sono Aurora, un assistente vocale italiano basato su intelligenza artificiale."
|
131 |
+
)
|
132 |
+
|
133 |
+
with gr.Row():
|
134 |
+
language_input = gr.Dropdown(
|
135 |
+
choices=["it", "en", "es", "fr", "de"],
|
136 |
+
label="Lingua",
|
137 |
+
value="it",
|
138 |
+
info="Seleziona la lingua del testo"
|
139 |
+
)
|
140 |
+
speaker_input = gr.Number(
|
141 |
+
label="Speaker ID",
|
142 |
+
value=0,
|
143 |
+
minimum=0,
|
144 |
+
maximum=10,
|
145 |
+
step=1,
|
146 |
+
info="ID dello speaker (solo per modelli multi-speaker)"
|
147 |
+
)
|
148 |
+
speed_input = gr.Slider(
|
149 |
+
minimum=0.5,
|
150 |
+
maximum=1.5,
|
151 |
+
value=1.0,
|
152 |
+
step=0.1,
|
153 |
+
label="Velocità",
|
154 |
+
info="Valori più bassi = voce più lenta, valori più alti = voce più veloce"
|
155 |
+
)
|
156 |
+
|
157 |
+
debug_input = gr.Checkbox(label="Mostra log di debug", value=False)
|
158 |
+
|
159 |
+
submit_btn = gr.Button("Genera Audio", variant="primary")
|
160 |
+
|
161 |
+
with gr.Column(scale=1):
|
162 |
+
audio_output = gr.Audio(label="Audio generato", show_share_button=True)
|
163 |
+
error_output = gr.Textbox(label="Messaggi di errore", visible=True)
|
164 |
+
|
165 |
+
# Esempi
|
166 |
+
gr.Examples(
|
167 |
+
examples=examples,
|
168 |
+
inputs=[text_input, language_input, speaker_input, speed_input, debug_input],
|
169 |
+
outputs=[audio_output, error_output],
|
170 |
+
fn=text_to_speech,
|
171 |
+
cache_examples=True,
|
172 |
+
)
|
173 |
+
|
174 |
+
# Info aggiuntive
|
175 |
+
gr.Markdown("""
|
176 |
+
## 📝 Note sull'utilizzo
|
177 |
+
|
178 |
+
- Il modello funziona meglio con frasi di lunghezza media (fino a 20-30 parole)
|
179 |
+
- Per l'italiano, il modello è stato ottimizzato per una pronuncia naturale
|
180 |
+
- La velocità di generazione dipende dalle risorse disponibili sul server
|
181 |
+
|
182 |
+
## 🔗 Crediti
|
183 |
+
|
184 |
+
Questo modello è una combinazione di:
|
185 |
+
- [Lorenzob/aurora-1.6b](https://huggingface.co/Lorenzob/aurora-1.6b) (versione fine-tuned)
|
186 |
+
- [Lorenzob/aurora-1.6b-complete](https://huggingface.co/Lorenzob/aurora-1.6b-complete) (versione completa con pesi)
|
187 |
+
- [nari-labs/Dia-1.6B](https://huggingface.co/nari-labs/Dia-1.6B) (modello base originale)
|
188 |
+
""")
|
189 |
+
|
190 |
+
# Configurazione degli eventi
|
191 |
+
submit_btn.click(
|
192 |
+
fn=text_to_speech,
|
193 |
+
inputs=[text_input, language_input, speaker_input, speed_input, debug_input],
|
194 |
+
outputs=[audio_output, error_output],
|
195 |
+
)
|
196 |
+
|
197 |
+
# Precarica il modello quando l'app viene avviata
|
198 |
+
load_model_and_processor()
|
199 |
+
|
200 |
+
# Avvia l'interfaccia
|
201 |
+
demo.launch()
|
requirements.txt
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
transformers>=4.30.0
|
3 |
+
torch>=1.13.0
|
4 |
+
torchaudio>=0.13.0
|
5 |
+
gradio>=3.50.0
|
6 |
+
numpy>=1.19.0
|
7 |
+
scipy>=1.10.0
|
8 |
+
soundfile>=0.12.1
|
9 |
+
accelerate>=0.20.0
|
10 |
+
sentencepiece>=0.1.99
|
11 |
+
safetensors>=0.3.1
|