Ralentir la lecture de musique tout en maintenant la fréquence

10

La lecture d'un morceau de musique audio à une vitesse plus lente réduirait sa hauteur (fréquence). Existe-t-il un outil et une théorie pour ralentir la lecture du morceau tout en conservant la même fréquence? Je suppose que l'on peut faire une transformée de Fourier fenêtrée ou une transformée en ondelettes. Il semble que l'on doive soit présélectionner la taille de la fenêtre, soit choisir dynamiquement la base d'ondelettes. Existe-t-il une théorie et une application spécifiques et détaillées pour ce faire?

Hans
la source
1
En plus de la réponse fournie ci-dessous, veuillez consulter ce lien pour plus d'informations.
A_A

Réponses:

5

Oui, certains d'entre nous peuvent le faire, vous pouvez accélérer ou ralentir sans affecter le pitch, certains gars appellent ces applications de Time Stretch, il existe différentes façons de le faire, vous pouvez le faire dans le domaine fréquentiel ou temporel, vous devrez choisir ce qui vous convient le mieux, vous trouverez quelques avantages et inconvénients de chacun.

Dans le domaine temporel:

Dans Time Domain, vous pouvez essayer certaines techniques comme:

  • TDHS (Time domaine Harmonic Sacaling)
  • SOLA (ajout de chevauchement synchrone)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (Ajout de chevauchement de similarité de forme d'onde)

Avantages: est rapide, certains algorithmes sont faciles à comprendre, de bonne qualité dans les sons monophoniques.

Inconvénients: en général, vous aurez besoin d'une très belle piste de pitch pour épisser dans la bonne position, c'est difficile à faire :-(, donc si votre piste de pitch échoue ou ne fonctionne pas dans les sons poliphoniques, ces algorithmes donneront beaucoup de problèmes / artefacts dans le son de sortie.

Domaine de fréquence:

Tous les étirements temporels que je connais dans le domaine des fréquences sont basés sur des techniques de vocodeur de phase .

Avantages: Fonctionne avec des sons polyphoniques ou monophoniques.

Inconvénients: peut être douloureux de comprendre tous les calculs, la mise en œuvre est un peu difficile, n'est pas aussi rapide que les codes de domaine temporel, pour la voix, je préfère les résultats dans le domaine temporel, certaines astuces pour améliorer le résultat du vocodeur de phase standard ne sont pas partagées.

Je peux dire que la fenêtre et la taille du saut sont l'une des clés de la qualité du vocodeur de phase, généralement nous choisissons le 4xchevauchement pour la resynthèse, une fenêtre hann de taille 4096suffit pour mes oreilles (bien sûr si vous avez une puissance de traitement pour ces tailles) , le vocodeur de phase standard peut ajouter des effets réverbérants, pour essayer d'éviter ce genre de problèmes, vous devrez peut-être verrouiller la phase.

Pour les données, jetez un œil dans le papier Miller Puckette et Portnoff

ederwander
la source
Merci pour votre réponse. Quel est le problème avec la plus naïve des approches: étendre le signal temporel sur l'ensemble en fonction de l'intervalle de temps entier sans fenêtrer en série de Fourier et multiplier toutes les fréquences par une constante. Je comprends que toute erreur locale dans le domaine temporel affecterait tous les coefficients de Fourier. En dehors de cela, quels sont les pièges de cette approche naïve non localisée?
Hans
Je n'ai jamais rien essayé de tel, cela peut fonctionner, le problème évident est que cela peut être assez coûteux, ce n'est certainement pas un moyen efficace, imaginez que vous ayez un morceau audio (1 minute) échantillonné à 44100Hz, maintenant pour faites ce que vous proposez, vous devrez appliquer Fourier à des 44100 * 60 = 2646000points à la fois et traiter, alors oubliez toute tentative de traitement en temps réel comme celle-ci ,
ederwander
1
Je ne pense pas que ce que j'ai suggéré auparavant fonctionnerait dans le sens mathématique pur (sans tenir compte du coût et de la sensibilité aux erreurs).
Hans
3

L'outil / la théorie que vous décrivez est en réalité un vaste domaine de recherche en technologie musicale, généralement appelé modification de l'échelle de temps audio. Une grande partie de ce champ est de savoir comment vous pouvez empêcher les changements audibles de fréquence après étirement du temps. Cela peut être abordé avec des méthodes à la fois fréquentielles et temporelles, en fonction des contraintes ou des objectifs de votre application. L'entrée wikipedia pour la modification de l'échelle de temps / hauteur audio est un bon point de départ.

Si vous souhaitez poursuivre une approche utilisant la base fréquence / ondelettes, la taille de votre fenêtre et le choix de la base affecteront votre capacité à localiser le signal. Pour utiliser le STFT comme exemple, une longue fenêtre fonctionnera bien pour les sinusoïdes stationnaires mais détruira vos transitoires. Une fenêtre plus courte fournira une réponse transitoire préférable au détriment de la localisation dans le domaine fréquentiel. Les performances des autres bases d'ondelettes dépendront de la nature de la projection de votre signal sur la base.

Rapide
la source
Merci beaucoup pour la réponse. Avez-vous une référence sur l'application d'ondelettes à ce problème?
Hans
Veuillez également voir mon commentaire ci-dessous la réponse d'ederwander. Merci.
Hans
2

Vous trouverez ci-dessous un lien vers une fonction de didacticiel simple et utile en C ++ (smbPitchShift.cpp) de Stephan M. Bernsee, qui peut ralentir ou accélérer la musique sans changer sa hauteur.

Il a publié ce code sous la licence The Wide Open (WOL). Dans mon application, j'ai pu adapter sa fonction pour ralentir la musique en temps réel - c'est-à-dire tout en lisant un fichier mp3 et en faisant en plus la détection de hauteur sur ce signal mp3 en même temps.

J'ai également inclus un lien vers le site Web de Bernsee qui contient ses descriptions détaillées sur le Time-Stretching et Pitch-Shifting des signaux audio, tels que la musique.

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/

James Paul Millard
la source
Le code d'origine ne s'applique pas time stretch, le code d'origine s'applique Pitch Shift, dans ce cas pour appliquer la modification de l'échelle de temps que vous devrez combiner Pitch Shifit + Resample (interpolation), le code du Bernsee fonctionne bien en utilisant une fenêtre de taille que 4096vous pourrez changer de hauteur d'une octave (au-dessus ou en dessous) , cela signifie qu'en conséquence, vous ne pourrez faire une échelle de temps avec une bonne qualité qu'en utilisant des facteurs compris entre 2,0x et 0,5x, un vocodeur de phase bien construit peut obtenir de meilleurs résultats en utilisant la même taille de fenêtre, et vous pourrez les extrapoler facteurs avec une meilleure qualité
ederwander
Oups, je me souviens maintenant que je devais appliquer un rééchantillonnage pour terminer l'étirement temporel, afin que la hauteur d'origine ne soit pas modifiée. On dirait que Bernsee a apporté quelques modifications à son code depuis la version liée à GitHub. Son nouveau code pour est disponible en téléchargement sur son site Web - il peut augmenter la plage de décalage par rapport à ses spécifications d'origine. J'ai modifié son code d'origine afin de pouvoir augmenter la hauteur de ton par 8x.
James Paul Millard
il n'y a pas de différence entre votre code et la page Bernsee, le calcul principal est toujours le même, la grande différence que je peux voir est la taille de la fenêtre = 8192dans les codes de la page de téléchargement, vous devez donc faire 4x plus de points pour le traitement , Je reviens pour dire qu'avec une demi-taille de fenêtre, 8192/2=4096vous pouvez faire la même chose en utilisant certains secrets du vocodeur de phase, le point ici est que vous pouvez garder la qualité avec beaucoup moins de traitement.
ederwander
Bien que j'aie fourni le lien GitHub vers BatPhone, ce n'est PAS mon code. Je viens de le retirer d'une recherche sur Internet pour afficher smbPitchShift (). Mon code est très modifié de la version de Bernsee et résidait dans ce fichier: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
James Paul Millard
Ouais maintenant je peux voir, c'est vraiment un rééchantillonnage, vous pourriez être intéressé de voir / entendre mon vocodeur de phase en action.
ederwander