[Apprentissage de la programmation vidéo et audio] Solution d'accélération audio open source Comparaison Sonic, SoundTouch et analyse expérimentale du traitement audio en temps réel

Le changement de vitesse de parole et le changement de hauteur signifient que la hauteur et la sémantique restent inchangées et que la vitesse de la parole devient plus rapide ou plus lente. Ce processus se manifeste lorsque le spectrogramme se comprime ou se dilate comme un accordéon sur l'axe du temps. C'est-à-dire que la valeur de fréquence fondamentale est presque inchangée, correspondant à la même hauteur ; tout le cours du temps est compressé ou étendu, et le nombre de cycles glottiques est réduit ou augmenté, c'est-à-dire que la vitesse de mouvement des voies vocales change, et le débit de parole change également en conséquence.

Après une enquête préliminaire, il existe deux solutions qui peuvent réaliser la fonction de vitesse variable et de réglage constant : sonic, sountTouch, qui sont tous deux utilisés pour traiter les fichiers audio pcm, prennent en charge le format wav et conviennent au décodage du traitement des données pcm.

Option 1 : sonique

  1. La taille du fichier après traitement est inversement proportionnelle à la valeur de double vitesse.
  2. L'unité de traitement sonique est une trame, et certaines données peuvent être perdues, ce qui est supposé être causé par l'algorithme.
  3. L'introduction est relativement simple, la fonction principale est écrite en langage c, il suffit d'importer un fichier c et un fichier d'en-tête .h à utiliser.
  4. La qualité sonore après accélération est moins bonne que soundTouch.

Sonic traite les flux audio en temps réel

Sonic définit un flux, créez d'abord un flux, entrez le taux d'échantillonnage et le nombre de canaux. Réglez ensuite les paramètres pertinents du débit (vitesse, pas, débit). Si vous souhaitez traiter le flux audio en temps réel, utilisez les sonicWriteToStream()deux sonicReadShortFromStream()fonctions d'entrée et de sortie.

question:

  1. Pour le problème de perte de qualité sonore, grâce à des expériences, on peut constater que les données d'origine de 2048 octets devraient être des données de 1024 octets après avoir été accélérées de 2 fois, mais la sortie réelle peut être de 480, voire 1380, et les données n'est pas égal.

référence:

  1. Analyse du code source sonique

Solution 2 : Sound Touch

  1. La taille du fichier traité est inversement proportionnelle à la valeur de la vitesse.
  2. Peut gérer des données audio en temps réel mais le délai d'entrée/sortie est d'environ 100 ms ;
  3. L'importation est plus compliquée que Sonic et nécessite d'importer des bibliothèques à utiliser.
  4. Il n'y a pratiquement aucune perte de qualité sonore après l'accélération, et l'effet de l'ouïe est meilleur que celui du son.

SoundTouch traite les flux audio en temps réel

Le traitement audio de ST est la fonction d'entrée putSamples() et la fonction de sortie receiveSamples(). L'idée de traiter le flux audio en temps réel est de lire le segment de données audio de manière cyclique, de le mettre dans ST pour la sortie et de sortir le segment de données traité pour la lecture.

Les données mises en mémoire tampon dans soundTouch doivent être traitées avant de pouvoir être retirées. La durée des différents sequence_ms et overLap_ms est incohérente, mais il convient de noter que les données entrant dans soundTouch pour la première fois auront un jugement, et une partie des données seront interceptées dans TDStretch.

SoundTouch : fonctionnalité : capable de traiter le flux audio en temps réel :

  • latence d'entrée/sortie max. ~ 100 ms.
  • Le traitement du son stéréo 44,1 kHz/16 bits en temps réel nécessite un processeur Intel Pentium 400 Mhz ou supérieur.

Comment utiliser SoundTouch pour le traitement audio en temps réel ?

Créez une fonction de traitement qui est appelée par le système en temps réel une fois que les échantillons d'entrée en temps réel sont disponibles, de sorte que cette fonction place les échantillons d'entrée en temps réel dans le pipeline SoundTouch avec l'appel de fonction ' putSamples ' et utilise la fonction ' receiveSamples ' pour extraire les échantillons de sortie résultants pour le traitement de sortie en temps réel .

question:

  1. Le problème important est qu'il n'est pas possible de récupérer des paquets à chaque fois à l'intervalle de récupération des paquets. Il existe un certain tampon et ses données audio accélérées sont discontinues, telles que : 0, 2048, 0, 2048, 0 ... Dans ce cas, la correspondance un à un peut ne pas être obtenue lors de la récupération accélérée des données.
  2. Lorsque le taux d'échantillonnage de soundTouch est modifié à la moitié de l'audio d'entrée, la discontinuité disparaît et les données extraites à chaque fois sont présentées comme suit : 1024, 1024, 1024, 1024, 1024, ... et la tonalité reste inchangée.
  3. L'accélération de quelques images courtes peut nécessiter un lissage pour avoir un meilleur effet.

réf :

  1. Bibliothèque de traitement du son SoundTouch (surina.net)

  2. owoudenberg/soundtouch.net : la bibliothèque SoundTouch a été écrite à l'origine par Olli Parviainen en C++. Bien qu'une bibliothèque wrapper .NET soit disponible, cette bibliothèque vise à être une réécriture complète en C#. (github.com)

  3. Site officiel de Sound Touch

penser:

  1. S'il est possible de juger de la gigue et du retard, si l'accélération audio est utilisée lorsque le retard de gigue est relativement important, elle ne sera pas utilisée dans d'autres cas.
  2. Est-il possible que soundTouch règle la moitié du taux d'échantillonnage ? Des tests supplémentaires sont nécessaires.
  3. Avez-vous besoin de trouver d'autres solutions réalisables, car la correspondance biunivoque doit être un indicateur rigide

Comment confirmer que les données saisies et les données retirées sont bien les données correspondantes ?

  • Mettez des données vides pour accélérer en comptant, obtenez l'audio accéléré à la valeur de comptage actuelle et écrivez-le dans le fichier en même temps, observez si l'audio dans le fichier est vide (exprimé en silence)

  • résultat:

    • Après les tests, la taille du sonique après chaque accélération est incohérente et les données accélérées ne peuvent pas correspondre aux données d'origine lorsque les données sont incohérentes.
      • La taille des données de soundtouch après chaque accélération est stable, mais il y a un intervalle. Après observation et test, l'intervalle est d'un paquet. Grâce aux ajustements correspondants, les données de soundTouch correspondent, mais il y a un problème que la position avant et après l'audio accéléré n'est pas fusionnée, et comment résoudre le problème de bruit causé par celui-ci.
  • Note:

    Pour ajuster les paramètres de SoundTouch, vous pouvez trouver les éléments de réglage dans le fichier d'en-tête SoundTouch.h de soundtouch.Certains paramètres de soundTouch sont également analysés et décrits sur le site officiel. Étant donné que vous n'avez besoin d'utiliser TimeStretch que pour modifier le tempo, vous pouvez modifier sequence_ms, seekWindow_ms et overLap_ms en fonction de vos besoins pour atteindre vos propres besoins. TimeStretch lui-même possède également certains paramètres qui peuvent être modifiés pour obtenir une précision de point d'échantillonnage.

Quel est le signe que la mise en mémoire tampon est terminée ?

  • Si les données accélérées ne sont pas vides, cela signifie que la mise en mémoire tampon est terminée et que les données peuvent être récupérées.

Remplir:

Algorithme de réglage constant à vitesse variable :

méthode du domaine temporel méthode du domaine fréquentiel méthode paramétrique
Coupure LSEE-MSTFMC vocodeur de phase
SOLA、SOLA-FS modèle sinusoïdal
TD-PSOLA
WSOLA

Afin de réduire le problème de rupture de hauteur et de discontinuité de phase, Verhelst et Roelands ont proposé la méthode de superposition de similarité de forme d'onde ( WSOLA ), qui nécessite moins de calculs que PSOLA , et en même temps la qualité de la voix de sortie est élevée. Grofit a amélioré cette méthode afin qu'elle soit également adaptée au traitement à vitesse variable des signaux musicaux.

SoundTouch utilise l'algorithme WSOLA

en conclusion:

En raison du problème des données inégales dans Sonic, il ne convient pas aux scénarios d'accélération en temps réel. Considérant que soundTouch effectuera un algorithme de superposition de similarité de forme d'onde sur toutes les images du tampon, la tête des données récupérées sera superposée en référence à la queue des données précédentes, donc dans Pitch, des ruptures se produisent lorsque l'audio normal et l'audio accéléré sont entrelacés. Ainsi, trois dispositifs ont été mis en place comme suit :

  1. Placez uniquement l'image audio à accélérer dans le soundTouch et placez-la dans la file d'attente de lecture avec l'audio normal après l'avoir retirée, de sorte que la hauteur se cassera

  2. Mettez tout l'audio dans soundTouch et accélérez-le, et ne retirez que les données requises, mais il y a toujours un phénomène de rupture de hauteur, car les données requises se réfèrent à la fusion de l'audio accéléré, et le fichier original est écrit, donc il est encore nécessaire d'utiliser le traitement de lissage avec.

  3. Mettez tout l'audio dans soundTouch pour l'accélération requise, réglez le tempo inutile sur 1, et le phénomène de rupture de hauteur disparaîtra, mais la qualité sonore peut être réduite en raison d'une modification fréquente du tempo.

Diagramme de forme d'onde du schéma 1 :

Veuillez ajouter une description de l'image

Fréquence du spectre de l'option 1 : (la barre verticale évidente sur l'image est l'endroit où la hauteur se brise)

Veuillez ajouter une description de l'image

Diagramme de forme d'onde du schéma 2 :

Veuillez ajouter une description de l'image

Fréquence du spectre du scénario 2 :

Veuillez ajouter une description de l'image

Diagramme de forme d'onde du schéma 3 :

Veuillez ajouter une description de l'image

Fréquence du spectre du scénario 3 :

Veuillez ajouter une description de l'image

Remplir:

Soundtouch utilise TDStretch pour changer la vitesse. Dans TDStretch, vous pouvez voir qu'il y aura un jugement lors de l'initialisation, et la dernière partie des données entrées dans soundtouch pour la première fois (la quantité spécifique dépend du tempo défini et d'autres paramètres) comme midBuffer, donc le premier Le nombre de points d'échantillonnage en sortie pendant une entrée n'est pas égal au nombre attendu de points d'échantillonnage en sortie, donc midBuffer est utilisé comme première moitié de la sortie suivante et ainsi de suite. Après avoir modifié des paramètres tels que sequence_ms, seekwindow_ms , et chevauchement_ms, la taille de midBuffer ne peut être que réduite. Petit, ne peut toujours pas faire tout ce que vous mettez et prenez.

La façon de penser à changer le tempo est de faire passer tout l'audio via soundTouch, de régler le tempo sur 1 pour l'audio normal et sur 2 pour l'audio accéléré. Lors de la sortie, parce que 1024 points d'échantillonnage ont été mis au début, 512 points d'échantillonnage devaient être retirés, mais seulement 320 points d'échantillonnage ont été retirés, donc 192 points d'échantillonnage sont toujours dans le cache accéléré pour être retirés la prochaine fois ( et sera superposé avec la prochaine tranche de données d'entrée par l'algorithme de similarité de forme d'onde), s'il s'agit d'un son normal au début, alors 192 points d'échantillonnage seront manquants à la fin de l'audio normal après soundTouch, et 192 points d'échantillonnage seront manquants en tête des points d'échantillonnage audio accélérés, car la continuité entre les données est maintenue, il n'y aura donc pas de rupture de hauteur. Cependant, il n'y a pas de correspondance univoque entre les données introduites et les données extraites en même temps, il est impossible d'insérer et de retirer à tout moment, et ne peut assurer la continuité des données qu'avant et après .

Je suppose que tu aimes

Origine blog.csdn.net/Daibvly/article/details/121284226
conseillé
Classement