Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -12,17 +12,23 @@ print("Chargement du modèle Wav2Vec2...")
|
|
12 |
stt_pipeline = pipeline("automatic-speech-recognition", model="boumehdi/wav2vec2-large-xlsr-moroccan-darija")
|
13 |
print("Modèle chargé avec succès !")
|
14 |
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
def find_optimal_clusters(mfccs_scaled):
|
16 |
-
"""Trouve le nombre optimal de locuteurs en utilisant
|
17 |
best_score = -1
|
18 |
-
best_n_clusters = 1 #
|
19 |
|
20 |
for n_clusters in range(1, 3): # On teste pour 1 ou 2 locuteurs
|
21 |
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
|
22 |
labels = kmeans.fit_predict(mfccs_scaled)
|
23 |
|
24 |
if n_clusters > 1:
|
25 |
-
score = silhouette_score(mfccs_scaled, labels) # Score
|
26 |
if score > best_score:
|
27 |
best_score = score
|
28 |
best_n_clusters = n_clusters
|
@@ -37,11 +43,16 @@ def process_audio(audio_path):
|
|
37 |
audio, sr = librosa.load(audio_path, sr=None, duration=30)
|
38 |
print(f"Audio chargé : {len(audio)} échantillons à {sr} Hz")
|
39 |
|
40 |
-
#
|
|
|
|
|
|
|
|
|
|
|
41 |
audio_denoised = nr.reduce_noise(y=audio, sr=sr)
|
42 |
print("Bruit réduit.")
|
43 |
|
44 |
-
# Extraction des MFCC
|
45 |
mfccs = librosa.feature.mfcc(y=audio_denoised, sr=sr, n_mfcc=13)
|
46 |
print(f"MFCC extrait, shape: {mfccs.shape}")
|
47 |
|
@@ -82,7 +93,7 @@ def process_audio(audio_path):
|
|
82 |
|
83 |
print(f"Transcription Speaker {speaker} terminée.")
|
84 |
|
85 |
-
return "\n".join(result)
|
86 |
|
87 |
except Exception as e:
|
88 |
print(f"Erreur : {e}")
|
|
|
12 |
stt_pipeline = pipeline("automatic-speech-recognition", model="boumehdi/wav2vec2-large-xlsr-moroccan-darija")
|
13 |
print("Modèle chargé avec succès !")
|
14 |
|
15 |
+
def is_silent(audio, threshold=0.005):
|
16 |
+
"""Vérifie si l'audio est principalement du silence ou du bruit de fond faible."""
|
17 |
+
energy = np.mean(np.abs(audio)) # Mesure de l'énergie du signal
|
18 |
+
print(f"Énergie du signal: {energy}")
|
19 |
+
return energy < threshold
|
20 |
+
|
21 |
def find_optimal_clusters(mfccs_scaled):
|
22 |
+
"""Trouve le nombre optimal de locuteurs en utilisant le score silhouette"""
|
23 |
best_score = -1
|
24 |
+
best_n_clusters = 1 # Par défaut, on suppose un seul locuteur
|
25 |
|
26 |
for n_clusters in range(1, 3): # On teste pour 1 ou 2 locuteurs
|
27 |
kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
|
28 |
labels = kmeans.fit_predict(mfccs_scaled)
|
29 |
|
30 |
if n_clusters > 1:
|
31 |
+
score = silhouette_score(mfccs_scaled, labels) # Score silhouette
|
32 |
if score > best_score:
|
33 |
best_score = score
|
34 |
best_n_clusters = n_clusters
|
|
|
43 |
audio, sr = librosa.load(audio_path, sr=None, duration=30)
|
44 |
print(f"Audio chargé : {len(audio)} échantillons à {sr} Hz")
|
45 |
|
46 |
+
# Vérifier si l'audio est vide (silence)
|
47 |
+
if is_silent(audio):
|
48 |
+
print("Aucun locuteur détecté (audio trop silencieux).")
|
49 |
+
return "Aucun locuteur détecté."
|
50 |
+
|
51 |
+
# Réduction du bruit (SNR)
|
52 |
audio_denoised = nr.reduce_noise(y=audio, sr=sr)
|
53 |
print("Bruit réduit.")
|
54 |
|
55 |
+
# Extraction des MFCC
|
56 |
mfccs = librosa.feature.mfcc(y=audio_denoised, sr=sr, n_mfcc=13)
|
57 |
print(f"MFCC extrait, shape: {mfccs.shape}")
|
58 |
|
|
|
93 |
|
94 |
print(f"Transcription Speaker {speaker} terminée.")
|
95 |
|
96 |
+
return "\n".join(result) if result else "Aucune voix détectée."
|
97 |
|
98 |
except Exception as e:
|
99 |
print(f"Erreur : {e}")
|