Synchronisation labiale des animations avec le plugin Wwise Meter

Programmation audio / Contenu sonore pour les jeux vidéo

Introduction

Ceci est le dernier article d'une série de trois articles techniques de Jater (Ruohao) Xu, dans lesquels il partage le travail réalisé pour Reverse Collapse : Code Name Bakery.

  • Vous pouvez consulter le premier article ici, dans lequel il explore l'utilisation de Wwise pour contrôler les cinématiques du jeu.
  • Vous pouvez consulter le deuxième article ici, dans lequel il explique comment la vue en 2D inclinée du jeu a nécessité un système audio 3D personnalisé pour résoudre des défis uniques liés à l'atténuation.

Synchronisation labiale des animations avec le plugin Wwise Meter

Série d'articles techniques | Partie 3

Il existe de nombreux éléments et moments dans le jeu où la mécanique est pilotée par l’audio. Grâce au plugin Wwise Meter, nous pouvons obtenir en temps réel des données audio précises pouvant être ensuite transmises au moteur de jeu pour alimenter différents systèmes audio.

Comme dans beaucoup d'autres jeux utilisant un style anime, Reverse Collapse comporte de riches dialogues narratifs ; bien que certains soient déclenchés durant les combats, la majorité se déroule dans des séquences narratives en 2D où deux personnages, placés à gauche et à droite de l'écran, interagissent à travers des dialogues de type question-réponse.

img1

L'image ci-dessus illustre un exemple de système narratif en 2D dans le jeu, où le personnage de Mendo est en train de parler au moment où la capture d'écran a été faite. Lorsque le personnage parle, une animation labiale est déclenchée sur ses sprites. Cette fonctionnalité est pilotée par les données de volume audio récupérées via Wwise.

Le jeu peut synchroniser l'animation labiale avec la parole en utilisant les données de volume audio, ce qui améliore l'immersion et renforce le réalisme des interactions entre les personnages. Cette méthode enrichit l’expérience narrative, la rendant plus captivante pour les joueurs.

Pour récupérer les données de volume en temps réel, le plugin Wwise Meter (Wwise Meter (audiokinetic.com)) a été utilisé. Il s’agit d’un outil simple d’utilisation et très performant, permettant de transmettre les données audio de Wwise vers le moteur de jeu. L’image ci-dessous montre la configuration de Wwise Meter sur notre bus de voix principal.

img2

img3

Dans le plugin Wwise Meter, nous avons associé un RTPC nommé Speech_MeteringData qui nous sert à transmettre les données au moteur de jeu. Ce RTPC collecte les informations relatives au volume de sortie des voix déclenchées dans le jeu. Sa valeur varie entre -48 et 0, ce qui représente l’étendue de volume audio. Même si la valeur peut théoriquement dépasser 0 en cas d’écrêtage du volume, c’est une situation qu’il est en général recommandé d’éviter en mixage où il est préférable de maintenir la valeur en dessous de 0.

Avec cette configuration, nous pouvons capturer et transmettre précisément les données de volume audio au moteur de jeu, de manière contrôlée, facilitant ainsi l’implémentation de diverses mécaniques de jeu.

Voilà qui conclut la configuration côté Wwise. Pour exploiter ces données côté moteur de jeu, il suffit d’ajouter quelques lignes de code pour détecter le niveau de volume et transformer cette valeur en donnée exploitable par notre système d’animation. Le code d’animation ci-dessous est volontairement simplifié, car chaque jeu possède ses propres systèmes d’animation ou peut utiliser des plugins différents.

Dans notre jeu, le système d’animation est assez simple : la bouche du personnage n’a que deux états, Open (ouverte) et Closed (fermée), et nous pouvons donc simplement utiliser une opération ternaire conditionnelle pour déterminer si la bouche du personnage doit être ouverte, et l’animer en conséquence. (Voir les paragraphes ci-dessus pour l’implémentation de GetGlobalRTPC())

bool bIsCharacterMouthOpen = (GetGlobalRTPC(“Speech_MeteringData”) > -48.0f  && GetGlobalRTPC(“Speech_MeteringData”) <= 0) ? true : false;

Dans de nombreux autres jeux, notamment en 3D, les personnages peuvent posséder des articulations et des os dans leur squelette 3D ; il est alors possible d’ajuster l’angle de l’articulation utilisée par l’animateur pour ouvrir la bouche. Cet angle est généralement exprimé par une valeur flottante. Dans cet exemple, imaginons que cette valeur puisse être appliquée avec speakingCharacter.SetMouthOpenness(float mouthJointAngle) ; l’angle minimum et maximum d’ouverture de la bouche s’étend de 0 degré à speakingCharacter.MaxMouthOpenness() degrés.

Dans ce cas, nous allons créer une petite fonction utilitaire pour extraire la valeur de sortie du modificateur de paramètre et l’utiliser directement dans les zones où cette fonctionnalité est requise.

public float GetGlobalRTPC(string rtpcName)
{
    int rtpcType = 1;
    float acquiredRtpcValue = float.MaxValue;
    AkSoundEngine.GetRTPCValue(rtpcName, null, 0, out acquiredRtpcValue, ref rtpcType);

    if(acquiredRtpcValue >= 0.25 && acquiredRtpcValue <= 16)
    {
        return acquiredRtpcValue;
    }
    else
    {
        return 1.0f;
    }
}

Outre la définition globale du RTPC, la fonction ci-dessus garantit également que, si des valeurs incorrectes sont détectées, elle ignorera l’application du RTPC et réinitialisera la valeur à 1.0f, ce qui correspond à la valeur par défaut.

Dans ce cas, nous pouvons améliorer le code précédent en utilisant la fonction suivante :

public float SetMouthOpenessByWwiseAudio()
{
    float mouthOpennessToSet = 0.0f;
    float retrievedMeteringRTPCvalue = GetGlobalRTPC(“Speech_MeteringData”);

    if (retrievedMeteringRTPCvalue > -48.0f && retrievedMeteringRTPCvalue <= 0)
    {
        mouthOpennessToSet = speakingCharacter.MaxMouthOpenness() * Normalization(retrievedMeteringRTPCvalue, -48.0f, 0.0f));
    }

    speakingCharacter.SetMouthOpenness(mouthOpennessToSet);
}

En effet, la fonction fournie ajustera précisément l’ouverture de la bouche en fonction des données de volume audio reçues du plugin Wwise Meter. Cela garantit que l’animation de la bouche reste fidèle et synchronisée avec le volume audio.

Avertissement : Les extraits de code utilisés dans cet article sont des versions génériques reconstituées et destinées uniquement à des fins d'illustration. La logique sous-jacente a été vérifiée pour fonctionner correctement, les appels et fonctions API spécifiques au projet ont été omis des exemples en raison de restrictions potentielles en matière de droits d’auteur.

Ruohao (Jater) Xu

Programmeur audio, Concepteur Sonore Technique

Ruohao (Jater) Xu

Programmeur audio, Concepteur Sonore Technique

Jater Xu est un programmeur audio expérimenté et un concepteur sonore technique spécialisé dans les solutions audio interactives avec intégration de Wwise dans Unreal et Unity à l'aide de C++, blueprint et C#. Son travail est à l'origine des paysages sonores immersifs de jeux reconnus tels que Homeworld 3, The Chant et Reverse Collapse.

Commentaires

Laisser une réponse

Votre adresse électronique ne sera pas publiée.

Plus d'articles

Gestion des versions itératives dans les jeux live-service

Dead by Daylight est un jeu live-service (ou GAAS, « game as a service »), basé sur un calendrier de...

17.5.2024 - Par Beatrix Moersch

Les dessous du son de Headbangers: Rhythm Royale

Headbangers: Rhythm Royale est le premier jeu musical compétitif en ligne au monde. Vous y affrontez...

3.7.2024 - Par Charles Bardin

Combiner Strata, Wwise et Unreal pour des expériences de jeu immersives

Dans cet article, nous allons explorer comment travailler avec Strata pour faire de la conception...

26.2.2025 - Par Chase Steele

Philosophie de conception et implémentation du système de musique interactive dans Condor Heroes (射雕)

PrologueIntroductionAperçu du système de musiqueContenu Synchronisation des PNJ avec la musique ...

17.4.2025 - Par Qimei Shi & Eugene Cherny

Music design d’Assassin’s Creed Shadows

Nous utiliserons des exemples détaillés de techniques d'intégration dans Audiokinetic Wwise et...

4.7.2025 - Par Jullian Hoff

Procédés d'optimisation audio dans Scars Above

Introduction Dans ce document, je vais tenter d'expliquer les différents principes que nous avons...

13.8.2025 - Par Milan Antić

Plus d'articles

Gestion des versions itératives dans les jeux live-service

Dead by Daylight est un jeu live-service (ou GAAS, « game as a service »), basé sur un calendrier de...

Les dessous du son de Headbangers: Rhythm Royale

Headbangers: Rhythm Royale est le premier jeu musical compétitif en ligne au monde. Vous y affrontez...

Combiner Strata, Wwise et Unreal pour des expériences de jeu immersives

Dans cet article, nous allons explorer comment travailler avec Strata pour faire de la conception...