Update app.py
Browse files
app.py
CHANGED
|
@@ -608,4 +608,193 @@ def setup_models():
|
|
| 608 |
# Crear data.json con configuraciones
|
| 609 |
create_data_json()
|
| 610 |
|
| 611 |
-
logger.info("✅
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 608 |
# Crear data.json con configuraciones
|
| 609 |
create_data_json()
|
| 610 |
|
| 611 |
+
logger.info("✅ Modelos configurados")
|
| 612 |
+
return True
|
| 613 |
+
|
| 614 |
+
except Exception as e:
|
| 615 |
+
logger.error(f"❌ Error configurando modelos: {e}")
|
| 616 |
+
return False
|
| 617 |
+
|
| 618 |
+
def process_audio(audio_file, separation_mode, progress=gr.Progress()):
|
| 619 |
+
"""Procesar audio con IA como r3gm"""
|
| 620 |
+
if audio_file is None:
|
| 621 |
+
return [], "⚠️ Sube un archivo de audio"
|
| 622 |
+
|
| 623 |
+
try:
|
| 624 |
+
# Verificar tamaño
|
| 625 |
+
file_size = os.path.getsize(audio_file) / (1024 * 1024)
|
| 626 |
+
if file_size > 100:
|
| 627 |
+
return [], f"❌ Archivo muy grande: {file_size:.1f}MB (máx 100MB)"
|
| 628 |
+
|
| 629 |
+
progress(0.1, desc="Configurando modelos de IA...")
|
| 630 |
+
|
| 631 |
+
# Crear directorios y configurar modelos
|
| 632 |
+
create_directories()
|
| 633 |
+
if not setup_models():
|
| 634 |
+
return [], "❌ Error configurando modelos"
|
| 635 |
+
|
| 636 |
+
progress(0.3, desc="Procesando con IA...")
|
| 637 |
+
|
| 638 |
+
# Seleccionar modelos según modo
|
| 639 |
+
if separation_mode == "vocals_ultra":
|
| 640 |
+
models = ["UVR-MDX-NET-Voc_FT.onnx"]
|
| 641 |
+
elif separation_mode == "complete_4stems":
|
| 642 |
+
models = ["UVR-MDX-NET-Voc_FT.onnx", "UVR-MDX-NET-Kag_2.onnx", "Kim_Bass_1.onnx", "UVR-MDX-NET-Inst_HQ_4.onnx"]
|
| 643 |
+
elif separation_mode == "piano_only":
|
| 644 |
+
models = ["Kim_Piano_1.onnx"]
|
| 645 |
+
elif separation_mode == "drums_only":
|
| 646 |
+
models = ["UVR-MDX-NET-Kag_2.onnx"]
|
| 647 |
+
elif separation_mode == "bass_only":
|
| 648 |
+
models = ["Kim_Bass_1.onnx"]
|
| 649 |
+
elif separation_mode == "guitar_only":
|
| 650 |
+
models = ["UVR-MDX-NET-Kag_3.onnx"]
|
| 651 |
+
elif separation_mode == "karaoke":
|
| 652 |
+
models = ["UVR_MDXNET_KARA_2.onnx"]
|
| 653 |
+
elif separation_mode == "dereverb":
|
| 654 |
+
models = ["Reverb_HQ_By_FoxJoy.onnx"]
|
| 655 |
+
elif separation_mode == "professional":
|
| 656 |
+
models = ["UVR-MDX-NET-Voc_FT.onnx", "UVR_MDXNET_KARA_2.onnx", "Reverb_HQ_By_FoxJoy.onnx"]
|
| 657 |
+
else:
|
| 658 |
+
models = ["UVR-MDX-NET-Voc_FT.onnx"] # Default
|
| 659 |
+
|
| 660 |
+
progress(0.5, desc=f"Separando con {len(models)} modelo(s) de IA...")
|
| 661 |
+
|
| 662 |
+
# Procesar con modelos seleccionados
|
| 663 |
+
result_files = separate_multi_instrument(audio_file, models)
|
| 664 |
+
|
| 665 |
+
progress(1.0, desc="¡Completado!")
|
| 666 |
+
|
| 667 |
+
if result_files:
|
| 668 |
+
success_msg = f"✅ Separación con IA completada: {len(result_files)} archivo(s)"
|
| 669 |
+
return result_files, success_msg
|
| 670 |
+
else:
|
| 671 |
+
return [], "❌ No se generaron archivos"
|
| 672 |
+
|
| 673 |
+
except Exception as e:
|
| 674 |
+
error_msg = f"❌ Error: {str(e)}"
|
| 675 |
+
logger.error(error_msg)
|
| 676 |
+
return [], error_msg
|
| 677 |
+
|
| 678 |
+
def create_interface():
|
| 679 |
+
"""Crear interfaz - Estilo r3gm mejorado"""
|
| 680 |
+
with gr.Blocks(title="🎵 Multi-Instrument AI Separator", theme=gr.themes.Soft()) as app:
|
| 681 |
+
|
| 682 |
+
gr.Markdown(title)
|
| 683 |
+
gr.Markdown(description)
|
| 684 |
+
|
| 685 |
+
with gr.Row():
|
| 686 |
+
with gr.Column():
|
| 687 |
+
audio_input = gr.Audio(
|
| 688 |
+
label="🎵 Subir archivo de audio (máx 100MB)",
|
| 689 |
+
type="filepath"
|
| 690 |
+
)
|
| 691 |
+
|
| 692 |
+
separation_mode = gr.Radio(
|
| 693 |
+
choices=[
|
| 694 |
+
("🎤 Voces Ultra HD (MDX-Net)", "vocals_ultra"),
|
| 695 |
+
("🎯 Completo 4-Stems (Multi-IA)", "complete_4stems"),
|
| 696 |
+
("🎹 Solo Piano (Kim Model)", "piano_only"),
|
| 697 |
+
("🥁 Solo Batería (Kag Model)", "drums_only"),
|
| 698 |
+
("🎸 Solo Bajo (Kim Model)", "bass_only"),
|
| 699 |
+
("🎸 Solo Guitarra (Kag Model)", "guitar_only"),
|
| 700 |
+
("🎤 Karaoke (KARA Model)", "karaoke"),
|
| 701 |
+
("🔄 Eliminar Reverb", "dereverb"),
|
| 702 |
+
("👑 Profesional (Multi-modelo)", "professional")
|
| 703 |
+
],
|
| 704 |
+
value="complete_4stems",
|
| 705 |
+
label="🤖 Modelos de IA",
|
| 706 |
+
info="Cada opción usa redes neuronales especializadas"
|
| 707 |
+
)
|
| 708 |
+
|
| 709 |
+
process_btn = gr.Button(
|
| 710 |
+
"🚀 Separar con IA",
|
| 711 |
+
variant="primary",
|
| 712 |
+
size="lg"
|
| 713 |
+
)
|
| 714 |
+
|
| 715 |
+
with gr.Column():
|
| 716 |
+
status_output = gr.Textbox(
|
| 717 |
+
label="🤖 Estado de la IA",
|
| 718 |
+
lines=8,
|
| 719 |
+
interactive=False
|
| 720 |
+
)
|
| 721 |
+
|
| 722 |
+
output_files = gr.File(
|
| 723 |
+
label="📥 Archivos separados por IA",
|
| 724 |
+
file_count="multiple",
|
| 725 |
+
interactive=False
|
| 726 |
+
)
|
| 727 |
+
|
| 728 |
+
process_btn.click(
|
| 729 |
+
fn=process_audio,
|
| 730 |
+
inputs=[audio_input, separation_mode],
|
| 731 |
+
outputs=[output_files, status_output],
|
| 732 |
+
show_progress=True
|
| 733 |
+
)
|
| 734 |
+
|
| 735 |
+
gr.Markdown("""
|
| 736 |
+
### 🤖 Tecnología de IA utilizada:
|
| 737 |
+
|
| 738 |
+
| **Modelo** | **Tecnología** | **Especialización** | **Calidad** |
|
| 739 |
+
|------------|----------------|---------------------|-------------|
|
| 740 |
+
| 🎤 **UVR-MDX-NET-Voc_FT** | MDX-Net híbrida | Voces de máxima calidad | ⭐⭐⭐⭐⭐ |
|
| 741 |
+
| 🥁 **UVR-MDX-NET-Kag_2** | MDX-Net percusiva | Batería y elementos rítmicos | ⭐⭐⭐⭐ |
|
| 742 |
+
| 🎸 **Kim_Bass_1** | Red especializada | Frecuencias graves y bajo | ⭐⭐⭐⭐ |
|
| 743 |
+
| 🎹 **Kim_Piano_1** | IA para teclas | Piano y elementos percusivos-melódicos | ⭐⭐⭐⭐ |
|
| 744 |
+
| 🎸 **UVR-MDX-NET-Kag_3** | MDX-Net armónica | Guitarra y componentes melódicos | ⭐⭐⭐⭐ |
|
| 745 |
+
| 🎤 **UVR_MDXNET_KARA_2** | Red KARA | Voces principales vs coros | ⭐⭐⭐⭐ |
|
| 746 |
+
| 🔄 **Reverb_HQ_By_FoxJoy** | Anti-reverb | Eliminar reverberación | ⭐⭐⭐⭐ |
|
| 747 |
+
| 🎛️ **UVR-MDX-NET-Inst_HQ_4** | MDX-Net instrumental | Elementos no vocales | ⭐⭐⭐⭐ |
|
| 748 |
+
|
| 749 |
+
### ⚡ Arquitecturas de IA:
|
| 750 |
+
- **MDX-Net**: Red neuronal híbrida tiempo-frecuencia para separación de alta fidelidad
|
| 751 |
+
- **Kim Models**: Modelos especializados entrenados en instrumentos específicos
|
| 752 |
+
- **UVR Models**: Modelos de Ultimate Vocal Remover optimizados profesionalmente
|
| 753 |
+
- **KARA**: Arquitectura especializada en separación vocal avanzada
|
| 754 |
+
|
| 755 |
+
### 🔧 Características técnicas:
|
| 756 |
+
- ✅ **Misma tecnología que r3gm** - Código base probado y funcional
|
| 757 |
+
- ✅ **ONNX Runtime optimizado** - Inferencia de IA de alta velocidad
|
| 758 |
+
- ✅ **Descarga automática** - Modelos se descargan según necesidad
|
| 759 |
+
- ✅ **Configuración por hash** - Sistema de configuración preciso como UVR
|
| 760 |
+
- ✅ **Multiples arquitecturas** - 8+ modelos especializados disponibles
|
| 761 |
+
- ✅ **Processing threads** - Optimizado para GPU y CPU
|
| 762 |
+
|
| 763 |
+
### 📝 Instrucciones:
|
| 764 |
+
1. **Sube archivo de audio** (MP3, WAV, FLAC, M4A - máx 100MB)
|
| 765 |
+
2. **Selecciona modo de IA** según instrumentos que quieras separar
|
| 766 |
+
3. **Haz clic en "Separar con IA"** - Los modelos se descargan automáticamente
|
| 767 |
+
4. **Descarga los resultados** - Archivos separados por redes neuronales
|
| 768 |
+
|
| 769 |
+
> **Nota**: La primera vez que uses cada modelo, se descargará automáticamente (puede tomar unos minutos según tu conexión). Las siguientes veces será mucho más rápido.
|
| 770 |
+
""")
|
| 771 |
+
|
| 772 |
+
return app
|
| 773 |
+
|
| 774 |
+
def main():
|
| 775 |
+
"""Función principal - Exacta como r3gm"""
|
| 776 |
+
try:
|
| 777 |
+
logger.info("🤖 Iniciando Multi-Instrument AI Separator")
|
| 778 |
+
logger.info("🔧 Tecnología exacta de r3gm con múltiples instrumentos")
|
| 779 |
+
logger.info(f"🔧 PyTorch: {torch.__version__}")
|
| 780 |
+
logger.info(f"🔧 CUDA: {torch.cuda.is_available()}")
|
| 781 |
+
|
| 782 |
+
# Crear directorios base
|
| 783 |
+
create_directories()
|
| 784 |
+
|
| 785 |
+
# Crear y lanzar interfaz
|
| 786 |
+
app = create_interface()
|
| 787 |
+
app.queue(default_concurrency_limit=3)
|
| 788 |
+
app.launch(
|
| 789 |
+
server_name="0.0.0.0",
|
| 790 |
+
server_port=7860,
|
| 791 |
+
share=False,
|
| 792 |
+
show_error=True
|
| 793 |
+
)
|
| 794 |
+
|
| 795 |
+
except Exception as e:
|
| 796 |
+
logger.error(f"❌ Error: {e}")
|
| 797 |
+
traceback.print_exc()
|
| 798 |
+
|
| 799 |
+
if __name__ == "__main__":
|
| 800 |
+
main()
|