Ismail Ben Alla

Speech Emotion Recognition

8 classifieurs audio testés sur des locuteurs inconnus

Audio · oct. 2026 · Terminé

Détecter l’émotion dans une voix, et découvrir quelle façon de présenter l’audio à un modèle résiste à un locuteur qu’il n’a jamais entendu.

Construit avecPyTorchHugging Face Transformerslibrosascikit-learnNumPyMatplotlib

Speech Emotion Recognition — vue d’ensemble

Présentation

L’émotion dans la parole tient à la manière dont une phrase est dite, pas à ce qui est dit. RAVDESS le rend explicite : 24 acteurs prononcent la même phrase avec 8 émotions. Je voulais savoir quelle façon de présenter l’audio à un modèle fonctionne le mieux, j’ai donc entraîné un modèle par représentation sur les mêmes données et le même découpage : un CNN 1D sur la forme d’onde brute, un CNN 1D sur des séquences MFCC, un CNN 2D et un modèle CNN + BiGRU + attention sur des spectrogrammes log-mel, un MLP et un SVM sur 258 caractéristiques manuelles, un WavLM gelé avec une petite tête, et le réseau feed-forward du notebook Colab d’origine conservé comme baseline.

Le découpage se fait par acteur : 18 pour l’entraînement, 2 pour la validation, 4 pour le test, si bien qu’aucune voix de test n’est entendue pendant l’entraînement. C’est plus difficile que les découpages aléatoires derrière beaucoup de chiffres RAVDESS publiés. Chaque modèle est lancé avec 3 graines. Le WavLM gelé l’emporte largement avec 77.6 % de précision en test ; le CRNN atteint 65.4 %, les CNN sur spectrogramme et MFCC environ 58 %, le MLP 51.4 %, le SVM 49.2 %, le CNN sur forme d’onde brute 46.1 % et le pipeline du notebook 27.8 %.

La première version mesurait la précision d’entraînement sur des extraits augmentés, ce qui masquait l’ampleur de la mémorisation. Mesuré honnêtement, chaque modèle atteint 78 à 100 % sur son jeu d’entraînement et perd 22 à 47 points sur de nouveaux locuteurs. Le weight decay, le mixup, la perturbation de vitesse et la moyenne des poids ne réduisent cet écart que de quelques points. Ce qui fonctionne, c’est de standardiser chaque caractéristique par locuteur : cela fait gagner 17 points au MLP, 7 au CNN MFCC et 5 à WavLM, qui atteint 82.5 %. Le dépôt fournit aussi huit extraits de test, un par émotion, chacun rendu sous forme de courte vidéo avec le spectrogramme, une tête de lecture et les probabilités du modèle ; WavLM en reconnaît 6 sur 8, entendant neutre comme calme et joyeux comme surpris.

La question

Quelle représentation audio fonctionne le mieux pour la reconnaissance des émotions quand les locuteurs de test sont nouveaux, et pourquoi les modèles entraînés from scratch surapprennent-ils autant les voix qu’ils ont entendues ?

Fonctionnalités clés

Comment ça marche

  1. Charger et découper par acteur

    prepare_ravdess.py télécharge les 1,440 extraits de parole et place les acteurs 1-18 en entraînement, 19-20 en validation et 21-24 en test ; les labels et les identifiants de locuteur viennent des noms de fichiers.

  2. Transformer l’audio en chaque représentation

    Les extraits sont rééchantillonnés à 16 kHz, débarrassés des silences et fixés à 3 s, puis deviennent une forme d’onde de 48,000 échantillons, une séquence MFCC 40 × 151, un spectrogramme log-mel 64 × 151, 258 caractéristiques manuelles agrégées, ou les états cachés d’un WavLM gelé, mis en cache après le premier run.

  3. Entraîner un modèle par représentation

    Chaque modèle neuronal utilise AdamW avec un calendrier one-cycle, un label smoothing de 0.1 et des batchs de 32 ; ses propres augmentations et régularisations sont appliquées, et le checkpoint au meilleur macro-F1 de validation est conservé.

  4. Normaliser par locuteur

    Les variantes _spk standardisent chaque caractéristique avec la moyenne et la variance propres au locuteur plutôt qu’avec celles du jeu d’entraînement, ce qui supprime l’essentiel de ce qui distingue une voix d’une autre.

  5. Rapporter sur des acteurs inconnus

    Chaque run écrit un JSON avec son historique et ses métriques de test ; report.py agrège les graines dans le tableau de résultats, les matrices de confusion, le F1 par classe et la figure de l’écart entraînement-test.

Exemples

Précision et macro-F1 en test sur des acteurs inconnus pour les 14 lignes (moyenne sur 3 graines). Le WavLM gelé est en tête avec 77.6 %, 82.5 % avec normalisation par locuteur ; le pipeline du notebook d’origine plafonne à 27.8 %, le hasard étant à 12.5 %.
Précision et macro-F1 en test sur des acteurs inconnus pour les 14 lignes (moyenne sur 3 graines). Le WavLM gelé est en tête avec 77.6 %, 82.5 % avec normalisation par locuteur ; le pipeline du notebook d’origine plafonne à 27.8 %, le hasard étant à 12.5 %.
Écart entraînement-test (à gauche) et précision en test (à droite) pour cinq modèles sans régularisation, avec régularisation, et avec en plus la normalisation par locuteur. La régularisation seule fait à peine bouger le score de test ; la normalisation par locuteur réduit l’écart du CNN MFCC de 40 à 18 points et fait passer le MLP de 47.4 % à 64.7 %.
Écart entraînement-test (à gauche) et précision en test (à droite) pour cinq modèles sans régularisation, avec régularisation, et avec en plus la normalisation par locuteur. La régularisation seule fait à peine bouger le score de test ; la normalisation par locuteur réduit l’écart du CNN MFCC de 40 à 18 points et fait passer le MLP de 47.4 % à 64.7 %.
Matrices de confusion en test pour chaque modèle (les lignes sont l’émotion réelle, en pourcentage). Les deux mêmes confusions apparaissent partout : neutre est entendu comme calme, et joyeux comme surpris.
Matrices de confusion en test pour chaque modèle (les lignes sont l’émotion réelle, en pourcentage). Les deux mêmes confusions apparaissent partout : neutre est entendu comme calme, et joyeux comme surpris.
F1 en test par émotion, modèles triés du meilleur au moins bon. Colère, surprise et dégoût sont les classes les plus faciles ; neutre, joyeux et triste les plus difficiles, et la baseline du notebook ne prédit jamais neutre.
F1 en test par émotion, modèles triés du meilleur au moins bon. Colère, surprise et dégoût sont les classes les plus faciles ; neutre, joyeux et triste les plus difficiles, et la baseline du notebook ne prédit jamais neutre.

Entrée

python predict.py samples/05_angry_actor21.wav --model wavlm

Sortie

angry 76% (true: angry)

Classification de l’un des huit extraits d’exemple d’un acteur de test. Sur les huit extraits, WavLM en reconnaît 6 ; les deux erreurs sont neutre entendu comme calme (55 %) et joyeux entendu comme surpris (54 %).

Stack technique

Ce que j’ai appris

Limites

Mots-clés

reconnaissance des émotions dans la parole · classification audio · RAVDESS · WavLM · wav2vec2 · parole auto-supervisée · spectrogramme mel · MFCC · CRNN · CNN sur forme d’onde brute · SVM · normalisation par locuteur · évaluation indépendante du locuteur · surapprentissage · PyTorch