Janiopi commited on
Commit
6ff3237
·
verified ·
1 Parent(s): f3f11ba

Update app.py

Browse files

Better management of audio formats

Files changed (1) hide show
  1. app.py +42 -21
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 y guardar archivo temporalmente
150
  content = await audio.read()
151
  print(f"📏 Tamaño: {len(content)} bytes")
152
 
153
- with tempfile.NamedTemporaryFile(delete=False, suffix='.wav') as temp_file:
 
 
 
 
 
 
 
 
 
 
 
 
154
  temp_file.write(content)
155
  temp_path = temp_file.name
156
 
157
  try:
158
- # Procesar con el modelo
159
  print("🤖 Ejecutando modelo...")
160
- results = classifier(temp_path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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)}"