Voice effects
Bonjour à tous,
J'aurai aimé savoir quoi utiliser pour enregistrer la voix de l'utilisateur et modifier sa voix (rajouter un effet "hélium") par exemple.
Pour l'hélium, je me dis qu'il suffit de changer la rapidité de lecture ?
Mais quoi utiliser... J'ai entendu parler de OpenAL compatible iPhone, ainsi que CoreAudio.
Des resources ? Des tutos ?
Merci d'avance pour votre aide
J'aurai aimé savoir quoi utiliser pour enregistrer la voix de l'utilisateur et modifier sa voix (rajouter un effet "hélium") par exemple.
Pour l'hélium, je me dis qu'il suffit de changer la rapidité de lecture ?
Mais quoi utiliser... J'ai entendu parler de OpenAL compatible iPhone, ainsi que CoreAudio.
Des resources ? Des tutos ?
Merci d'avance pour votre aide

Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
ça marche sur Mac et sur iPhone.
Va juste falloir que je trouve 1 petit tuto CoreAudio pour traiter le son
J'ai finalement combiné AVAudioRecorder ainsi que OpenAL (pour jouer le son en modifiant l'AL_PITCH).
Le problème est que le fait de modifier AL_PITCH a un impact sur la vitesse de lecture du son ! Et je n'arrive pas à trouver le moyen de ne modifier que la tonalité. J'ai beau avoir cherché une journée entière, j'ai l'impression de tomber que sur des trucs de mathématiciens ultra-méga-imcompréhensible pour mon pauvre petit cerveau...
Avant d'utiliser OpenAL, j'avais trouvé un petit framework sympa qui modifiait la tonalité sans changer la vitesse de lecture. Sauf qu'une fois testé sur l'iPhone, j'ai vite dégagé cette méthode qui se trouve être beaucoup beaucoup beaucoup et beaucoup trop lente (Presque 10 secondes pour un fichier audio de 5 secondes, par exemple).
Voilà pourquoi je me suis tourné vers OpenAL, que j'ai su mettre en place après avoir lu pas mal de documentations. Reste ce problème de tonalité qui me fait me tirer les cheveux depuis 2 jours...
Je connais deux méthodes:
1) Prendre des groupes d'échantillons et les répéter.
Par exemple, si ton son d'origine dure 2s, et que tu le lis 2 fois plus vite, le son accéleré durera 1 s.
Tu peux découper le son accéléré (par exemple, en groupes de 500 échantillons, ça fait 11,36 ms de latence à 44 kHz, c'est acceptable) et jouer les échantillons accélérés deux fois.
> Le résultat n'est pas parfait mais c'est rapide, et le principe est facile à comprendre.
2) Décomposer le son en séries de Fourier
Là , on rentre dans les maths... Après application d'une FFT (algorithme que tu auras récupéré quelque part), il faut multiplier la fréquence des sinusoà¯des et les additionner.
> Méthode utilisée par les logiciels de musique. Le résultat est impeccable, mais la mise en oe“uvre n'est pas facile, et ça tire sur le processeur. À noter que les coprocesseurs de l'iPhone doivent être capables de faire une partie du boulot, mais je ne pense pas qu'Apple y donne accès.
Il y a peut-être d'autres méthodes. Par exemple, pour doubler la vitesse, il doit être possible de mettre le signal au carré et appliquer un filtre passe-haut pour supprimer la composante continue.
C'est complexe, mais le traitement du signal ne s'invente pas.
C'est le moyen le plus classique d'ailleurs et le plus répandu.
En effet, le pitch (la hauteur / tonalité) d'une note est déterminée par sa fréquence.
Si tu joue un son plus vite, sa fréquence va augmenter (au lieu de 440 vibrations par secondes, si tu le joue 2x plus vite, tu auras les 440 vibrations en 1/2 seconde, autrement dit une fréquence de 880Hz, donc une note un octave plus haut). Pour augmenter la tonalité d'une note sans en changer sa durée, c'est donc bien plus complexe, puisqu'il faut extrapoler et faire des allers-retours dans le domaine fréquentiel et temporel.
En effet, si tu joue un La4 (440Hz) pendant 1 seconde, puis un Si4 -- soit deux demi-tons au dessus (donc fréquence de 440*q², où q=pow(2,1/12)) -- pendant une autre seconde, et que tu regardes la courbe audio, tu verras une oscillation de 440 vibrations pendant une seconde, puis de 440*q² pendant une autre seconde. Mais ces données seront stockés dans le buffer audio (ou le fichier audio) en général au format PCM, donc selon le domaine temporel échantillonné ; il n'y a pas de notion de fréquence à ce stade, juste la valeur de chaque impulsion (pour chaque échantillon de temps). Si tu veux donc qu'au lieu de 440Hz pendant une seconde, tu aies 880Hz pendant une seconde, en manipulant directement les données PCM, c'est pas simple.
Tu pourrais prendre un échantillon sur deux, ou doubler les échantillons... mais ça revient à jour le son plus vite... L'idéal serait de savoir pendant combien de temps dure chaque note (1 seconde pour chaque ici) et répéter ces fenêtres deux fois (répéter les échantillons de la première seconde une 2e fois, et jouer le tout 2x plus vite)... mais faut alors savoir la durée de chaque note... et encore je n'ai pris ici qu'un exemple simple avec des notes pures et bien délimitées, sans accord ni timbre particulier !
La seule solution dans ce genre de problème est de passer en domaine fréquentiel (avec une FFT par exemple), d'appliquer la modification de fréquence (multiplier -- et non ajouter, le son est logarithmique chaque hausse d'un demi ton revient à multiplier la fréquence par la racine 12e de 2 -- toutes les fréquences par une constante), puis de revenir dans le domaine temporel (IFFT) pour finalement pouvoir réinjecter les échantillons dans le buffer de playback. C'est certainement pas si méchant avec des frameworks comme OpenAL (que je n'ai jamais manipulé mais qui doivent bien avoir des outils pour), mais c'est pas forcément évident à faire avec des contraintes temps réel si tu veux effectivement conserver la fréquence de lecture.
[EDIT] Grillé par Céroce... mais bon on évoque à peu près les mêmes idées, et comme il le dit si bien le traitement du signal ne s'invente pas.
Au pire ça peut se calculer et il suffit de corriger le pitch en fonction...
alSourcef(sourceID, AL_PITCH, 1.0f);
alSourcef(sourceID, AL_GAIN, 1.0f);
Regarde là : http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/comment-page-1/
@NseaProtector : il y a effectivement "AL_SPEED_OF_SOUND", mais je n'ai pas trop compris dans quel cas il est utilisé...
Je reste même assez sceptique sur le but de AL_SPEED_OF_SOUND..
Par contre je ne comprend pas pourquoi tu me parles de AL_GAIN, étant donné que je ne cherche pas à rajouter db à mon son
All speed of sound, ce doit-être pour la vitesse de l'effet Doppler ( L'effet doppler simule la perception que l'on a du son quand une voiture arrive par exemple de la gauche et s'éloigne vers la droite).
AL-GAIN je l'ai laissé pour t'aider à situer ou se trouves le bout d'exemple que j'ai copier (lien)
AL_SPEED_OF_SOUND (ça fait un peu Coldplay
Donc je ne pense pas que ces constantes t'aident. Par contre du peu que je connais les principes des SoundEngines comme OpenAL, c'est bien sur les paramètres de la alSource qu'il faut jouer (c'est elle qui va appliquer les divers "effets sonores" sur le buffers d'échantillons à jouer). S'il n'y a rien dans les alSources pour faire ce que tu veux (en combinant AL_PITCH et autre chose peut-être ?), tu seras obligé de faire le traitement toi-même, en offline, directement sur les échantillons du buffer, et là c'est une autre paire de manches du coup.