# from fastapi import FastAPI, File, UploadFile # import librosa # import numpy as np # import shutil # import uvicorn # import os # from funasr import AutoModel # from starlette.middleware import Middleware # from starlette.middleware.cors import CORSMiddleware # import logging # logging.basicConfig(level=logging.INFO) # logger = logging.getLogger(__name__) # app = FastAPI( # middleware=[ # Middleware( # CORSMiddleware, # allow_origins=["*"], # Cho phép tất cả các origin # allow_credentials=True, # allow_methods=["*"], # Cho phép tất cả các phương thức # allow_headers=["*"], # Cho phép tất cả các header # ) # ] # ) # # Tạo thư mục temp nếu chưa có # if not os.path.exists("temp"): # os.makedirs("temp") # # Load mô hình SenseVoiceSmall từ Hugging Face # model_dir = "FunAudioLLM/SenseVoiceSmall" # model = AutoModel( # model=model_dir, # vad_model="fsmn-vad", # vad_kwargs={"max_single_segment_time": 30000}, # device="cuda:0", # hub="hf", # ) # # Hàm tính RMS energy # def calculate_rms_energy(audio_path): # y, sr = librosa.load(audio_path) # rms = librosa.feature.rms(y=y)[0] # return np.mean(rms) # # Hàm phát hiện tiếng ồn # def detect_noise(audio_path): # rms_energy = calculate_rms_energy(audio_path) # res = model.generate(input=audio_path, language="auto", audio_event_detection=True) # audio_events = res[0].get("audio_event_detection", {}) # if rms_energy > 0.02: # return "ồn ào" # elif rms_energy > 0.01: # for event_label, event_score in audio_events.items(): # if event_score > 0.7 and event_label in ["laughter", "applause", "crying", "coughing"]: # return f"ồn ào ({event_label})" # return "yên tĩnh" # @app.get("/") # def read_root(): # return {"message": "Hello, World!"} # print(app.routes) # # API nhận file âm thanh từ Flutter # @app.post("/detect-noise/") # async def detect_noise_api(file: UploadFile = File(...)): # try: # logger.info("Tên file: %s", file.filename) # logger.info("Loại file: %s", file.content_type) # file_size = len(await file.read()) # logger.info("Kích thước file: %s bytes", file_size) # await file.seek(0) # Reset lại vị trí đọc file # file_path = f"temp/{file.filename}" # with open(file_path, "wb") as buffer: # shutil.copyfileobj(file.file, buffer) # result = detect_noise(file_path) # return {"noise_level": result} # except Exception as e: # logger.exception("Lỗi trong API: %s", e) # return {"error": str(e)} # # Chạy FastAPI trên Hugging Face Spaces # if __name__ == "__main__": # uvicorn.run(app, host="0.0.0.0", port=7860) from fastapi import FastAPI from fastapi import File, UploadFile from starlette.middleware import Middleware from starlette.middleware.cors import CORSMiddleware import logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = FastAPI( middleware=[ Middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) ] ) @app.post("/detect-noise/") async def detect_noise_api(file: UploadFile = File(...)): logger.info("Đã nhận được yêu cầu!") return {"message": "OK"}