Hola, soy nuevo en FastAPI. Tengo que compilar una API para mi modelo de clasificación de audio de aprendizaje profundo.
He intentado hacer esto:
@app.post("/uploadfile/") async def create_upload_file(file: UploadFile = File(...)): y, sr = librosa.load(file.filename) print(file.filename) S = librosa.feature.melspectrogram( y, sr=sr, n_fft=2048, hop_length=512, n_mels=128) mfccs = librosa.feature.mfcc(S=librosa.power_to_db(S), n_mfcc=40) # mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40) return mfccs #return {"filename": file.filename} if __name__ == "__main__": # load model model = load_model("trained_heartbeat_classifier.h5") classify_file = sys.argv[1] x_test = [] x_test.append(create_upload_file(classify_file, 0.5)) x_test = np.asarray(x_test) x_test = x_test.reshape(x_test.shape[0], x_test.shape[1], x_test.shape[2], 1) pred = model.predict(x_test, verbose=1) # print(pred) pred_class = model.predict_classes(x_test) if pred_class[0]: print("\nNormal heartbeat") print("confidence:", pred[0][1]) else: print("\nAbnormal heartbeat") print("confidence:", pred[0][0])pero me sale el error cuando subo un archivo de audio: Error interno del servidor
y en la terminal, muestra el archivo no encontrado.
Entonces, ¿tenemos que guardar un archivo de audio en alguna carpeta temporal?
UploadFile tiene los siguientes atributos:
filename: Una cadena con el nombre del archivo original que se cargó
archivo: un SpooledTemporaryFile (un objeto similar a un archivo). Este es el archivo Python real que puede pasar directamente a otras funciones o bibliotecas que esperan un objeto "similar a un archivo".
Entonces, si llama a file.file, obtendrá el contenido del archivo. Realice sus actividades de predicción y preprocesamiento dentro de la función del enrutador porque la función del enrutador no se puede llamar funciones tradicionales. La función se instancia en el decorador del enrutador (consulte el código fuente).
NB: Puede usar la tarea en segundo plano o la cola de trabajo si no desea esperar hasta que llegue la predicción, el reconocimiento de la cola de trabajo (Usar apio con redis/rabbitmq) le notificará sobre la finalización de la tarea. La cola de trabajo también empareja la tarea si puede usar varios trabajadores.
Puede ser que este enfoque no funcione para cada formato (dicen que no funciona con mp3, aunque no lo he comprobado) , pero para mi tarea con .wav se me ocurrió esta solución, envolviendo el archivo en BytesIO y trabajó:
def deal_with_sound_file(sound: bytes = File(...)): ... = librosa.load(io.BytesIO(sound)) ...