Spaces:
Runtime error
Runtime error
Soluzione specifica per Aurora-1.6b-complete con caricamento manuale
Browse files
app.py
CHANGED
@@ -20,17 +20,12 @@ 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 |
-
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,6 +75,9 @@ def fix_aurora_config():
|
|
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,24 +187,6 @@ def load_aurora_model_manually():
|
|
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,12 +271,6 @@ def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=True):
|
|
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,31 +279,6 @@ def text_to_speech(text, language="it", speaker_id=0, speed=1.0, show_log=True):
|
|
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,9 +291,6 @@ examples = [
|
|
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,12 +337,7 @@ with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as
|
|
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,7 +357,6 @@ with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as
|
|
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,7 +370,6 @@ with gr.Blocks(title="Aurora-1.6b-complete TTS Demo", theme=gr.themes.Soft()) as
|
|
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,4 +380,4 @@ except Exception as e:
|
|
441 |
print(f"Errore nell'inizializzazione: {e}")
|
442 |
|
443 |
# Avvia l'interfaccia
|
444 |
-
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 |
|
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 |
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 |
|
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 |
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 |
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 |
|
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 |
submit_btn = gr.Button("Genera Audio", variant="primary")
|
338 |
|
339 |
with gr.Column(scale=1):
|
340 |
+
audio_output = gr.Audio(label="Audio generato", show_share_button=True)
|
|
|
|
|
|
|
|
|
|
|
341 |
error_output = gr.Textbox(label="Messaggi di errore", visible=True, lines=6)
|
342 |
|
343 |
# Esempi
|
|
|
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 |
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 |
print(f"Errore nell'inizializzazione: {e}")
|
381 |
|
382 |
# Avvia l'interfaccia
|
383 |
+
demo.launch()
|