Spaces:
Sleeping
Sleeping
Update app.py
Browse filesBetter management of audio formats
app.py
CHANGED
|
@@ -122,44 +122,59 @@ async def health_check():
|
|
| 122 |
async def detect_instrument(audio: UploadFile = File(...)):
|
| 123 |
"""
|
| 124 |
Detectar instrumentos musicales en archivo de audio
|
| 125 |
-
|
| 126 |
-
Args:
|
| 127 |
-
audio: Archivo de audio (WAV, MP3, etc.)
|
| 128 |
-
|
| 129 |
-
Returns:
|
| 130 |
-
JSON con resultados de detección
|
| 131 |
"""
|
| 132 |
try:
|
| 133 |
-
# Verificar si el modelo está cargado
|
| 134 |
if classifier is None:
|
| 135 |
raise HTTPException(
|
| 136 |
status_code=503,
|
| 137 |
detail="Modelo no disponible. Intenta más tarde."
|
| 138 |
)
|
| 139 |
|
| 140 |
-
# Verificar tipo de archivo
|
| 141 |
-
if not audio.content_type or not audio.content_type.startswith('audio/'):
|
| 142 |
-
raise HTTPException(
|
| 143 |
-
status_code=400,
|
| 144 |
-
detail=f"Tipo de archivo inválido: {audio.content_type}. Debe ser audio."
|
| 145 |
-
)
|
| 146 |
-
|
| 147 |
print(f"📁 Procesando: {audio.filename} ({audio.content_type})")
|
| 148 |
|
| 149 |
-
# Leer
|
| 150 |
content = await audio.read()
|
| 151 |
print(f"📏 Tamaño: {len(content)} bytes")
|
| 152 |
|
| 153 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 154 |
temp_file.write(content)
|
| 155 |
temp_path = temp_file.name
|
| 156 |
|
| 157 |
try:
|
| 158 |
-
# Procesar con el modelo
|
| 159 |
print("🤖 Ejecutando modelo...")
|
| 160 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
print(f"🎯 Resultados raw: {results}")
|
| 162 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 163 |
# Formatear resultados
|
| 164 |
formatted_results = []
|
| 165 |
for result in results:
|
|
@@ -168,7 +183,6 @@ async def detect_instrument(audio: UploadFile = File(...)):
|
|
| 168 |
"score": round(float(result["score"]), 4)
|
| 169 |
})
|
| 170 |
|
| 171 |
-
# Ordenar por score descendente
|
| 172 |
formatted_results.sort(key=lambda x: x["score"], reverse=True)
|
| 173 |
|
| 174 |
print(f"✅ Resultados formateados: {formatted_results}")
|
|
@@ -177,11 +191,16 @@ async def detect_instrument(audio: UploadFile = File(...)):
|
|
| 177 |
"success": True,
|
| 178 |
"results": formatted_results,
|
| 179 |
"filename": audio.filename,
|
| 180 |
-
"processed_size_bytes": len(content)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 181 |
}
|
| 182 |
|
| 183 |
finally:
|
| 184 |
-
# Limpiar archivo temporal
|
| 185 |
if os.path.exists(temp_path):
|
| 186 |
os.unlink(temp_path)
|
| 187 |
|
|
@@ -189,6 +208,8 @@ async def detect_instrument(audio: UploadFile = File(...)):
|
|
| 189 |
raise
|
| 190 |
except Exception as e:
|
| 191 |
print(f"❌ Error inesperado: {e}")
|
|
|
|
|
|
|
| 192 |
raise HTTPException(
|
| 193 |
status_code=500,
|
| 194 |
detail=f"Error procesando audio: {str(e)}"
|
|
|
|
| 122 |
async def detect_instrument(audio: UploadFile = File(...)):
|
| 123 |
"""
|
| 124 |
Detectar instrumentos musicales en archivo de audio
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
"""
|
| 126 |
try:
|
|
|
|
| 127 |
if classifier is None:
|
| 128 |
raise HTTPException(
|
| 129 |
status_code=503,
|
| 130 |
detail="Modelo no disponible. Intenta más tarde."
|
| 131 |
)
|
| 132 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
print(f"📁 Procesando: {audio.filename} ({audio.content_type})")
|
| 134 |
|
| 135 |
+
# Leer contenido
|
| 136 |
content = await audio.read()
|
| 137 |
print(f"📏 Tamaño: {len(content)} bytes")
|
| 138 |
|
| 139 |
+
# Determinar extensión basada en content_type o filename
|
| 140 |
+
if audio.filename and audio.filename.endswith('.3gp'):
|
| 141 |
+
file_extension = '.3gp'
|
| 142 |
+
elif audio.filename and audio.filename.endswith('.wav'):
|
| 143 |
+
file_extension = '.wav'
|
| 144 |
+
elif audio.content_type and 'wav' in audio.content_type:
|
| 145 |
+
file_extension = '.wav'
|
| 146 |
+
else:
|
| 147 |
+
file_extension = '.wav' # Por defecto
|
| 148 |
+
|
| 149 |
+
print(f"🎵 Usando extensión: {file_extension}")
|
| 150 |
+
|
| 151 |
+
with tempfile.NamedTemporaryFile(delete=False, suffix=file_extension) as temp_file:
|
| 152 |
temp_file.write(content)
|
| 153 |
temp_path = temp_file.name
|
| 154 |
|
| 155 |
try:
|
|
|
|
| 156 |
print("🤖 Ejecutando modelo...")
|
| 157 |
+
|
| 158 |
+
# Usar librosa para cargar el audio de manera más robusta
|
| 159 |
+
import librosa
|
| 160 |
+
|
| 161 |
+
# Cargar audio con librosa (maneja múltiples formatos)
|
| 162 |
+
audio_data, sample_rate = librosa.load(temp_path, sr=16000) # Forzar 16kHz
|
| 163 |
+
print(f"🔊 Audio cargado: {len(audio_data)} samples a {sample_rate}Hz")
|
| 164 |
+
|
| 165 |
+
# Guardar como WAV temporal para el modelo
|
| 166 |
+
temp_wav_path = temp_path.replace(file_extension, '.wav')
|
| 167 |
+
import soundfile as sf
|
| 168 |
+
sf.write(temp_wav_path, audio_data, sample_rate)
|
| 169 |
+
|
| 170 |
+
# Procesar con el modelo usando el archivo WAV
|
| 171 |
+
results = classifier(temp_wav_path)
|
| 172 |
print(f"🎯 Resultados raw: {results}")
|
| 173 |
|
| 174 |
+
# Limpiar archivos temporales
|
| 175 |
+
if os.path.exists(temp_wav_path):
|
| 176 |
+
os.unlink(temp_wav_path)
|
| 177 |
+
|
| 178 |
# Formatear resultados
|
| 179 |
formatted_results = []
|
| 180 |
for result in results:
|
|
|
|
| 183 |
"score": round(float(result["score"]), 4)
|
| 184 |
})
|
| 185 |
|
|
|
|
| 186 |
formatted_results.sort(key=lambda x: x["score"], reverse=True)
|
| 187 |
|
| 188 |
print(f"✅ Resultados formateados: {formatted_results}")
|
|
|
|
| 191 |
"success": True,
|
| 192 |
"results": formatted_results,
|
| 193 |
"filename": audio.filename,
|
| 194 |
+
"processed_size_bytes": len(content),
|
| 195 |
+
"audio_info": {
|
| 196 |
+
"samples": len(audio_data),
|
| 197 |
+
"sample_rate": sample_rate,
|
| 198 |
+
"duration_seconds": len(audio_data) / sample_rate
|
| 199 |
+
}
|
| 200 |
}
|
| 201 |
|
| 202 |
finally:
|
| 203 |
+
# Limpiar archivo temporal original
|
| 204 |
if os.path.exists(temp_path):
|
| 205 |
os.unlink(temp_path)
|
| 206 |
|
|
|
|
| 208 |
raise
|
| 209 |
except Exception as e:
|
| 210 |
print(f"❌ Error inesperado: {e}")
|
| 211 |
+
import traceback
|
| 212 |
+
traceback.print_exc()
|
| 213 |
raise HTTPException(
|
| 214 |
status_code=500,
|
| 215 |
detail=f"Error procesando audio: {str(e)}"
|