Update app.py
Browse files
app.py
CHANGED
|
@@ -55,28 +55,38 @@ def predict_voice_score(wav):
|
|
| 55 |
|
| 56 |
|
| 57 |
def detect_singing(audio_path):
|
| 58 |
-
"""检测唱歌片段"""
|
| 59 |
wav, _ = librosa.load(audio_path, sr=SAMPLE_RATE)
|
| 60 |
-
|
| 61 |
-
|
|
|
|
|
|
|
| 62 |
|
| 63 |
-
for
|
| 64 |
-
|
| 65 |
-
snippet = wav[
|
| 66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
music_score = predict_music_score(snippet)
|
| 68 |
voice_score = predict_voice_score(snippet)
|
| 69 |
|
|
|
|
|
|
|
|
|
|
| 70 |
if music_score > MUSIC_THRESHOLD and voice_score > VOICE_THRESHOLD:
|
| 71 |
-
|
| 72 |
|
| 73 |
-
#
|
| 74 |
merged = []
|
| 75 |
-
for seg in
|
| 76 |
if not merged or seg[0] > merged[-1][1]:
|
| 77 |
merged.append(list(seg))
|
| 78 |
else:
|
| 79 |
merged[-1][1] = seg[1]
|
|
|
|
| 80 |
merged = [(s, e) for s, e in merged if e - s >= MIN_SEG_DURATION]
|
| 81 |
return merged
|
| 82 |
|
|
|
|
| 55 |
|
| 56 |
|
| 57 |
def detect_singing(audio_path):
|
|
|
|
| 58 |
wav, _ = librosa.load(audio_path, sr=SAMPLE_RATE)
|
| 59 |
+
total_len = len(wav)
|
| 60 |
+
chunk_len = SAMPLE_RATE * CHUNK_SIZE
|
| 61 |
+
step_len = SAMPLE_RATE * STEP
|
| 62 |
+
results = []
|
| 63 |
|
| 64 |
+
for start_idx in range(0, max(1, total_len - chunk_len), step_len):
|
| 65 |
+
end_idx = start_idx + chunk_len
|
| 66 |
+
snippet = wav[start_idx:end_idx]
|
| 67 |
|
| 68 |
+
# --- 修正:强制长度一致 ---
|
| 69 |
+
if len(snippet) < chunk_len:
|
| 70 |
+
snippet = np.pad(snippet, (0, chunk_len - len(snippet)))
|
| 71 |
+
|
| 72 |
+
# --- 模型推理 ---
|
| 73 |
music_score = predict_music_score(snippet)
|
| 74 |
voice_score = predict_voice_score(snippet)
|
| 75 |
|
| 76 |
+
start_t = start_idx / SAMPLE_RATE
|
| 77 |
+
end_t = start_t + CHUNK_SIZE
|
| 78 |
+
|
| 79 |
if music_score > MUSIC_THRESHOLD and voice_score > VOICE_THRESHOLD:
|
| 80 |
+
results.append((float(start_t), float(end_t)))
|
| 81 |
|
| 82 |
+
# 合并相邻片段
|
| 83 |
merged = []
|
| 84 |
+
for seg in results:
|
| 85 |
if not merged or seg[0] > merged[-1][1]:
|
| 86 |
merged.append(list(seg))
|
| 87 |
else:
|
| 88 |
merged[-1][1] = seg[1]
|
| 89 |
+
|
| 90 |
merged = [(s, e) for s, e in merged if e - s >= MIN_SEG_DURATION]
|
| 91 |
return merged
|
| 92 |
|