File size: 1,721 Bytes
79616b0
 
 
 
ee42cb0
f96ce38
ee42cb0
f96ce38
ee42cb0
e544543
9d49358
ee42cb0
 
 
79616b0
ee42cb0
 
e544543
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee42cb0
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from fastapi import FastAPI, File, UploadFile
import librosa
import numpy as np
import shutil
import uvicorn
import os
from funasr import AutoModel

# Khởi tạo FastAPI
app = FastAPI()

# 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"

# API nhận file âm thanh từ Flutter
@app.post("/detect-noise/")
async def detect_noise_api(file: UploadFile = 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}

# Chạy FastAPI trên Hugging Face Spaces
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=7860)