Le Défi du Speech Emotion Recognition : Modèles et Données (part 1)
Published: 2024-05-02 11:07:00

Ça fait longtemps, mais ce blog post a une première partie que je vous invite à lire pour pleinement apprécier celui-ci.

[- Can you hear me? ](https://dev.to/pykpyky/can-you-hear-me-51p6)
[- Transcription Vocale 2.0 : Les Smiley, Nouveau Langage de l'Émotion !](https://dev.to/pykpyky/transcription-vocale-20-les-smiley-nouveau-langage-de-lemotion--225c) 

---

La dernière fois, nous avons parlé de comment fonctionne le STT et nous nous sommes demandé si une technique similaire pouvait fonctionner pour le Speech Emotion Recognition (SER), afin de détecter cette fois-ci les émotions via la voix.

Eh bien, la bonne nouvelle, c’est que oui ! Et nous allons en profiter car ça sera la seule bonne nouvelle de ce blog post, je vous préviens !

Donc, oui, pour faire du STT, la forme d’onde de notre mot ou phrase permet de transcrire de l’audio en écrit, et voici des exemples de forme d’onde d’une même phrase mais avec plusieurs intonations :

---

## Kid are talking by the door
La phrase prononcée est la suivante : « Kid are talking by the door. »

Et voici la forme d’onde avec un ton neutre :

![Forme d'onde neutre](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5k4cxtrbgmij4wjx7g1d.png)

Il faut un peu zoomer pour voir quelque chose, mais globalement, on se rend compte que c’est assez plat, et c’est plutôt normal pour une émotion neutre, ou devrais-je dire, une absence d’émotion !

Voici pour une émotion triste :

![Forme d'onde triste](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q7ff5b7s8o00z2ertpfj.png)

Puis une émotion en colère :

![Forme d'onde colere](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bv5izwt45eii8zfviufy.png)

On perçoit donc bien une différence, que nous allons donc sans doute pouvoir exploiter, on peut même aller plus loin en regardant d’autres façons de représenter du son, avec par exemple un spectrogramme et voici ce que ça donne.

Neutre :

![Spectogramme neutre](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n67db61dpz8veotbw0w4.png)

Triste:

![Spectogramme triste](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l62um3ki5xovqwn5nygd.png)

  
Colere:  
 
![Spectogramme colere](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5rpt7rgwmpvy0lbdabhq.png)

Bien sûr, les modèles de Machine Learning qui fonctionnent pour le STT, ne fonctionnent pas tel quel sur les émotions. Nous verrons ça plus en détail dans le prochain blog post, mais c’est la première mauvaise nouvelle, il faut chercher et appliquer d'autres modèles.

---

## Le problème de taille
La deuxième vraie mauvaise nouvelle, c’est le jeu de données (ou le dataset) pour entraîner le modèle. Pour le STT, nous en avons plein. Beaucoup même. Des gigas et des gigas très facilement accessibles, dans toutes les langues. Nous n'avons donc aucun problème à avoir assez de données pour entraîner un modèle qui pourra donner des résultats satisfaisants en production.

Pour le SER en revanche… C’est une autre histoire. Nous disposons de jeux de données, mais qui sont assez petits et destinés principalement à la recherche, et à être utilisés pour comparer des modèles de Machine Learning de SER et ainsi déterminer lequel est le meilleur.

Pour vous expliquer la différence, voici un jeu de données pour le modèle STT pour l’ukrainien :  [Ukrainian Speech, Speech To Text (STT/ASR)](https://www.kaggle.com/datasets/igor185/ukrainian-speech). Il fait 7 Go et on a environ 7 heures d’audio. C’est très petit pour du STT, on peut trouver pour d’autres jeux de données des térabytes de données et plus de 20 000 heures d’audio dans 1 seul jeu de données. 

Voici un jeu de données pour le modèle SER en anglais : [(Speech Emotion Recognition (en))](https://www.kaggle.com/datasets/dmitrybabko/speech-emotion-recognition-en?resource=download-directory&select=Crema) il fait… 1.64… Go, et c’est en réalité déjà plusieurs jeux de données différents mis ensemble.


En plus de cette différence de taille, il ne faut pas oublier qu'un échantillon de donnée pour le STT c’est un fichier audio, pour du SER, c’est un fichier audio par émotion, donc pour avoir la même quantité de données entre un jeu de données pour STT et un pour SER composé de 4 émotions, il faudrait un volume 4 fois supérieur ! (Et généralement, les jeux de données pour le SER ont plus de 4 émotions ce qui réduit encore plus le nombre de fichiers audio par émotion).

Bref, les modèles et les jeux de données sont les deux problématiques qu’il faut résoudre avant d’aller plus loin.

Commençons peut-être par le plus simple à aborder, les jeux de données.

Comment obtenir plus de données ?

---

## Data augmentation
La vraie solution est bien sûr d’en récolter plus, ce qui est plus facile à dire qu’à faire, notamment car la voix étant une donnée biométrique, on ne la récolte pas si facilement. Vous pouvez toujours ajouter votre propre voix ou celle de vos amis/famille au jeu de données existant, mais même avec une grande famille, ce n’est pas cela qui va vraiment l’améliorer.

Au mieux, avoir votre propre voix dans les données d’entraînement de votre modèle permet de le rendre de facto plus efficace sur votre propre voix, et donc vous permet de tester vos cas d’usage de façon plus efficace. Mais ce sentiment de succès s’estompera bien vite quand votre modèle sera confronté à des données réelles non présentes dans celles d’entraînement.

C’est donc une bonne solution pour une démo, mais ça ne rendra pas votre modèle prêt à être utilisé en production.


Il existe cependant des techniques pour facilement gonfler votre jeu de données, on appelle ça de la data augmentation.
D’abord, vous pouvez ajouter du bruit. Cette technique consiste à copier tous vos fichiers audio et ajouter à chacun un bruit dessus (bruit blanc, bruit d’ambiance, télé…). Cela permet facilement de doubler votre jeu de données pour votre modèle. L’ajout du bruit permet aussi de rendre votre modèle plus performant dans les cas réels où il y a souvent un bruit ambiant quand on parle.

Voici par exemple un fichier audio propre :
 
![Forme d'onde sans bruit](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/px0in7zuyeb2tnmx1fgx.png)


Puis le même avec du bruit ajouté :
 
![Forme d'onde avec bruit](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vtira7oz8wuh2q21vptt.png)



Ensuite, vous pouvez changer la vitesse des fichiers, comme pour la première technique, il faut copier vos fichiers originaux, puis accélérer ou ralentir légèrement le fichier audio. Encore une fois, votre jeu de données va être doublé voire tripler, mais cela va aussi permettre à votre modèle de s’entraîner sur des durées de fichier audio différentes.

Finalement, et c’est déjà la technique utilisée par le jeu de données proposé plus haut. Il s’agit de mixer plusieurs jeux de données entre eux.

C’est une technique valide bien sûr, mais il est nécessaire de faire attention à certains points. Le risque principal est d’avoir un jeu de données mal équilibré avec certains types de voix, voire certaines voix tout court surreprésentées par rapport à d'autres. Votre modèle de machine Learning risque donc d’avoir des biais, ce que nous cherchons à éviter normalement.

Nous avons donc maintenant un jeu de données, pas exceptionnel, pas suffisant pour espérer être utilisé en production, mais c’est une première étape qui va nous permettre de créer un modèle, faire un proof of concept et continuer d’avancer dans la bonne direction.

Dans le prochain billet, nous rentrerons un peu plus dans la technique et notamment dans la construction du modèle.

---

Un grand merci d'avoir exploré ce sujet avec moi ! Si vous avez trouvé cela intéressant, partagez vos réflexions dans les commentaires ci-dessous. 🚀 N'oubliez pas de me suivre ici ou sur Twitter @pykpyky pour rester informé(e) des prochaines aventures. Vos commentaires et votre soutien sont toujours les bienvenue.