Projet final : Transformations guidées par l'audio

Par Pierre-Marc Levasseur

Description

L'idée principale derrière ce projet est de générer des vidéos dont le contenu visuel est modifié par la bande audio. Pour ce faire, j'ai exploré deux types de transformations sur les images qui peuvent être paramètrées de manière intéressante par une bande audio. Donc, dans la première partie, j'ai développé un algorithme pour apparier les bandes de fréquences des images avec celle de l'audio. Dans la seconde, j'utilise mon algorithme de morphage de visage développé au tp3 et l'ensemble d'images de la base de données d'Utrecth pour générer des transformations guidées par l'audio.

Partie 1 : Appariement de bandes de fréquences audio/vidéo

Dans cette partie, mon but était d'apparier différentes bandes de fréquences d'une image avec différentes bandes de fréquences d'une piste audio pour générer une vidéo dont le contenu visuel correspond au contenu fréquentiel de la piste audio. Pour ce faire, j'ai développé un petit algorithme qui me génère une pile laplacienne à partir d'une image avec un nombre de bandes variable. Ensuite, j'ai développé une classe qui est en mesure de séparer un segment d'une piste audio en plusieurs bandes de fréquences. Pour développer cette classe, j'ai utilisé les outils de génération de filtres dans les outils de traitement de signal de Matlab. Avec ces outils en main, j'ai développé une métrique pour apparier de manière intéressante les différentes bandes de fréquences.

Métrique

La métrique est assez simple. Premièrement, les basses fréquences de l'image sont liées aux basses fréquences de l'audio et les hautes fréquences de l'image sont liées aux hautes fréquences de l'audio (et les bandes intermédiaires sont liées de la même façon). Ensuite, pour contrôler l'intensité d'une bande de fréquences de l'image, je calcul la moyenne des échantillons maximums de la bande audio correspondante et je multiplie les pixels de l'image correspondante avec la valeur trouvée. Ensuite, puisque les variations de la bande audio peuvent être très rapide, j'ai développé une classe qui gère les niveaux des différentes bandes de fréquences de l'image de manière à retenir les maximums d'intensité un peu plus longtemps. Pour chacune des bandes, je fais une gestion du niveau maximum qui ressemble à ceci : lorsqu'on atteint un nouveau niveau maximum pour une bande donnée, l'intensité de la bande de fréquences restera à ce maximum pour un certain temps d'attente (hold time). Dans mon cas, j'ai fixé ce temps d'attente à 5 frames. Quand ce temps d'attente est écoulé, le niveau d'intensité de la bande est réduit graduellement selon une certaine valeur de réduction (decay value). Dans mon cas, j'ai fixé cette valeur à -1% par frame. Finalement, dès que l'intensité d'une bande dépasse son maximum courant, son temps d'attente est réinitialisé et le processus recommence.

Algorithme

Donc, l'algorithme qui génère le vidéo suit les étapes suivantes:

Résultats

Voici quelques résultats que j'ai généré avec mon algorithme. Le premier est un simple balayage des fréquences pour nous donner une idée de comment les différentes bandes de fréquences sont liées ensembles.

Originale

Ce second résultat contient une piste audio avec un contenu fréquentiel un peu plus varié.

Originale

Ce dernier résultat a été généré à partir d'un vidéo (originale à gauche).

Difficultés et considérations techniques

Comme le résultat de ce projet n'était pas totalement claire au début, j'ai dû beaucoup expérimenter pour en arriver à un résultat intéressant. Initialement, je prenais la moyenne de chaque bandes de fréquences audio et je l'appliquait directement à la bande correspondante dans la pile laplacienne. Les résultats fonctionnaient, mais ils étaient très peu intéressant. Les variations d'intensité dans les fichiers audio peuvent être rapides et parfois assez subtil. Donc, les vidéos que je génèrais avaient tendance à clignoter et il était plutôt difficile de comprendre comment l'audio intéragissait avec l'image. C'est pourquoi j'ai développé le système de temps d'attente et de réduction graduelle d'intensité.

Ensuite, j'ai générer plusieurs vidéo assez long donc avec une grande quantité d'images (2000 images et plus). Pour être en mesure de générer les vidéos, j'ai donc dû générer les images et les sauvegarder directement sur le disque plutôt que les garder en mémoire. Ensuite, pour faire l'assemblage des images et l'ajout de la piste audio j'ai utilisé le logiciel Blender en mode "video sequence editor".

Finalement, j'ai dû éditer plusieurs fichier audio pour ajuster la longueur de la séquence ou pour faire du traitement spectral. Pour ce faire, j'ai utiliser le logiciel Reaper.

Partie 2 : Morphage de visage guidé par l'audio

Mon but dans cette deuxième partie était de générer des transformations sur des photos de visages à partir d'un fichier audio et des images de la base de données d'Utrecht. J'ai donc utilisé le détecteur de visage fournis au tp3 pour détecter les points d'intérêts de toutes les images de la base de données. Avec ces points, j'ai formé une grande matrice sur laquelle j'ai fait une analyse en composantes principales. Cette analyse me donne une série de vecteurs représentant les axes de déformation principale du visage moyen. En d'autre mots, un vecteur résultant de cette analyse représente une configuration des points qui correspond à la dispersion de l'ensemble des points dans un certain axe.

Métrique

Pour transformer une photo de visage avec l'analyse des points et un fichier audio et finalement générer un vidéo, j'ai utilisé une métrique semblable à celle de la première partie. Donc, encore une fois pour chaque image du vidéo, je prend les échantillons correspondant de la piste audio, je fais la séparation en plusieurs bandes de fréquences et je calcul la moyenne des échantillons maximums. Cette fois par contre, les valeurs calculées serviront dans la formule suivante:

P' = P + α1v1 + α2v2 + ... + αnvn

Le résultat de cette formule nous donne donc les points du visage transformés par l'intensité de chacune des bandes audio dans les directions les plus importantes selon l'analyse en composantes principales. Encore une fois, j'utilise ma mécanique de temps d'attente que j'ai développé dans la partie 1 sur chaque bande de fréquences (donc sur les valeurs αi dans la formule précédente).

Algorithme

L'algorithme que j'ai développé dans cette partie a la même structure générale que celui de la première partie. Il suit donc les étapes suivantes:

Résultats

Voici quelques résultats que j'ai généré avec mon algorithme. Premièrement, pour nous donner une idée des transformations que mon algorithme peut provoquer, voici un résultat avec une photo de mon visage et une piste audio d'un balayage de fréquences.

Originale

Finalement, puisque j'avais accès aux photos des étudiants de ma classe, j'ai décidé de faire un petit montage des visages de tout le monde transformés par différentes pistes audio. Ne laissez jamais traîner vos photos!