
Il s'agit d'une continuation du
premier article sur LPCNet . Dans la première démo, nous avons présenté une
architecture qui combine le traitement du signal et l'apprentissage en profondeur pour améliorer l'efficacité de la synthèse vocale neuronale. Cette fois, nous transformerons LPCNet en un codec de parole neuronal avec un très faible débit binaire (voir l'
article scientifique ). Il peut être utilisé sur les équipements actuels et même sur les téléphones.
Pour la première fois, un vocodeur neuronal fonctionne en temps réel sur un cœur de processeur du téléphone, et non sur un GPU haute vitesse. Le débit binaire final de 1600 bps est environ dix fois inférieur à celui des codecs à large bande ordinaires. La qualité est bien meilleure que les vocoders existants avec un débit binaire très faible et comparable aux codecs plus traditionnels qui utilisent un débit binaire plus élevé.
Encodeurs et vocodeurs de forme d'onde
Il existe deux grands types de codecs vocaux: les codeurs de forme d'onde et les vocodeurs. Les encodeurs de forme d'onde incluent Opus, AMR / AMR-WB et tous les codecs pouvant être utilisés pour la musique. Ils essaient de fournir une forme d'onde décodée aussi proche que possible de l'original - en tenant généralement compte de certaines caractéristiques perceptuelles. Les Vocoders, en revanche, sont en fait des synthétiseurs. Le codeur extrait des informations sur la hauteur et la forme du chemin de parole, transmet ces informations au décodeur et il synthétise de nouveau la parole. C'est presque comme la reconnaissance vocale suivie de la lecture de texte dans un synthétiseur vocal, sauf que l'encodeur de texte est beaucoup plus simple / plus rapide que la reconnaissance vocale (et transmet un peu plus d'informations).
Les vocodeurs existent depuis les années 70, mais comme leurs décodeurs effectuent la synthèse vocale, ils ne peuvent pas être bien meilleurs que les systèmes de synthèse vocale conventionnels, qui jusqu'à récemment semblaient tout simplement horribles. C'est pourquoi les vocodeurs étaient généralement utilisés à des vitesses inférieures à 3 kB / s. De plus, les encodeurs de signaux fournissent simplement la meilleure qualité. Cela s'est poursuivi jusqu'à récemment, lorsque des systèmes de synthèse vocale neuronale tels que
WaveNet sont apparus . Soudain, la synthèse a commencé à sonner beaucoup mieux et, bien sûr, il y avait des gens qui voulaient
faire un vocodeur à partir de WaveNet .
Présentation de LPCNet
WaveNet produit une parole de très haute qualité, mais nécessite des centaines de gigaflops de puissance de calcul. LPCNet a considérablement réduit la complexité de calcul. Le vocodeur est basé sur WaveRNN, qui améliore WaveNet en utilisant un réseau neuronal récurrent (RNN) et des matrices clairsemées. LPCNet améliore encore WaveRNN avec
la prédiction linéaire (LPC), qui fonctionnait bien dans les vocodeurs plus anciens. Il prédit un échantillon à partir d'une combinaison linéaire d'échantillons précédents et, surtout, le rend beaucoup plus rapide qu'un réseau de neurones. Bien sûr, ce n'est pas universel (sinon les vocoders des années 70 sonneraient bien), mais cela peut sérieusement réduire la charge sur le réseau neuronal. Cela vous permet d'utiliser un réseau plus petit que WaveRNN sans sacrifier la qualité.
Examinons de plus près LPCNet. La partie jaune à gauche est calculée une fois par trame et sa sortie est utilisée pour la fréquence d'échantillonnage du réseau à droite (bleu). L'unité de calcul prédit un échantillon au temps t sur la base des échantillons précédents et des coefficients de prédiction linéaireCaractéristiques de compression
LPCNet synthétise la parole à partir de vecteurs de 20 caractères par trame pendant 10 ms. Parmi ceux-ci, 18 signes sont
des coefficients
cepstraux représentant la forme du spectre. Les deux autres décrivent la hauteur: un paramètre pour le pas de pitch (période de pitch), et l'autre pour la
force (la corrélation du signal avec lui-même, si vous introduisez un retard par le pitch). Si vous stockez les paramètres sous forme de valeurs à virgule flottante, toutes ces informations prennent jusqu'à 64 kbit / s pendant le stockage ou la transmission. C'est trop, car même le codec Opus fournit un codage vocal de très haute qualité à seulement 16 kbit / s (pour 16 kHz mono). De toute évidence, vous devez appliquer une forte compression ici.
La hauteur
Tous les codecs dépendent fortement de la hauteur tonale, mais contrairement aux encodeurs de forme d'onde, où la hauteur juste "aide à réduire la redondance, les vocodeurs n'ont pas de repli. Si vous choisissez la mauvaise hauteur, ils commenceront à générer un discours de mauvaise qualité (voire illisible). Sans entrer dans les détails (voir l'article scientifique), l'encodeur LPCNet peine à ne pas se tromper de hauteur. La recherche commence par une recherche de
corrélations temporelles dans un signal vocal. Voir ci-dessous comment fonctionne une recherche typique.
Le pitch est la période pendant laquelle le pitch est répété. L'animation recherche le pas qui correspond à la corrélation maximale entre le signal x (n) et sa copie x (nT) avec un retard. La valeur T avec une corrélation maximale est un pas de hauteurCes informations doivent être codées avec le moins de bits possible sans trop dégrader le résultat. Puisque nous percevons la fréquence par nature sur une échelle logarithmique (par exemple, chaque octave musicale double la fréquence précédente), cela a du sens dans le codage logarithmique. La hauteur du signal de parole chez la plupart des gens (nous n'essayons pas de couvrir la soprano ici) se situe entre 62,5 et 500 Hz. Avec sept bits (128 valeurs possibles), nous obtenons une résolution d'environ un quart de ton (la différence entre et avant et re est d'un ton).
Alors, avec la hauteur finie? Enfin, pas si vite. Les gens ne parlent pas comme des robots des films des années 60. La hauteur de la voix peut varier même dans un paquet de 40 millisecondes. Vous devez en tenir compte, en laissant les bits pour le paramètre de modification de la hauteur: 3 bits pour coder la différence jusqu'à 2,5 demi-tons entre le début et la fin du paquet. Enfin, vous devez coder la corrélation des pas de hauteur, en distinguant les voyelles et les consonnes (par exemple, s et f). Deux bits suffisent pour la corrélation.
Cepstrum
Alors que la hauteur contient les caractéristiques externes de la parole (prosodie, émotion, accentuation, ...), la caractéristique spectrale détermine
ce qui a été dit (sauf pour les langues tonales comme le chinois, où la hauteur est importante pour le sens). Les cordes vocales produisent approximativement le même son pour n'importe quelle voyelle, mais la forme du tractus vocal détermine le son qui sera prononcé. Le chemin vocal agit comme un filtre et la tâche du codeur est d'évaluer ce filtre et de le transmettre au décodeur. Cela peut être fait efficacement si vous convertissez le spectre en un
cepstre (oui, c'est un «spectre» avec un ordre de lettres modifié, ce sont nous des gars drôles dans le traitement du signal numérique).
Pour un signal d'entrée à 16 kHz, le cepstre représente essentiellement un vecteur de 18 nombres toutes les 10 ms, qui doivent être compressés autant que possible. Étant donné que nous avons quatre de ces vecteurs dans un paquet de 40 ms et qu'ils sont généralement similaires les uns aux autres, nous voulons éliminer autant que possible la redondance. Cela peut être fait en utilisant des vecteurs voisins comme prédicteurs et en ne transmettant que la différence entre la prédiction et la valeur réelle. Dans le même temps, nous ne voulons pas trop dépendre des packages précédents si l'un d'eux disparaît. Il semble que le problème soit déjà résolu ...
Si vous n'avez qu'un marteau, tout ressemble à un clou - Abraham Maslow.Si vous avez beaucoup
travaillé avec les codecs vidéo , vous êtes probablement tombé sur le concept des images B. Contrairement aux codecs vidéo, qui divisent une trame en plusieurs paquets, nous avons au contraire plusieurs trames dans un seul paquet. Nous commençons par coder l'
image clé , c'est-à-dire le vecteur indépendant et la
fin du paquet. Ce vecteur est codé sans prédiction, occupant 37 bits: 7 pour l'énergie totale (premier coefficient cepstral) et 30 bits pour d'autres paramètres utilisant la
quantification vectorielle (VQ). Viennent ensuite les trames B (hiérarchiques). Des deux mots clés (un du package actuel et un du précédent), un cepstre entre eux est prévu. En tant que prédicteur pour coder la différence entre la valeur réelle et la prédiction, vous pouvez choisir entre deux images clés ou leur valeur moyenne. Nous utilisons à nouveau VQ et codons ce vecteur en utilisant un total de 13 bits, y compris le choix du prédicteur. Il ne nous reste plus que deux vecteurs et très peu de bits. Utilisez les 3 derniers bits pour sélectionner simplement le prédicteur pour les vecteurs restants. Bien sûr, tout cela est beaucoup plus facile à comprendre dans la figure:
Prédiction et quantification Cepstrum pour le package k. Les vecteurs verts sont quantifiés indépendamment, les vecteurs bleus sont prédits et les vecteurs rouges utilisent la prédiction sans quantification résiduelle. La prédiction est indiquée par des flèches.Tout mettre ensemble
En ajoutant tout cela, nous obtenons 64 bits par paquet de 40 millisecondes ou 1600 bits par seconde. Si vous voulez calculer le taux de compression, alors la parole à large bande non compressée est de 256 kbps (16 kHz à 16 bits par échantillon), ce qui signifie un taux de compression de 160 fois! Bien sûr, vous pouvez toujours jouer avec des quantificateurs et obtenir un débit binaire inférieur ou supérieur (avec un effet correspondant sur la qualité), mais vous devez commencer quelque part. Voici un tableau avec la disposition où vont ces bits.
Allocation de bits |
Paramètre | Bit |
Pitch pitch | 6 |
Modulation de hauteur | 3 |
Corrélation d'altitude | 2 |
Énergie | 7 |
Cepstrum VQ indépendant (40 ms) | 30 |
Cepstrum VQ prévu (20 ms) | 13 |
Interpolation Cepstrum (10 ms) | 3 |
Total | 64 |
À 64 bits par paquet 40 ms, à 25 paquets par seconde, 1600 bps sont obtenus.
Implémentation
Le code source de LPCNet est disponible sous la licence BSD. Il comprend une bibliothèque qui simplifie l'utilisation du codec. Veuillez noter que le développement n'est pas terminé: le format et l'API sont
appelés à changer. Le référentiel dispose également d'une application de démonstration
lpcnet_demo
dans laquelle il est facile de tester le codec à partir de la ligne de commande. Consultez le fichier README.md pour des instructions complètes.
Qui veut creuser plus profondément, il y a une option pour former de nouveaux modèles et / ou utiliser LPCNet comme bloc de construction pour d'autres applications, telles que la synthèse vocale (LPCNet n'est qu'un composant du synthétiseur, il n'effectue pas de synthèse seul).
Performances
La synthèse de la parole neuronale nécessite beaucoup de ressources. Lors de la conférence ICASSP de l'année dernière, Bastian Klein et ses collègues de Google / DeepMind ont présenté
un codec de 2400 bps basé sur WaveNet , recevant un flux binaire du codec2. Bien que cela semble incroyable, la complexité de calcul de centaines de gigaflops signifie qu'il ne peut pas être lancé en temps réel sans un GPU coûteux et un effort sérieux.
Au contraire, notre codec 1600 bit / s ne produit que 3 gigaflops et est conçu pour fonctionner en temps réel sur des équipements beaucoup plus abordables. En fait, il peut être utilisé aujourd'hui dans des applications réelles. L'optimisation a nécessité l'écriture de code pour les jeux d'instructions AVX2 / FMA et Neon (code intégré uniquement, sans assembleur). Grâce à cela, nous pouvons désormais encoder (et surtout décoder) la parole en temps réel non seulement sur un PC, mais aussi sur des téléphones plus ou moins modernes. Vous trouverez ci-dessous les performances des processeurs x86 et ARM.
Performances |
CPU | La fréquence | % d'un noyau | En temps réel |
AMD 2990WX (Threadripper) | 3,0 GHz * | 14% | 7.0x |
Intel Xeon E5-2640 v4 (Broadwell) | 2,4 GHz * | 20% | 5,0x |
Snapdragon 855 (Cortex-A76 sur Galaxy S10 ) | 2,82 GHz | 31% | 3.2x |
Snapdragon 845 (Cortex-A75 sur Pixel 3 ) | 2,5 GHz | 68% | 1,47x |
AMD A1100 (Cortex-A57) | 1,7 GHz | 102% | 0,98x |
BCM2837 (Cortex-A53 sur Raspberry Pi 3) | 1,2 GHz | 310% | 0,32x |
* mode turbo | | | |
Les chiffres sont assez intéressants. Bien que seuls Broadwell et Threadripper soient affichés, sur la plate-forme x86, les processeurs Haswell et Skylake ont des performances similaires (en tenant compte de la fréquence d'horloge). Cependant, les processeurs ARM sont sensiblement différents les uns des autres. Même en tenant compte de la différence de fréquence A76 est cinq à six fois plus rapide que A53: c'est très attendu, car A53 est principalement utilisé pour l'efficacité énergétique (par exemple, dans les grands systèmes PETITS). Néanmoins, LPCNet peut très bien fonctionner en temps réel sur un téléphone moderne, en utilisant un seul cœur. Bien qu'il serait bien de l'exécuter en temps réel sur le Raspberry Pi 3. Maintenant, c'est loin, mais rien n'est impossible.
Sur x86, la raison de la limitation des performances est cinq fois le maximum théorique. Comme vous le savez, les opérations de multiplication matrice-vecteur sont moins efficaces que les opérations matrice-matrice car il y a plus de téléchargements par opération - en particulier, un téléchargement de matrice pour chaque opération FMA. D'une part, les performances sont liées au cache L2, qui ne fournit que 16 bits par cycle. D'un autre côté, Intel prétend que L2 peut donner jusqu'à 32 bits par cycle sur Broadwell et 64 bits par cycle sur Skylake.
Résultats
Nous avons effectué des tests audio de style MUSHRA pour comparer la qualité du codage. Conditions d'essai:
- Échantillon : original (si vous obtenez un meilleur résultat que l'original, il y a clairement un problème avec votre test)
- LPCNet 1600 bps : notre démo
- LPNet non compressé : "LPNet avec 122 unités équivalentes" du premier article
- Opus 9000 bps large bande : le débit binaire le plus bas auquel l'Opus 1.3 code pour l'audio à large bande
- MELP à 2400 bps : un vocodeur bien connu avec un faible débit binaire (similaire en qualité au codec2)
- Speex 4000 bps : ce vocodeur à large bande ne doit jamais être utilisé, mais c'est une bonne référence pour le bas
Dans le premier test (set 1), nous avons huit fragments de discours de déclarations de deux hommes et deux femmes. Les fichiers du premier ensemble appartiennent à la même base de données (c'est-à-dire aux mêmes conditions d'enregistrement) qui a été utilisée pour la formation, mais ces personnes spécifiques ont été exclues de l'ensemble de formation. Dans le deuxième test (set 2), nous avons utilisé certains fichiers du test Opus (non compressés), enregistrant le son dans différentes conditions, pour nous assurer que LPCNet passe à une généralisation. Dans les deux tests, 100 participants chacun, donc les erreurs sont assez faibles. Voir les résultats ci-dessous.
Qualité subjective (MUSHRA) en deux testsEn général, LPCNet à 1600 bps semble bon - beaucoup mieux que MELP à 2400 bps, et pas loin derrière Opus à 9000 bps. Dans le même temps, LPCNet non compressé est légèrement meilleure en qualité que Opus à 9000 bps. Cela signifie qu'il est possible de fournir une meilleure qualité que l'Opus à des débits binaires de l'ordre de 2000 à 6 000 bps.
Écoutez-vous
Voici des exemples du test audio:
Femme (set 1)
Homme (set 1)
Mixte (set 2)
Où cela peut-il être utilisé?
Nous pensons qu'il s'agit d'une technologie intéressante en soi, mais elle a également des applications pratiques. Voici quelques options.
VoIP dans les pays mal connectés
Tout le monde n'a pas toujours une connexion haut débit. Dans certains pays, la communication est très lente et peu fiable. Un codec vocal de 1600 bits fonctionne normalement dans de telles conditions, transmettant même plusieurs fois les paquets pour plus de fiabilité. Bien sûr, en raison de la surcharge des en-têtes de paquets (40 octets pour IP + UDP + RTP), il est préférable de créer des paquets plus gros: 40, 80 ou 120 ms.
Radio amateur / HF
Depuis dix ans maintenant,
David Rowe travaille sur le codage de la parole pour les communications radio. Il a développé
Codec2 , qui transmet la voix à des vitesses de 700 à 3200 bps. Au cours de la dernière année, David et moi avons discuté de la façon d'améliorer Codec2 à l'aide de la synthèse neuronale, et maintenant nous le faisons enfin. Dans son blog, David a
écrit sur sa propre implémentation du codec basé sur
LPCNet pour l'intégration avec
FreeDV .
Fiabilité accrue en cas de perte de paquets
La capacité de coder un train de bits de qualité décente dans un petit nombre de bits est utile pour fournir une redondance sur un canal peu fiable. Opus a un mécanisme de correction d'erreur directe (FEC) appelé LBRR, qui code une trame précédente avec un débit binaire inférieur et l'envoie dans la trame actuelle. Cela fonctionne bien, mais ajoute des frais généraux importants. La duplication de flux à 1600 bit / s est beaucoup plus efficace.
Plans
Il existe de nombreuses autres possibilités pour utiliser LPCNet. Par exemple, l'amélioration des codecs existants (le même Opus). Comme dans d'autres codecs, la qualité d'Opus se dégrade assez rapidement à des débits très faibles (inférieurs à 8000 bps), car le codec de forme d'onde n'a pas suffisamment de bits pour correspondre à l'original. Mais les informations de prédiction linéaire transmises sont suffisantes pour que LPCNet synthétise une parole au son correct - mieux qu'Opus ne peut le faire à ce débit binaire. De plus, le reste des informations transmises par Opus (prévisions résiduelles) aide LPCNet à synthétiser un résultat encore meilleur. Dans un sens, LPCNet peut être utilisé comme un post-filtre sophistiqué pour améliorer la qualité d'Opus (ou de tout autre codec) sans changer le flux binaire (c'est-à-dire tout en conservant une compatibilité totale).
Ressources supplémentaires
- J.-M. Valin, J. Skoglund, vocodeur neuronal à large bande de 1,6 Kbps utilisant LPCNet , envoyé à Interspeech 2019 , arXiv: 1903.12087 .
- J.-M. Valin, J. Skoglund, LPCNet: Advanced Neural Speech Synthesis Through Linear Prediction , Proc. ICASSP, 2019 , arXiv: 1810.11846 .
- A. van den Oord, S.Dileman, H. Zen, K.Simonyan, O.Vinyals, A. Graves, N.Kalkhbrenner, E. Senor, K.Kavukuglu, WaveNet: modèle génératif pour le son non traité , 2016.
- N. Karlhbrenner, E. Elsen, C.Simonyan, S.Nouri, N.Casagrande, E. Lockhart, F.Stimberg, A. van den Oord, S.Dileman, K.Kavukuglu, Synthèse efficace du son neuronal , 2018.
- V.B.Klein, F.S.K.Lim, A.Lyubs, J.Skoglund, F.Stimberg, K.Wang, T.S.Walters, Codage de la parole à faible débit basé sur Wavenet , 2018
- Le code source de LPCNet.
- Codec pour FreeDV basé sur LPCNet par David Rowe.
- Rejoignez la discussion sur le développement sur #opus sur irc.freenode.net (→ interface web )