Spaces:
Running
Running
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" | |
def read_root(): | |
return {"message": "Hello, World!"} | |
print(app.routes) | |
# API nhận file âm thanh từ Flutter | |
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, UploadFile, File | |
# 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"} | |