L'évaluation des modèles de synthèse audio basés sur les réseaux antagonistes génératifs (GAN), tels que WaveGAN, nécessite des métriques quantitatives robustes. L'Inception Score (IS) s'est imposé comme un indicateur de référence pour mesurer à la fois la qualité et la diversité des échantillons produits. Cet article explore les mécanismes de calcul de l'IS dans le contexte de WaveGAN et son rôle dans l'optimisation des architectures audio.
Comprendre l'Inception Score (IS)
L'Inception Score évalue deux aspects fondamentaux de la sortie d'un modèle génératif :
- La clarté (Sharpness) : Est-ce que l'échantillon généré ressemble clairement à une catégorie spécifique (par exemple, un son de piano distinct plutôt qu'un bruit blanc) ?
- La diversité : Le modèle est-il capable de produire une grande variété de sons couvrant toutes les classes apprises, ou souffre-t-il d'un effondrement de mode (mode collapse) ?
Dans WaveGAN, cet indicateur est calculé en utilisant un classifieur pré-entraîné qui analyse la distribution de probabilité des échantillons audio synthétisés.
Algorithme de calcul dans WaveGAN
Le processus de calcul, généralement implémenté dans les scripts d'évaluation du projet, suit une logique structurée en plusieurs phases.
1. Préparation des signaux audio
Pour garantir la cohérence de l'évaluation, les fichiers audio doivent être normalisés. WaveGAN utilise souvent une fréquence d'échantillonnage de 16 kHz et une fenêtre de 16 384 points. Voici comment la longueur des séquences est uniformisée :
def ajuster_longueur_audio(signal, taille_cible=16384):
"""Ajuste le signal audio par troncature ou padding."""
longueur_actuelle = signal.shape[0]
if longueur_actuelle > taille_cible:
return signal[:taille_cible]
else:
padding = taille_cible - longueur_actuelle
return np.pad(signal, (0, padding), mode='constant')
2. Inférence via le classifieur
Le modèle utilise un réseau de classification (souvent une version adaptée d'Inception pour l'audio) pour obtenir des vecteurs de probabilité. Le code suivant illustre l'extraction des scores à partir d'un graphe TensorFlow :
# Récupération des tenseurs d'entrée et de sortie
input_x = session.graph.get_tensor_by_name('x:0')
output_probs = session.graph.get_tensor_by_name('scores:0')
# Exécution de l'inférence sur un lot de données
scores_bruts = session.run(output_probs, feed_dict={input_x: batch_audio})
liste_predictions.append(scores_bruts)
3. Calcul de la divergence KL
Le cœur de l'Inception Score repose sur la divergence de Kullback-Leibler (KL) entre la distribution conditionnelle (le score d'un échantillon) et la distribution marginale (la moyenne de tous les scores). Une divergence élevée indique une meilleure performance.
def calculer_is(probabilites, nb_groupes=10):
scores_is = []
taille_split = probabilites.shape[0] // nb_groupes
for i in range(nb_groupes):
partie = probabilites[i * taille_split : (i + 1) * taille_split, :]
# Calcul de la distribution marginale
p_y = np.expand_dims(np.mean(partie, axis=0), 0)
# Calcul de la divergence KL
kl_div = partie * (np.log(partie) - np.log(p_y))
kl_moyenne = np.mean(np.sum(kl_div, axis=1))
scores_is.append(np.exp(kl_moyenne))
return np.mean(scores_is), np.std(scores_is)
Exécution de l'évaluation
Pour lancer l'analyse sur un ensemble d'audios générés, la commande type utilise des paramètres définissant le répertoire source et la taille de l'échantillonnage :
python eval/inception/score.py --audio_dir ./output_samples --n 50000 --k 10
Analyse visuelle et Spectrogrammes
Bien que l'Inception Score fournisse une valeur numérique, l'analyse visuelle via les spectrogrammes reste indispensable. En comparant les spectrogrammes de l'audio réel et de l'audio WaveGAN, on peut observer la fidélité des harmoniques et la structure temporelle. Pour des catégories comme la parole humaine ou les percussions, une forte corrélation entre un IS élevé et la netteté visuelle des spectrogrammes est généralement observée.
Stratégies pour améliorer l'Inception Score
Si les scores obtenus sont faibles, plusieurs pistes d'optimisation peuvent être explorées :
- Augmentation de données : Améliorer la diversité du jeu de données d'entraînement pour éviter que le générateur ne se limite à quelques motifs.
- Régularisation : Utiliser la pénalité de gradinet (Gradient Penalty) pour stabiliser l'apprentissage du discriminateur.
- Architecture : Ajuster la profondeur des couches de convolution pour capturer des dépendences temporelles plus longues dans le signal brut.
- Feature Matching : Introduire une perte basée sur la correspondance des caractéristiques enternes du discriminateur pour guider le générateur vers des représentations plus réalistes.