On s’intéresse ici au codage (ou compression) de signaux de parole et audio avec perte.
Dans un système de compression avec perte, l'objectif général est de chercher une représentation du signal qui soit la plus adaptée possible à un codage au débit le plus faible possible à qualité donnée ou inversement avec la meilleure qualité possible à un débit donné, en prenant en compte des contraintes comme la complexité, la quantité de stockage ou le retard algorithmique.
Historiquement ce domaine s’est développé selon deux approches :
• Le codage de signaux de parole dominé par une approche temporelle basée sur la prédiction linéaire (court-terme et long-terme), afin de modéliser le signal de parole – la partie non modélisée (innovation ou résidu de prédiction) est codée en plus des paramètres du modèle. La perception auditive est en général prise en compte par l’usage d’une pondération perceptuelle. Le modèle CELP (pour « Code Excited linear Prediction » en anglais) reste le paradigme de référence pour le codage de parole « conventionnel » de bonne qualité à bas débit.
• Le codage de signaux audio qui s’appuie majoritairement sur une approche fréquentielle par sous-bandes ou transformée afin d’obtenir un gain de codage et de tirer parti de caractéristiques psychoacoustiques et des limites de la perception auditive. Le codage par transformée MDCT (pour « Modified Discrete Cosine transform » en anglais »), à décimation critique, reste la technique de référence pour le codage audio à bas débit « conventionnel ».
Le codage de parole et le codage audio ont ensuite convergé avec des modèles de codage « universel », en particulier par des approches combinant temps (CELP) et fréquence (MDCT).
L’état de l’art en codage de parole et audio « conventionnel » est très riche, et de très nombreux codecs normalisés ou propriétaires ont été développés, en incorporant les différentes avancées techniques et répondant à diverses applications et contraintes. Les standards les plus récents comme USAC, MPEG-H 3D Audio, EVS ou Opus donnent un bon aperçu des dernières avancées et représentent actuellement l’état de l’art du codage « conventionnel ».
Les approches basées sur l’intelligence artificielle et notamment par l’utilisation de réseaux de neurones telles que WaveNet et VQ-VAE (pour « Vector quantized- variational auto-encoder » en anglais) ont stimulé l’émergence des méthodes de codage de parole et audio basées sur les réseaux de neurones. L’apprentissage profond (dit « deep learning » en anglais) a montré un grand potentiel dans d’autres domaines connexes au codage audio, tels que la synthèse de parole (« text to speech » en anglais) ou le codage d’images et vidéo et l’analyse et le traitement de signal audio en général.
Une particularité des méthodes neuronales appliquées à la parole et l’audio est qu’elles fonctionnent en général directement dans le domaine temporel (sur la forme d’onde). Cependant, on trouve également des modèles dans le domaine fréquentiel.
On peut distinguer deux approches de codage de parole et audio neuronal :
- Codage de caractéristiques (« features » en anglais) venant alimenter un décodage par synthèse avec modèle génératif : des paramètres, comme par exemple le spectrogramme selon l’échelle Mel, sont estimés et codés et un décodeur par réseau de neurones (ex : WaveNet) reconstruit la forme d’onde à partir de cette représentation codée.
- Codage de bout en bout, inspiré de l’approche VQ-VAE, où le codec est décomposé en une partie analyse, un quantificateur, et une partie synthèse qui sont appris de bout en bout. Le principe est de représenter la distribution de l’entrée (de dimension élevée) par des codes latents discrétisés.
Le codage audio neuronal est arrivé à un niveau de maturité suffisant pour que des codecs neuronaux soient déployés dans des applications conversationnelles.
On prend ici comme méthodes représentatives du codage audio neuronal les codecs appelés « SoundStream » et « EnCodec » qui sont décrits respectivement dans :
N. Zeghidour, A. Luebs, A. Omran, J. Skoglund et M. Tagliasacchi, «Soundstream: An end-to-end neural audio codec,» IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2021, et
A. Défossez et e. al.,«High fidelity neural audio compression,» arXiv preprint arXiv:2210.13438, 2022.
Leurs performances à bas débit (de l’ordre de 3 à 6 kbit/s) rivalisent avec les approches de codage de parole et audio « conventionnelles » comme EVS ou Opus qui fonctionnent à plus haut débit.
Ces deux codecs, SoundStream et Encodec, sont très similaires, on ne décrit ici que le principe de la méthode « EnCodec » (dans le cas d’un signal mono, i.e. unidimensionnel).
La illustre le principe de codage selon la méthode EnCodec (dans le cas d’un signal mono, i.e. unidimensionnel). On peut distinguer deux étapes de la conception de ce codec par réseaux de neurones : l’apprentissage et l’inférence. Dans la phase d’apprentissage, les paramètres du modèle sont entrainés à partir de données d’apprentissage. La phase d’inférence (ou l’inférence) fait référence au déploiement du modèle et sa mise en application en situation réelle.
A la phase d’inférence, c’est-à-dire lors de l’utilisation du codec déjà « entrainé », le codage (bloc 100) d’une trame de signal de 320 échantillons du signal d’entrée x échantillonné à une fréquence de 24 kHz se décompose en deux blocs :
- une partie analyse (bloc 101) par un réseau de neurones qui convertit le signal d’entrée x dans une représentation latente z appelé également « espace latent ». Cet espace latent représente sous forme compacte les caractéristiques importantes du signal d’entrée.
Dans l’exemple d’EnCodec, l’architecture de la partie analyse est décrite plus loin en référence aux figures 9 et 10.
- une partie quantification/codage (bloc 102) de la représentation latente z avec éventuellement un codage entropique (appelé modèle de langage ou « language model » en anglais) dans le cas d’EnCodec, générant un train binaire I constitué d’indices de quantification multiplexés.
De même, à la phase d’inférence, le décodage (bloc 110) qui reconstruit le signal audio se décompose en deux blocs :
- une quantification inverse/décodage de l’espace latent (bloc 111) à partir du train binaire I;
- une partie synthèse par un réseau de neurones de synthèse (bloc 112). L’architecture de cette partie est symétrique (en ordre inverse) de la partie analyse, avec des convolutions transposées au lieu de convolutions ; cette architecture est décrite plus loin en référence aux figures 9 et 10. La synthèse génère une valeur approchée du signal x appelée .
On notera qu’une implémentation complète d’Encodec (blocs 100 et 110) est donnée dans : https:/github.com/facebookresearch/encodec
La quantification utilisée dans EnCodec est une quantification vectorielle multi-étages, appelée « Residual VQ » ou encore RVQ (pour « Residual Vector Quantization » en anglais).
Lors de la phase d’apprentissage, les dictionnaires de quantification RVQ sont appris et stockés ; le mot de code sélectionné est mis à jour avec une moyenne mobile (avec un facteur d’oubli) et les entrées non utilisées sont remplacées par des candidats tirés du lot courant de la base d’apprentissage. La quantification est court-circuitée dans la phase de rétropropagation des gradients pour les réseaux d’analyse/synthèse. Un nombre variable d’étages (appelés « étages résiduels ») est sélectionné à l’apprentissage pour entrainer un seul modèle représentant plusieurs débits. Par ailleurs, lors de l’apprentissage, le codec comprend également des blocs supplémentaires de calcul de métriques (bloc 121) et un réseau de neurones complémentaire appelé « discriminateur » (bloc 120) selon le principe des réseaux de neurones génératifs antagonistes (GAN pour « Generative Adversarial Network » en anglais), pour obtenir différentes fonctions de coût pour l’apprentissage. Les détails concernant l’apprentissage ne sont pas détaillés ici car cela dépasse le cadre de la présente invention qui se focalise sur l’amélioration d’un codec par réseaux de neurones à un signal audio, une fois les réseaux d’analyse et de synthèse déjà entrainés (partie grisée de la ).
La illustre le fonctionnement de la quantification à plusieurs étages (bloc 102 sans codage entropique) et la décrit le décodage associé (bloc 111 sans décodage entropique).
En fonction du nombre de bits R par trame, celle-ci fonctionne avec une série de K quantificateurs (blocs 201, 202, … 20K) en cascade, où le signal z de l’espace latent est codé par un premier étage puis l’erreur de quantification de l’étage précédent ek est calculée (bloc 251, 252, …) pour obtenir l’entrée de l’étage courant.
Dans l’EnCodec décrit dans l’article précité, le débit d’un étage est de 10 bits pour un signal d’entrée en dimension D=128. Pour une entrée mono à 24 kHz, EnCodec définit des étages de N=1024 entrées (10 bits par trame de 320 échantillons à 24 kHz, soit 0.75 kbit/s), et peut en combiner jusqu’à 32 (pour le débit de 24 kbit/s). La quantification RVQ implique de stocker K=32 dictionnaires (blocs 001 à 00K), avec un dictionnaire par étage ; chaque dictionnaire Ck est de dimension D=128 et de taille N=1024. La quantification dans le k-ième étage s’effectue par simple recherche du plus proche voisin entre ek et tous les mots de code du dictionnaire Ck , en minimisant l’erreur quadratique (la distance euclidienne).
Par défaut, le nombre d’étages successifs combinés est prédéfini : K=2, 4, 8, 16 ou 32 étages, pour un débit de 1.5, 3, 6, 12 ou 24 kbit/s (ou R = 20, 40, 80, 160, 320 bits par trame). Les indices ik de chaque étage sont multiplexés pour former le train binaire I de la trame courante (bloc 200).
Au décodage, représenté en figure 3, le nombre d’étages K est déterminé en fonction du débit R. Le train binaire I est démultiplexé et ces indices sont séparés (bloc 300), et chaque étage (blocs 301, 302, … 30K) fournit le mot de code stocké et décodé par lecture dans le dictionnaire Ck associé (blocs 001 à 00K), et tous les mots de code ainsi décodés sont successivement ajoutés (blocs 352, …, 35K) pour obtenir le signal décodé de l’espace latent dans la trame courante.
La méthode de quantification de l’espace latent de type RVQ présente quelques avantages : les structures implicites de l’espace latent sont apprises implicitement (sans être explicitement extraites) par la quantification vectorielle, l’approche multi-étages permet un codage hiérarchique (scalable) avec des étages d’améliorations dont le nombre dépend du débit visé.
Cette méthode pose cependant plusieurs problèmes. Il est connu de l’homme de l’art que la quantification à plusieurs étages (non structurée) est sous-optimale notamment en termes de rapport signal à bruit de la quantification et ce problème est d’autant plus flagrant que le nombre d’étages augmente. De plus, la quantification à plusieurs étages requiert un stockage non négligeable, chaque étage (de 10 bits) requiert N x D valeurs stockées où N=1024 est la taille du dictionnaire (en nombre de mots de code) et D est la dimension de l’espace latent (D=128 dans EnCodec).
Enfin, la complexité de la recherche du plus proche voisin (qui doit s’effectuer de façon exhaustive par minimisation de l’erreur quadratique entre l’entrée ej et tous les mots de code ck(i)) est significative pour le débit de 10 bits, et elle augmente linéairement avec le nombre d’étages et le débit.
Il existe donc un besoin d’optimisation des techniques de codage de l’espace latent pour le domaine du codage/décodage audio de type neuronal.
La illustre sous forme d’organigramme les étapes principales d’un procédé de codage d’un signal audio selon l’invention.
Dans une première étape E401, le signal audio x est analysé par un réseau de neurones d’analyse tel que décrit en référence à la (bloc 101) pour obtenir une représentation latente z de ce signal audio. L’architecture de cette étape d’analyse par réseau de neurones peut-être comme celle décrite en référence à la et détaillée aux figures 9 et 10. Dans des variantes, l’exemple de mise en œuvre du bloc 101 issu d’EnCodec pourra être remplacé par d’autres architectures de réseau de neurones (par exemple partie analyse du codec SoundStream, d’un auto-encodeur, etc.).
L’espace latent obtenu est représenté ici, dans le mode de réalisation décrit, sous forme vectorielle et représenté par un vecteur latent z.
Cet espace latent peut également être représenté par un ensemble de vecteurs latent, dans le cas d’une représentation matricielle par exemple. Dans la suite de la description, on parlera du traitement d’un vecteur latent. Il est entendu que pour une représentation matricielle le traitement pourra se faire sur l’ensemble de vecteurs latents, par exemple par un traitement successif des vecteurs ou en transformant la matrice sous la forme d’un vecteur unidimensionnel par concaténation de lignes ou colonnes.
Un pré-traitement du vecteur latent peut être mis en œuvre à l’étape E403.
Pour cela, un vecteur de correction est obtenu en E402 et est soustrait au vecteur latent z en E403 pour obtenir un vecteur latent prétraité z’.
Ce vecteur de correction peut être fixe ou adaptatif. Il représente une valeur moyenne du vecteur latent (obtenue à partir de valeurs préalablement stockées en mémoire (Inf)) ou un vecteur latent issu d’au moins une première quantification directe.
Les différents modes d’obtention de ce vecteur de correction sont décrits ultérieurement en référence aux figures 5 et 7.
Cette correction du vecteur latent est mise en œuvre pour adapter le vecteur latent à la transformée mise en œuvre à l’étape E404. Dans certains cas de figure, cette étape peut ne pas être mise en œuvre et la transformée est alors appliquée au vecteur latent non modifié.
A l’étape E404 une transformée linéaire est appliquée, soit au vecteur latent z non prétraité, soit au vecteur latent prétraité et ainsi modifié selon l’étape E403. On obtient ainsi, à l’issue de l’étape E404, un vecteur latent transformé y.
L’application de cette transformée est décrite ultérieurement en référence aux figures 5 et 7.
A l’étape E405, une quantification de ce vecteur latent transformé est mise en œuvre.
Pour cela plusieurs modes de réalisation sont possibles et sont décrits en référence aux figures 5 et 7.
A l’issue de cette étape de quantification, un train binaire I comportant des indices de quantification ((i1, i2,…) ou (m,b)) du vecteur latent transformé sont obtenus, selon la méthode de quantification mise en œuvre.
La illustre les étapes principales d’un procédé de décodage d’un signal audio.
Une étape E411 de décodage d’un vecteur latent transformé ( ) est mise en œuvre à partir d’indices de quantification ((i1, i2,…) ou (m,b)) du vecteur latent transformé reçus d’un train binaire I. Des exemples de réalisation seront décrits en référence aux figures 6 et 8.
A l’étape E412, une transformée linéaire est appliquée au vecteur latent transformé décodé pour obtenir un vecteur latent décodé . Dans le cas où un prétraitement du vecteur latent a été effectué au codage, une étape de modification du vecteur latent décodé est effectuée en E414 par combinaison du vecteur latent décodé , alors intermédiaire et d’un vecteur de correction obtenu à l’étape E413 pour former un vecteur latent décodé .
A l’étape E415, une synthèse par réseau de neurones tel que décrit en référence à la figure 1 (bloc 112) est effectuée sur le vecteur latent décodé pour obtenir le signal audio décodé . Dans des variantes, l’exemple de mise en œuvre du bloc 112 issu d’EnCodec pourra être remplacé par d’autres architectures de réseau de neurones (par exemple partie synthèse du codec SoundStream, d’un auto-encodeur, etc.).
La décrit un premier mode de réalisation d’un dispositif de codage ainsi qu’un premier mode de réalisation d’un procédé de codage d’un signal audio. Cette figure montre en particulier un module de codage (500) d’une représentation latente (ou espace latent) compris dans un codeur de signal audio tel que décrit en référence à la (bloc 100). Dans des variantes, d’autres méthodes que le réseau de neurones d’analyse d’EnCodec pourront être utilisées pour obtenir l’espace latent. Sans perte de généralité, on considère que le signal audio d’entrée est découpé en trames temporelles successives (ou vecteurs unidimensionnels) de longueur L (qui donne la dimension des vecteurs d’entrée). L’espace latent est ici vu comme un vecteur de dimension D dans la trame courante. Ainsi, à titre d’exemple de réalisation, on considère ici que L = 320 échantillons et D = 128. Dans des variantes les valeurs de L et D pourront être différentes et variants d’une trame à l’autre.
Ainsi, le bloc de quantification/codage de l’espace latent (bloc 102) de la est remplacé par le module de codage de l’espace latent (bloc 500) décrit à présent.
Ce bloc 500 reçoit donc en entrée une représentation latente z issue du module d’analyse par réseau de neurones (bloc 101 de la ).
Par la suite, les termes « espace latent » ou représentation latente » désigneront la même représentation sous la forme d’un ensemble de vecteurs z, ou pour simplifier d’un vecteur latent z, c'est-à-dire une représentation du signal audio comportant une pluralité de données variables (dites aussi variables latentes), discrètes ou non.
Les dimensions de l’entrée de ce module de codage (bloc 500) sont ici notées [D,T] où D est la dimension de l’espace latent dans chaque trame et T est le nombre de trames.
Par ailleurs, pour simplifier les notations on considère le cas du codage d’une trame donnée, avec T=1 trame. Le cas T>1 est pertinent pour des extensions de réalisation de l’invention où un codage conjoint de plusieurs trames serait réalisé. Par la suite on considèrera que l’entrée du bloc 500 est de dimension [D,1].
On suppose ici que la représentation latente est sous forme vectorielle et représentée par un vecteur latent z de dimension [D,1]. Dans le cas où l’espace latent n’est pas sous forme vectorielle il peut, par exemple, être sous forme matricielle, alors une conversion dans la forme vectorielle peut être prévue.
Comme on le verra par la suite, le procédé de codage selon l’invention consiste à transformer l’espace latent de sorte que les différentes composantes de l’espace latent soient le plus décorrélées possible.
Selon une première étape, un vecteur latent modifié est obtenu en retranchant du vecteur latent z, dans le bloc 512, un vecteur de correction issu du bloc 510 qui utilise des données stockées dans le bloc 540 ; il s’agit d’un vecteur de dimension [D,1] des variables latentes.
Dans le mode de réalisation privilégié, le vecteur correspond à la valeur (stationnaire) de z quand l’entrée x du codeur est un signal de silence (à valeurs nulles ou bien un bruit faible aléatoire de type bruit de fond de la chaîne de captation sonore ou « idle noise » en anglais). Dans ce cas, le bloc 540 stocke directement ce vecteur prédéterminé et le bloc 510 ne fait que lire ce vecteur.
Dans des variantes, le vecteur peut être pris comme la moyenne (ou centroïde) d’un dictionnaire de quantification préalablement appris et stocké comme le dictionnaire C1 (bloc 001) pour le codec décrit en référence aux figures 2 et 3. Ce dictionnaire de quantification C1 est stocké en mémoire dans le bloc 540 ou de façon plus avantageuse on ne stocke que le centroïde issu de ce dictionnaire.
Ainsi, dans un mode de réalisation, la détermination du vecteur s’effectue de la façon suivante :
qui correspond au centroïde du premier dictionnaire C1 correspondant au bloc 001 tels que décrits en figure 2 et 3.
Dans des variantes on pourra inclure les dictionnaires des étages suivants, par exemple dans le cas des 2 premiers dictionnaires C1 et C2(blocs 001 et 002) :
Dans ce cas, les dictionnaires de quantification C1 et C2 sont stockés en mémoire dans le bloc 540 ou de façon plus avantageuse on ne stocke que le centroïde issu de ces 2 dictionnaires.
L’intérêt des blocs 510 et 512 est d’adapter le vecteur latent z avant l’application de la transformée T du bloc 513. Pour cela, on cherche à supprimer une composante basée sur une moyenne de l’espace latent. Sans cette suppression, l’existence de cette valeur moyenne pourrait rendre la transformation à suivre en 513, moins optimale et pourrait parasiter le vecteur transformé obtenu.
Ce vecteur est ici défini comme étant fixe et aucune information supplémentaire ne doit être transmise.
Le bloc 513 effectue ensuite une transformée linéaire, par exemple de type PCA/KLT, « PCA » (pour « Principal Component Analysis » en anglais) désignant une analyse en composante principale et « KLT » (pour « Karhunen Loeve Transform » en anglais) désignant une transformée de Karhunen Loeve.
Un rappel des deux techniques est repris ci-dessous.
Transformée de Karhunen Loeve (ou « KLT » pour « Karhunen Loeve Transform »)
La transformation de Karhunen Loeve (KLT) d’un vecteur aléatoire z centré en 0 et de matrice de covariance est définie par :
où est la matrice de vecteurs propres (avec la convention que les vecteurs propres sont des vecteurs colonne) obtenue par décomposition en valeurs propres de
où est une matrice diagonale dont les coefficients sont les valeurs propres. La matrice contient les vecteurs propres (colonnes) de , tels que
On peut voir la KLT comme un changement de base, car le produit
exprime le vecteur
dans la base donnée par les vecteurs propres.
La transformation inverse est donnée par :
La KLT permet de décorréler les composantes de ; les variances du vecteur transformé sont les valeurs propres de .
Analyse en composantes principales (ou « PCA » pour « principal component analysis »)
L’analyse en composante principale (PCA) est une technique de réduction de dimensionnalité qui produit des variables orthogonales et maximise la variance des variables après projection (ou de façon équivalente minimise l’erreur de reconstruction).
La PCA présentée ci-après, bien que s’appuyant aussi sur une décomposition en valeurs propres comme la KLT, est telle que la matrice de covariance estimée est calculée à partir de vecteurs observés , de dimension :
en supposant que ces vecteurs sont centrés :
La décomposition en valeurs propres de sous la forme permet de calculer les composantes principales :
.
La PCA est une transformation par la matrice qui projette les données dans une nouvelle base pour maximiser la variance des variables après projection.
On notera que la PCA peut également s’obtenir à partir d’une décomposition en valeurs singulières (SVD) du signal
mis sous la forme d’une matrice de taille D x K. Dans ce cas, on peut écrire :
où les matrices , , désignent les vecteurs singuliers à gauche, les valeurs singulières et les vecteurs singuliers à droite.
On vérifie que qui correspond à une diagonalisation de . Ainsi les vecteurs de projection de la PCA correspondent aux vecteurs colonne de et la projection donne comme résultat .
Sans perte de généralité, on considère ici que la KLT et la PCA représentent les mêmes méthodes d’analyse et de transformation. On parlera par la suite de transformée linéaire.
Ainsi, le bloc 513 met en œuvre une étape de transformation linéaire du vecteur latent modifié z’ par l’application d’une matrice de rotation U de taille DxD définie ci-dessous (précalculée et stockée en mémoire en 533) et une opération de troncature, pour obtenir un vecteur latent transformé y tel que :
y= trunc(
. z’ )
où trunc(.) désigne l’opération de troncature qui ne retient que les DT premières composantes. Dans le mode de réalisation privilégié on prend comme exemple DT=80 (à comparer avec D=128).
L’étape de transformation (bloc 513) ne requiert aucun budget de bits.
Dans des variantes, la matrice de covariance pourra être remplacée par une matrice de corrélation en incluant une pré-normalisation des D différentes composantes par l’écart-type ce qui donne une matrice de corrélation.
Dans des variantes, il sera possible de combiner la multiplication matricielle par et la troncature de D à DT dimensions en effectuant une multiplication matricielle que par la matrice .
Dans le premier mode de réalisation décrit ici, la matrice de rotation U est précalculée et obtenue à partir d’au moins un des dictionnaires de quantification RVQ (bloc 001).
La matrice de covariance R du premier dictionnaire C1 (centré) est obtenue, par exemple comme suit :
Dans des variantes, on pourra aussi utiliser les étages suivants, par exemple prendre :
Dans d’autres variantes, on pourra utiliser une base de données audio définissant un ensemble de trames d’entrée du signal x et on enregistrera la séquence des valeurs du signal z’ pour déterminer R comme la matrice de covariance (ou de corrélation) de ce signal z’. Cette matrice R n’a pas besoin d’être stockée, elle sert uniquement d’information intermédiaires pour déterminer la transformée linéaire à appliquer ensuite à l’étape d’inférence selon l’invention.
On applique à R une analyse en composantes principales PCA ou de façon équivalente une transformée de Karhunen Loeve (KLT), avec estimation de matrice de covariance et décomposition en valeurs propres notée EVD pour « Eigen Value Decomposition » en anglais, pour obtenir des valeurs propres et une matrice de vecteurs propres U à partir de la matrice de covariance R de sorte que
Dans un mode particulier de réalisation, les valeurs propres sont ordonnées en ordre décroissant avec . En pratique, on peut obtenir cette propriété en utilisant par exemple une décomposition en valeurs singulières (SVD) sur la matrice R ou en triant les valeurs propres obtenues et en réordonnant la matrice U.
Selon l’invention, dans ce premier mode de réalisation, la quantification RVQ est modifiée en exploitant la décorrélation de l’espace latent transformé de z à y. Ainsi on peut remplacer les dictionnaires C1, C2, …, CK prédéfinis de différents étages par des dictionnaires transformés C’1, C’2, …, C'K sur lesquels on peut effectuer une troncature de l’espace latent. En effet, la transformée U ayant été effectuée selon un ordre d’importance des valeurs propres de la matrice de transformée, les composantes résultantes sont également ordonnées par ordre d’importance ce qui permet d’en tronquer une partie et de ne représenter que la partie restante sans dégrader de façon significative la qualité de quantification.
Dans un exemple de réalisation, on passe d’une dimension D=128 à une dimension tronquée DT=80.
Ainsi selon l’invention on définit les nouveaux dictionnaires de quantification comme suit :
C’1 =
C’2 =
…
C'K=
où trunc(.) désigne l’opération de troncature qui ne retient que les DT premières composantes.
Ainsi, l’espace latent transformé y est quantifié par une quantification RVQ en étage, par les modules 501, 502, .., 50k et les modules 551, 552, …, correspondants aux modules de quantification 201, 202, …, 20k et 251, 252, .., décrits en référence à la à l’aide des dictionnaires de quantification transformés C’1, C’2, …, C'K, stockés en mémoire dans les blocs 1001, 1002, …, 100K.
Les différentes informations binaires de la quantification RVQ (i1, i2, ...,ik), obtenues à l’issue des différents étages de quantification RVQ telles que décrits ci-dessus, sont multiplexées dans le bloc 530. On notera que l’invention ne change pas l’ordre des mots de code, ainsi les indices i1, i2, ...,ik selon le codage en 500 sont décodables par le décodeur RVQ existant tel que EnCodec en 111.
L’avantage du premier mode de réalisation de l’invention est que la complexité de la recherche dans les dictionnaires successifs et le stockage peuvent être réduits approximativement d’un facteur de DT/D, soit 80/128 dans l’exemple donné ici. Les performances de la quantification RVQ restent cependant identiques à celles de l’état de l’art.
Dans des variantes où la quantification de l’espace latent utilise la quantification RVQ avec d’autres dictionnaires que ceux d’EnCodec (par exemple SoundStream avec D=256 et d’autres dictionnaires), les dictionnaires C’kseront définis en fonction des dictionnaires Ckprédéfinis.
Dans une variante, il sera aussi possible de définir directement des dictionnaires de quantification C’k par apprentissage direct issu d’une séquence de signal y, sans passer par une étape préliminaire de définition de dictionnaires Ck existants. Cette variante revient en fait à appliquer le second mode de réalisation de l’invention détaillé plus loin, avec une quantification RVQ de l’espace latent transformé y.
La décrit un premier mode de réalisation d’un dispositif de décodage selon l’invention ainsi qu’un premier mode de réalisation d’un procédé de décodage selon l’invention.
Cette figure montre en particulier un module de décodage (600) d’une représentation latente (ou espace latent) compris dans un décodeur de signal audio tel que décrit en référence à la (bloc 110). Ainsi, le bloc de décodage de l’espace latent (bloc 111) de la est remplacée par le module de décodage de l’espace latent (bloc 600) décrit à présent.
Le train binaire I reçu pour la trame courante est démultiplexé (bloc 630). Dans ce premier mode de réalisation, les indices correspondent en fait aux indices de quantification RVQ, cependant les dictionnaires de quantification RVQ originaux C1, C2, …, CK sont remplacés par des dictionnaires C’1, C’2, …, C'K de dimension plus faible DT, comme au codeur décrit à la . Typiquement on prend DT =80 au lieu de D=128 dans la quantification RVQ originale.
Une représentation latente transformée décodée est ainsi obtenue à l’issue des différents étages de quantification inverses 1 à K comprenant les blocs 601 à 60K et 652 à 65K correspondants aux blocs 301 à 30K et 352 à 35K de la .
On applique ensuite, dans le bloc 613, une transformation linéaire, par exemple la transformation KLT/PCA inverse, au vecteur latent transformé décodé.
La matrice de rotation U stockée en 533 et obtenue par apprentissage permet d’appliquer la transformée inverse selon l’équation :
représentant un vecteur latent décodé intermédiaire et ext(.) représente l’opération d’extension de la dimension DT à la dimension D par ajout de (D-DT) zéros à la fin du vecteur.
Dans le bloc 610, on obtient le vecteur de correction de la même façon qu’au codeur dans le bloc 510, en utilisant les informations stockées en 510, telles que décrites en référence à la .
Puis les vecteurs et sont combinés en 612 pour former le vecteur décodé de l’espace latent .
Celui-ci est ensuite fourni en entrée du module de synthèse par réseau de neurones (Syn.) 112 tel que décrit en référence à la figure 1, afin d’obtenir le signal audio décodé .
Dans une variante, il sera aussi possible de définir directement des dictionnaires de quantification C’k par apprentissage direct issu d’une séquence de signal y, sans passer par une étape préliminaire de définition de dictionnaires Ckexistants. Cette variante revient en fait appliquer le second mode de réalisation de l’invention détaillé plus loin, avec une quantification RVQ de l’espace latent transformé y.
La décrit un second mode de réalisation d’un dispositif de codage ainsi qu’un second mode de réalisation d’un procédé de codage d’un signal audio selon l’invention. Cette figure montre en particulier un module de codage (700) d’une représentation latente (ou espace latent) compris dans un codeur de signal audio tel que décrit en référence à la (bloc 100).
Ainsi, le bloc de quantification/codage de l’espace latent (bloc 102) de la est remplacé par le module de codage de l’espace latent (bloc 700) décrit à présent.
Ce bloc 700 reçoit donc en entrée une représentation latente z issue du module d’analyse par réseau de neurones (bloc 101 de la ).
Les dimensions de l’entrée de ce module de codage (bloc 700) sont ici notées [D,T] où D est la dimension de l’espace latent dans chaque trame et T est le nombre de trames.
On reprend là encore l’exemple du codeur audio de la correspondant à EnCodec, où D=128, dans des variantes cette dimension pourra avoir une valeur différente. Par ailleurs, pour simplifier les notations on considère le cas du codage d’une trame donnée, avec T=1 trame. Le cas T>1 est pertinent pour des extensions de réalisation de l’invention où un codage conjoint de plusieurs trames serait réalisé. Par la suite on considèrera que l’entrée du bloc 700 est de dimension [D,1].
Comme dans le premier mode de réalisation, le procédé de codage selon l’invention consiste à transformer l’espace latent de sorte que les différentes composantes soient le plus décorrélées possible.
Selon une première étape, un vecteur latent modifié u est obtenu en retranchant du vecteur latent z, dans le bloc 702, un vecteur de correction issu du bloc 701.
Le vecteur peut être :
- Comme dans le cas du premier mode de réalisation (bloc 510), une moyenne prédéterminée (donc un vecteur de dimension [D,1]) des variables latentes de l’espace latent. De façon préférentielle, on prend une entrée x du codeur à valeurs nulles (silence) ou à valeurs de bruit faible et on récupère la valeur de z après un certain nombre de trames ; dans l’exemple d’EnCodec qui comprend des couches LSTM (pour « Long Short Term Memory » en anglais) , il est important d’attendre que le codec ait stabilisé son analyse à cause du côté récursif des couches LTSM. Dans des variantes, on peut prendre le centroïde d’un ou de plusieurs dictionnaires RVQ.
- le vecteur latent décodé à l’issue d’un premier étage de quantification vectorielle résiduelle RVQ tel que le bloc 201 décrit à la pour un codage avec K=1, ou
- de façon plus générale, le vecteur latent décodé, par exemple , à l’issue d’un nombre prédéterminé plus grand que 1, par exemple K = 2, d’étages RVQ, par exemple les blocs 201 et 202 décrits à la .
Ainsi, dans le mode de réalisation correspondant au mode a) décrit ci-dessus, le module 701 lit en mémoire (bloc 710) un vecteur moyen déterminé. Dans des variantes le bloc 710 détermine le centroïde du dictionnaire C1 de la façon suivante :
qui correspond au centroïde du premier dictionnaire de quantification (C1) des blocs 201 et 301 de RVQ tels que décrits en figure 2 et 3. Ce dictionnaire de quantification C1 est stocké en mémoire dans le bloc 710 ou de façon plus avantageuse le bloc 710 peut directement stocker la valeur prédéterminée de . Comme dans le premier mode de réalisation, on peut généraliser la définition du vecteur au cas où plusieurs dictionnaires RVQ sont utilisés pour en déterminer le centroïde.
Dans les modes de réalisations correspondant aux modes b) ou c) ci-dessus, le bloc 701 correspond respectivement à un ou plusieurs étages de quantification vectorielle décrits pour la méthode EnCodec et représentés à la (blocs 201, 202, …). Dans ce cas le bloc 710 stocke le ou les dictionnaires RVQ correspondants.
Ces blocs de quantification ne sont pas illustrés ici à la mais ils sont mis en œuvre dans le bloc 701.
L’intérêt des blocs 701 et 702 est d’adapter le vecteur latent z avant l’application de la transformée T du bloc 704. Pour cela, on cherche à supprimer une composante basée sur une moyenne de l’espace latent. Dans le cas a) cette composante est approximée comme étant fixe et aucune information supplémentaire comme un indice (m) ne doit être transmis. Le budget de bit utilisé par le bloc 701 est alors RM=0 bit.
Dans les cas b) et c), cette composante est enlevée de façon adaptative, et un indice m de quantification de 10 bits (cas b) ou 20 bits (exemple du cas c) est donné en sortie du bloc 701 vers le multiplexage dans le bloc 710. Dans cet exemple, le budget de bit utilisé par le bloc 701 est alors RM =10 ou RM=20, cela correspondant au budget de bits utilisé dans le ou les étages de quantification Q1 ou Q1/Q2.
Le bloc 703 effectue de façon optionnelle une mise à l’échelle de chacune des composantes du signal u représentant le vecteur latent modifié à l’issue de la soustraction de effectuée en 702. De façon préférentielle, on normalise chaque composante de u par son écart-type ; dans des variantes d’autres normalisations sont possibles. L’écart-type ( ) (ou en variante une autre valeur de normalisation) est préalablement calculé et stocké en mémoire en 711. On obtient ainsi un vecteur latent modifié et mis à l’échelle, c'est-à-dire prétraité z’. Dans des variantes, on pourra utiliser d’autres valeurs que l’écart-type de chaque composante de u.
Ensuite le bloc 704 effectue une transformée linéaire, par exemple de type PCA/KLT, le vecteur latent prétraité z’ est transformé par l’application d’une matrice de rotation U de taille DxD définie ci-dessous, pour obtenir un vecteur latent transformé y tel que :
y= trunc(U T .z’)
où trunc(.) désigne l’opération de troncature qui ne retient que les DT premières composantes. Dans le mode de réalisation privilégié on prend comme exemple DT=80 (à comparer avec D=128).
En général le bloc 704 ne requiert aucun budget de bits.
La matrice U est stockée dans le bloc 712.
Dans le mode de réalisation décrit ici, la matrice de rotation U peut être déterminée comme dans le premier mode de réalisation.
Dans un mode de réalisation, le codage dans le bloc 705 réalise une quantification du vecteur latent transformé y de dimension DTfixée par exemple à DT = 80.
Dans un exemple de réalisation, on pourra utiliser la quantification vectorielle algébrique (AVQ) de type gain-forme selon la méthode décrite dans :
S. Ragot, B. Bessette, and R. Lefebvre, "Low-Complexity Multi-Rate Lattice Vector Quantization with Application to Wideband TCX Speech Coding at 32 kbit/s," Proc. ICASSP, Montreal, Canada, Mai 2004.
Dans ce cas, le signal transformé y (ou vecteur latent transformé) est divisé en Nv sous-vecteurs successifs de dimension 8. Dans l’exemple avec une troncature en dimension DT= 80, on a Nv = 10 sous-vecteurs à coder.
Comme décrit dans l’article Ragot et al. précité, le signal y est mis à l’échelle par l’inverse (1/g) d’un gain global noté g qui peut être pré-estimé ou déterminé par dichotomie en maximisant le nombre de bits utilisé B tout en respectant la contrainte de budget B≤ (R-RM).
Le signal latent transformé et mis à l’échelle par le facteur 1/g, soit (1/g)*y, est codé donc par sous-vecteur. On obtient donc une série d’indices de quantification d’un nombre de bits variable (multiple de 4), et un code unaire représentant l’indice du quantificateur. Un exemple de mise en œuvre complète de cette quantification AVQ est donné dans le standard 3GPP AMR-WB+ (voir 3GPP TS 26.273 pour la version à virgule fixe ou TS 26.304 pour la version à virgule flottante) ; on ne détaille donc pas plus ici la réalisation de cette réalisation du bloc 705.
L’ensemble des données binaires issues de la quantification est multiplexé dans le bloc 705 pour former un train binaire b.
Les différentes informations binaires (m, b), telles que définies ci-dessus, sont multiplexées dans le bloc 720.
Dans des variantes, un codage entropique des indices m et b pourra être également mis en œuvre.
Dans des variantes, d’autres méthodes de quantification de l’espace latent transformé y sont possibles dans le bloc 705. On pourra par exemple utiliser une quantification pyramidale (PVQ) par sous-vecteur avec une allocation binaire fixe ou adaptative ; des exemples de mise en œuvre de PVQ sont donnés par exemple dans les codecs Opus ou dans le codec EVS. La mise en œuvre de la PVQ est similaire à ce qui est décrit précédemment pour la quantification AVQ. Le signal y est typiquement divisé en sous-vecteurs et normalisé par un gain global. On pourra prendre une allocation binaire fixe (prédéterminée) ou variable (comme dans le cas AVQ) pour quantifier chaque sous-vecteur par un quantificateur PVQ.
Dans un autre mode de réalisation, le signal y est déterminé comme décrit précédemment mais quantifié par RVQ selon le principe de codage de y dans le bloc 500 avec des dictionnaires C’k en dimension tronquée DT. Dans ce cas, une fois les blocs 701, 702, 703, 710, 711, 712 prédéterminés, les dictionnaires peuvent être déterminés par un apprentissage selon les principes de la quantification RVQ. Dans ce cas le train binaire b est constitué des sous-indices associés à chaque dictionnaire RVQ.
Dans des variantes, on pourra également prendre comme bloc 705 une quantification scalaire uniforme suivie d’un codage entropique.
Un exemple de mise en œuvre est donné par exemple dans l’article de Johannes Ballé, Valero Laparra, Eero P. Simoncelli, End-to-end Optimized Image Compression, Proc. ICLR 2017. Au lieu de quantifier l’espace latent d’un autoencodeur (ici d’un signal d’image), on prend ici le codage de l’espace latent transformé y. On applique à y quantification scalaire uniforme d’un pas prédéterminé puis on code les indices entiers de quantification par codage arithmétique.
Un avantage de l’invention est ici que le codage arithmétique peut exploiter la décomposition en valeurs propres associé à la détermination de la transformation (bloc 704). On ne retient que les DT premières valeurs puisque y est ici défini après troncature. Ainsi le modèle de probabilité pour le codage entropique se dérive facilement en supposant une distribution par exemple gaussienne ou laplacienne de y avec des variances données par composante respectivement par .
La décrit un deuxième mode de réalisation d’un dispositif de décodage selon l’invention ainsi qu’un deuxième mode de réalisation d’un procédé de décodage selon l’invention.
Cette figure montre en particulier un module de décodage (800) d’une représentation latente (ou espace latent) compris dans un décodeur de signal audio tel que décrit en référence à la (bloc 110). Ainsi, le bloc de décodage de l’espace latent (bloc 111) de la est remplacé par le module de décodage de l’espace latent (bloc 800) décrit à présent.
Le train binaire I reçu pour la trame courante est démultiplexé (bloc 801).
Dans le bloc 802, on obtient le vecteur de correction de la même façon qu’au codeur dans le bloc 701. Ce vecteur de correction issu du bloc 802 peut être :
a) une moyenne prédéterminée des variables latentes de l’espace latent ;
b) le vecteur latent décodé à l’issue d’un premier étage de quantification vectorielle inverse RVQ selon le bloc de décodage 301 de la pour un décodage avec K=1, ou
c) de façon plus générale, le vecteur latent décodé à l’issue d’un nombre prédéterminé d’étages RVQ de quantification vectorielle inverse d’un nombre prédéterminé plus grand que 1, par exemple K=2, selon par exemple le décodage des blocs 301 et 302 de la .
Dans les cas b) et c), le bloc 802 correspond alors respectivement à un ou plusieurs étages de décodage D1, D2,… , décrits pour la méthode EnCodec et représentés à la (blocs 301, 302, …). Ces blocs de quantification inverses ne sont pas représentés ici sur la .
Ces étages de décodage utilisent le budget de bits indiqué par l’indice de quantification m sur RM bits transmis dans le bitstream et décodé en 802.
Le bloc 803 de la figure 8 décode le vecteur latent transformé à partir du train binaire b. On ne décrit pas plus en détails cette étape de décodage, elle correspond au décodage en fonction de la mise en œuvre du bloc 705, avec comme exemple de variantes : AVQ, PVQ, RVQ, ou quantification scalaire avec codage entropique.
Pour remplacer les éléments tronqués et compléter les trames de l’espace latent transformé obtenu, des 0 peuvent être ajoutés à l’étape de transformation T du bloc 805. Dans une variante de réalisation, une injection de bruit, par exemple de type noise substitution connue de l’homme de métier, du bloc 804, pourra être prévu.
On applique ensuite, dans le bloc 805, une transformation linéaire, par exemple la transformation KLT/PCA inverse au vecteur latent transformé décodé.
La matrice de rotation U stockée en 712 et obtenue par apprentissage permet d’appliquer la transformée inverse selon l’équation :
représentant un vecteur latent décodé intermédiaire et ext(.) représentant l’opération d’extension de la dimension DT à la dimension D par ajout de (D-DT) zéros à la fin du vecteur. Ce vecteur est ensuite mis à l’échelle par composante (bloc 806), de la même façon que dans le bloc 703 de la figure 7, pour obtenir le vecteur .
Puis les vecteurs et sont combinés en 807 pour former le vecteur décodé de l’espace latent .
Celui-ci est ensuite fourni en entrée du module de synthèse par réseau de neurones (Syn.) 112 tel que décrit en référence à la figure 1, afin d’obtenir le signal audio décodé .
La illustre un exemple de mise en œuvre de réseaux de neurones utilisé dans l’invention, notamment les éléments de la partie analyse 101 et de synthèse 112. On illustre ici le cas d’EnCodec à titre d’exemple. L’architecture utilisée est très similaire et dérivée de celle du codec SoundStream – la différence principale entre les architectures d’EnCodec et de SoundStream tient au fait que les blocks « ResNetBlock » sont plus complexes dans SoundStream et que SoundStream contient en plus un couche spéciale appelée FiLM. Par contre, EnCodec contient une couche LSTM que SoundStream n’a pas.
La partie analyse du bloc 101 est composée de plusieurs couches successives :
- Convolution 1D (avec un filtre ou « kernel » de longueur 7) avec 32 canaux dans le bloc 901
- 4 blocs de convolution (902-904, 905-907, 908-910, 911-913) comprenant un bloc d’unités résiduelles (deux convolutions et une connexion « skip ») et une convolution avec décimation (« stride ») de 2, 4, 5 ou 8 et un filtre de longueur double du « stride »
- Couche LSTM divisée en 2 sous-couches dans les blocs 914-915
- Couche finale de convolution 1D dans le bloc 916
Les fonctions d’activation sont de type ELU (Exponential Linear Unit) qui est définie comme : f ( x ) = x si x ≥ 0 et a*(exp( x ) - 1) si x < 0, a est une valeur positive.
Les dimensions de tenseurs en entrée et sortie de chaque bloc sont détaillées à la pour la partie analyse. L’entrée du réseau de neurones d’analyse est un vecteur colonne de dimension L=320 (échantillons) ; cette dimension est écrite ici sous la forme [1, 1, 320]. Le bloc 900 utilise 32 canaux, ce qui donne une sortie de dimension [1, 32, 320]. Ensuite les blocs successifs viennent modifier les dimensions des tenseurs, avec un doublement du nombre de canaux à chaque fois (de 32 à 64, puis 128, 256 et 512) et une réduction de la dernière dimension par un facteur donné par le paramètre de pas (« stride ») qui est respectivement 2, 4, 5, 8. Les blocs 914 et 915 ne changent pas les dimensions des tenseurs. Le dernier bloc 916 réduit la dimension de [1, 512, 1] à uniquement [1, 128, 1], soit un vecteur latent de dimension D=128.
La partie synthèse du bloc 112 a une architecture « inversée » avec le même nombre de blocs :
- Couche initiale de convolution 1D dans le bloc 921
- Couche LSTM divisée en 2 sous-couches dans les blocs 922-923
- 4 blocs de convolution transposée (924-926, 927-929, 930-932, 933-935) comprenant une convolution transposée, un bloc d’unités résiduelles et une activation ELU
- Convolution 1D dans le bloc 936
Les dimensions de tenseurs en entrée et sortie de chaque bloc sont détaillées à la pour la partie synthèse. En partant d’un vecteur latent de dimension D=128 notée sous la forme tensorielle [1, 128, 1], on retrouve finalement un vecteur audio de dimension L=320 notée sous la forme tensorielle [1, 1, 320].
On a illustré sur la , un dispositif de codage DCOD et un dispositif de décodage DDEC, au sens de l’invention, ces dispositifs étant duals l’un de l’autre (dans le sens de « réversibles ») et reliés l’un à l’autre par un réseau de communication RES.
Le dispositif de codage DCOD comporte un circuit de traitement incluant typiquement :
- une mémoire MEM1 pour stocker des données d’instructions d’un programme informatique au sens de l’invention (ces instructions pouvant être réparties entre le codeur DCOD et le décodeur DDEC) ainsi que des données calculées lors d’une phase d’apprentissage ;
- une interface INT1 de réception d’un signal audio d’origine x ;
- un processeur PROC1 pour recevoir ce signal et le traiter en exécutant les instructions de programme informatique que stocke la mémoire MEM1, en vue de son codage ; en particulier, le processeur étant apte à piloter un module d’analyse à base de réseau de neurones et un module de quantification d’une représentation latente tel que décrit en référence aux figures 5 et 7; et
- une interface de communication COM 1 pour transmettre les signaux codés via le réseau.
Le dispositif de décodage DDEC comporte un circuit de traitement propre, incluant typiquement :
- une mémoire MEM2 pour stocker des données d’instructions d’un programme informatique au sens de l’invention (ces instructions pouvant être réparties entre le codeur DCOD et le décodeur DDEC comme indiqué précédemment) ainsi que des données calculées lors d’une phase d’apprentissage ;
- une interface COM2 pour recevoir du réseau RES les signaux codés en vue de leur décodage en compression au sens de l’invention ;
- un processeur PROC2 pour traiter ces signaux en exécutant les instructions de programme informatique que stocke la mémoire MEM2, en vue de leur décodage ; en particulier, le processeur étant apte à piloter un module de décodage d’un espace latent tel que décrit en référence aux figures 6 et 8 et un module de synthèse à base de réseau de neurones ; et
- une interface de sortie INT2 pour délivrer le signal audio décodé .
Bien entendu, cette illustre un exemple d’une réalisation structurelle d’un codec (codeur ou décodeur) au sens de l’invention. Les figures 4 à 10 commentées ci-dessus décrivent en détails des réalisations fonctionnelles de ces codecs.