Spaces:
Runtime error
Runtime error
Soluzione finale per Aurora con persistenza dell'audio
Browse files
app.py
CHANGED
@@ -20,12 +20,17 @@ torch.manual_seed(42)
|
|
20 |
MODEL_REPO = "Lorenzob/aurora-1.6b-complete" # Repository del modello
|
21 |
CACHE_DIR = "./model_cache" # Directory per la cache del modello
|
22 |
SAMPLE_RATE = 24000 # Frequenza di campionamento
|
|
|
23 |
|
24 |
# Cache per componenti del modello
|
25 |
processor = None
|
26 |
model = None
|
27 |
speaker_embeddings_cache = {}
|
28 |
|
|
|
|
|
|
|
|
|
29 |
def download_file(url, save_path):
|
30 |
"""Scarica un file da un URL"""
|
31 |
response = requests.get(url, stream=True)
|
@@ -75,9 +80,6 @@ def fix_aurora_config():
|
|
75 |
config_url = f"https://huggingface.co/{MODEL_REPO}/resolve/main/config.json"
|
76 |
local_config_path = os.path.join(CACHE_DIR, "config.json")
|
77 |
|
78 |
-
# Crea la directory cache se non esiste
|
79 |
-
os.makedirs(CACHE_DIR, exist_ok=True)
|
80 |
-
|
81 |
try:
|
82 |
# Scarica il file di configurazione
|
83 |
print(f"Scaricamento della configurazione da {config_url}...")
|
@@ -187,6 +189,24 @@ def load_aurora_model_manually():
|
|
187 |
|
188 |
return model, processor
|
189 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
190 |
def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=True):
|
191 |
"""Converte testo in voce utilizzando Aurora-1.6b-complete"""
|
192 |
if not text.strip():
|
@@ -271,6 +291,12 @@ def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=True):
|
|
271 |
if show_log:
|
272 |
print(f"✅ Audio generato con successo! Lunghezza: {len(speech_array)} campioni")
|
273 |
|
|
|
|
|
|
|
|
|
|
|
|
|
274 |
return (sample_rate, speech_array), None
|
275 |
except Exception as e:
|
276 |
error_msg = f"Errore nella generazione dell'audio: {str(e)}"
|
@@ -279,6 +305,31 @@ def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=True):
|
|
279 |
print(f"❌ {detailed_error}")
|
280 |
return None, detailed_error
|
281 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
282 |
# Esempi predefiniti per l'interfaccia
|
283 |
examples = [
|
284 |
["Ciao, mi chiamo Aurora e sono un assistente vocale italiano.", "it", 0, 1.0, True],
|
@@ -291,6 +342,9 @@ examples = [
|
|
291 |
|
292 |
# Definizione dell'interfaccia Gradio
|
293 |
with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as demo:
|
|
|
|
|
|
|
294 |
gr.Markdown("""
|
295 |
# 🎙️ Aurora-1.6b-complete Text-to-Speech Demo
|
296 |
|
@@ -337,7 +391,12 @@ with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as
|
|
337 |
submit_btn = gr.Button("Genera Audio", variant="primary")
|
338 |
|
339 |
with gr.Column(scale=1):
|
340 |
-
audio_output = gr.Audio(
|
|
|
|
|
|
|
|
|
|
|
341 |
error_output = gr.Textbox(label="Messaggi di errore", visible=True, lines=6)
|
342 |
|
343 |
# Esempi
|
@@ -357,6 +416,7 @@ with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as
|
|
357 |
- Puoi cambiare lo Speaker ID per ottenere voci con caratteristiche diverse
|
358 |
- La velocità di generazione dipende dalle risorse disponibili sul server
|
359 |
- Il checkbox "Mostra log di debug" è utile per diagnosticare eventuali problemi
|
|
|
360 |
|
361 |
## 🔗 Crediti
|
362 |
|
@@ -370,6 +430,7 @@ with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as
|
|
370 |
fn=text_to_speech,
|
371 |
inputs=[text_input, language_input, speaker_input, speed_input, debug_input],
|
372 |
outputs=[audio_output, error_output],
|
|
|
373 |
)
|
374 |
|
375 |
# Precarica il modello all'avvio
|
@@ -380,4 +441,4 @@ except Exception as e:
|
|
380 |
print(f"Errore nell'inizializzazione: {e}")
|
381 |
|
382 |
# Avvia l'interfaccia
|
383 |
-
demo.launch()
|
|
|
20 |
MODEL_REPO = "Lorenzob/aurora-1.6b-complete" # Repository del modello
|
21 |
CACHE_DIR = "./model_cache" # Directory per la cache del modello
|
22 |
SAMPLE_RATE = 24000 # Frequenza di campionamento
|
23 |
+
AUDIO_DIR = "./audio_cache" # Directory per salvare gli audio generati
|
24 |
|
25 |
# Cache per componenti del modello
|
26 |
processor = None
|
27 |
model = None
|
28 |
speaker_embeddings_cache = {}
|
29 |
|
30 |
+
# Assicurati che le directory esistano
|
31 |
+
os.makedirs(CACHE_DIR, exist_ok=True)
|
32 |
+
os.makedirs(AUDIO_DIR, exist_ok=True)
|
33 |
+
|
34 |
def download_file(url, save_path):
|
35 |
"""Scarica un file da un URL"""
|
36 |
response = requests.get(url, stream=True)
|
|
|
80 |
config_url = f"https://huggingface.co/{MODEL_REPO}/resolve/main/config.json"
|
81 |
local_config_path = os.path.join(CACHE_DIR, "config.json")
|
82 |
|
|
|
|
|
|
|
83 |
try:
|
84 |
# Scarica il file di configurazione
|
85 |
print(f"Scaricamento della configurazione da {config_url}...")
|
|
|
189 |
|
190 |
return model, processor
|
191 |
|
192 |
+
def save_audio_to_file(audio_array, sample_rate):
|
193 |
+
"""Salva l'audio in un file e restituisce il percorso"""
|
194 |
+
try:
|
195 |
+
import soundfile as sf
|
196 |
+
import time
|
197 |
+
|
198 |
+
# Crea un nome univoco per il file
|
199 |
+
timestamp = int(time.time())
|
200 |
+
audio_path = os.path.join(AUDIO_DIR, f"audio_{timestamp}.wav")
|
201 |
+
|
202 |
+
# Salva l'audio come file WAV
|
203 |
+
sf.write(audio_path, audio_array, sample_rate)
|
204 |
+
|
205 |
+
return audio_path
|
206 |
+
except Exception as e:
|
207 |
+
print(f"Errore nel salvare l'audio: {e}")
|
208 |
+
return None
|
209 |
+
|
210 |
def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=True):
|
211 |
"""Converte testo in voce utilizzando Aurora-1.6b-complete"""
|
212 |
if not text.strip():
|
|
|
291 |
if show_log:
|
292 |
print(f"✅ Audio generato con successo! Lunghezza: {len(speech_array)} campioni")
|
293 |
|
294 |
+
# Salva l'audio in un file per evitare problemi di perdita
|
295 |
+
audio_path = save_audio_to_file(speech_array, sample_rate)
|
296 |
+
if audio_path and show_log:
|
297 |
+
print(f"Audio salvato in {audio_path}")
|
298 |
+
|
299 |
+
# Restituisci l'audio come tupla (sample_rate, speech_array)
|
300 |
return (sample_rate, speech_array), None
|
301 |
except Exception as e:
|
302 |
error_msg = f"Errore nella generazione dell'audio: {str(e)}"
|
|
|
305 |
print(f"❌ {detailed_error}")
|
306 |
return None, detailed_error
|
307 |
|
308 |
+
# Funzione di cleanup per rimuovere file vecchi
|
309 |
+
def cleanup_old_audio_files():
|
310 |
+
"""Rimuove i file audio vecchi per risparmiare spazio"""
|
311 |
+
try:
|
312 |
+
import time
|
313 |
+
import glob
|
314 |
+
|
315 |
+
# Trova tutti i file audio
|
316 |
+
audio_files = glob.glob(os.path.join(AUDIO_DIR, "*.wav"))
|
317 |
+
|
318 |
+
# Ottieni il tempo attuale
|
319 |
+
current_time = time.time()
|
320 |
+
|
321 |
+
# Rimuovi i file più vecchi di 1 ora
|
322 |
+
for file in audio_files:
|
323 |
+
file_time = os.path.getmtime(file)
|
324 |
+
if current_time - file_time > 3600: # 3600 secondi = 1 ora
|
325 |
+
os.remove(file)
|
326 |
+
print(f"Rimosso file audio vecchio: {file}")
|
327 |
+
except Exception as e:
|
328 |
+
print(f"Errore nel cleanup dei file audio: {e}")
|
329 |
+
|
330 |
+
# Esegui il cleanup all'avvio
|
331 |
+
cleanup_old_audio_files()
|
332 |
+
|
333 |
# Esempi predefiniti per l'interfaccia
|
334 |
examples = [
|
335 |
["Ciao, mi chiamo Aurora e sono un assistente vocale italiano.", "it", 0, 1.0, True],
|
|
|
342 |
|
343 |
# Definizione dell'interfaccia Gradio
|
344 |
with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as demo:
|
345 |
+
# Stato nascosto per memorizzare l'ultimo audio generato
|
346 |
+
audio_state = gr.State(value=None)
|
347 |
+
|
348 |
gr.Markdown("""
|
349 |
# 🎙️ Aurora-1.6b-complete Text-to-Speech Demo
|
350 |
|
|
|
391 |
submit_btn = gr.Button("Genera Audio", variant="primary")
|
392 |
|
393 |
with gr.Column(scale=1):
|
394 |
+
audio_output = gr.Audio(
|
395 |
+
label="Audio generato",
|
396 |
+
type="numpy", # Usa il tipo numpy per evitare problemi
|
397 |
+
show_share_button=True,
|
398 |
+
autoplay=True
|
399 |
+
)
|
400 |
error_output = gr.Textbox(label="Messaggi di errore", visible=True, lines=6)
|
401 |
|
402 |
# Esempi
|
|
|
416 |
- Puoi cambiare lo Speaker ID per ottenere voci con caratteristiche diverse
|
417 |
- La velocità di generazione dipende dalle risorse disponibili sul server
|
418 |
- Il checkbox "Mostra log di debug" è utile per diagnosticare eventuali problemi
|
419 |
+
- **Gli audio generati vengono salvati automaticamente sul server** per evitare di perderli
|
420 |
|
421 |
## 🔗 Crediti
|
422 |
|
|
|
430 |
fn=text_to_speech,
|
431 |
inputs=[text_input, language_input, speaker_input, speed_input, debug_input],
|
432 |
outputs=[audio_output, error_output],
|
433 |
+
api_name=None # Disabilita l'API endpoint per questa funzione
|
434 |
)
|
435 |
|
436 |
# Precarica il modello all'avvio
|
|
|
441 |
print(f"Errore nell'inizializzazione: {e}")
|
442 |
|
443 |
# Avvia l'interfaccia
|
444 |
+
demo.launch(share=False, show_error=True, prevent_thread_lock=True)
|