ADF Voice Changer Principe

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Ici, nous allons expliquer quelques notions de théorie. Si vous voulez seulement assembler le circuit, vous pouvez passer directement à la page suivante.


Les grains audios...

Peu importe si vous êtes assez âgé pour avoir pu jouer avec la platine à disque vinyle de papa, ou plus jeune pour avoir « échantillonner » (sampler issus de l'anglais) des morceaux musicaux en fichiers audio numériques grâce a votre PC moderne, vous avez probablement connu le phénomène suivant:
Prendre un enregistrement audio lu à vitesse normale (dite nominale)... pour ensuite modifier cette vitesse, ce qui revient à en compresser ou en dilater le temps... et la hauteur (en fréquence) de l'enregistrement change avec elle.

Comprimer le temps (donc jouer le morceau plus vite) augmente la hauteur du son (il est plus aigu), tandis que dilater le temps (jouer plus lentement) diminue la hauteur hauteur du son (il est plus grave).

La fréquence (hauteur du son... aigu/grave) est inversement proportionnelle à la longueur d'onde (temps que met l'onde à voyager... le morceau a jouer).

Quand le temps augmente... le son devient plus grave (la fréquence diminue).

Quand le temps diminue... le son devient plus aigu (la fréquence augmente).

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

C'est facile à réaliser avec des enregistrements... mais avec le son en temps réel c'est plus compliquer car nous n'avons pas le luxe d'enregistrer puis de modifier le son avec un programme comme Audacity (par exemple).

Modifier le son (ou la voix) en temps réel c'est le faire en temps réel... Nous ne pouvons ni le compresser, ni le dilater... Il est ce qu'il est. Que peux donc faire un "Voice changer" ?

Il existe une technique complexe appelée Transformée de Fourrier qui transforme une fonction (ou, disons un flux sonore) dans son spectre de fréquences (1*). La valeur de la fréquence résultante peut-être altérée (par un programme) et une transformée inverse utilisé pour re-transformer les valeurs fréquences en son. Ceci est processus purement mathématique ... mais c'est très exigeant et sollicite notre petit Arduino bien au-delà de ses possibilités.

Un puissant processeur (CPU) ou un DSP (Digital Sound Processor) est habituellement requis. Nous aurons donc besoin d'un raccourci ou d'une astuce...

1*: La transformée de fourrier transforme un son en une série de valeur numériques indiquant le niveau (l'importance) de chaque fréquence élémentaire qui compose ce son. C'est un peu comme écouter un morceau de symphonie et de pouvoir identifier instantanément toutes les notes jouées par chaque instrument... au fur et a mesure... et les coucher sur des partitions. Un travail colossale!

Dans le domaine de la musique numérique, la synthèse granulaire est une technique d'assemblage et une superposition de nombreux extraits audio très courts (échantillons ou « grains ») -- de l'ordre de un à quelques millisecondes. Cette assemblage permet de construire des sons ou instruments plus complexes.

Maintenant, imaginez un simple échantillon appelé « grain » de dix millisecondes ou plus ... que nous continuons à rafraîchir constamment et directement depuis un microphone, nous obtenons une minuscule "boucle" d'échantillonnage. Par compression ou étirement du temps de cette minuscule boucle, en répétant ou enlevant de courts segments, il est possible de rester dans un traitement du son en temps réel.

Nous avons là une base pour un « pitch shifter » (modificateur de tonalité de voix) en temps réel. Si cela peu sembler aberrant et non fonctionnel, soyez assuré que cela fonctionne... et ca le fait!

La parole est composée de sons, ces sons étant eux mêmes composés de formes d'ondes très courtes qui tendent à se répéter sur de très courtes périodes. Nous pouvons donc éliminer ou répéter certain de ces segments d'onde en préservant la qualité audible du son (il y a uniquement une dégradation mineur de la qualité de rendu audio).

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

En conclusion: nous pouvons laisser tomber ou répéter certains des segments dans notre boucle d'échantillonnage tout en préservant le côté audible (compréhensible) de l'élément sonore d'origine.

Cette approche est bien adaptée à un Arduino qui dispose d'une puissance de traitement limitée et de peu de RAM (mémoire). La qualité du résultat ne sera pas "Hollywoodien", mais il sera quand même mieux que la voix issue des jouets et des masques du magasin du coin. Sans compter que vous le réaliserez vous-même... Ce n'est pas super ça ?

Echantillonage Audio

La plage de fréquences de la voix humaine s'étend sur environ 300 Hz à 3.500 Hz (les harmoniques peuvent s'étendre au-delà). Le théorème d'échantillonnage de Nyquist (anglais) stipule que pour reconstituer un signal fidèle, la fréquence d'échantillonnage doit être au moins 2 fois plus élevée que la fréquence du signal à échantillonner. Pour la voix humaine cela signifie un échantillonnage à 7 kHz au minimum (soit 2 x 3.5 KHz)... bien que un peu plus ne pourra que donner un meilleur résultat.

La fonction standard analogRead() d'Arduino est beaucoup.. beaucoup trop lente pour faire un appel répétitive dans une boucle. Nous avons besoin de chercher plus profondément dans les entrailles du système de conversion analogique-numérique d'Arduino. En utilisant directement des modes et les registres spéciaux, nous pourrons faire un échantillonnage correct.

Une possibilité appelée « mode free-run » collecte des échantillons analogiques à intervalle régulier (et rapidement) sans faire d'appel répété dans notre propre programme/code. Une fonction de gestion d'interruption (interrupt handler en anglais) est automatiquement appelée chaque fois qu'un nouvel échantillon est prêt. Ca fonctionne comme sur des roulettes :-) . Dans les meilleures conditions, un Arduino à 16 MHz permet de capturer 9.615 échantillons (de 10 bits) par seconde (9.6 KHz), c'est plus que suffisant pour échantillonner la voix !

Les échantillons audio sont stockés dans une mémoire tampon circulaire, c'est une structure informatique où "lorsque vous atteignez la fin de la mémoire tampon" alors "le programme recommence au début de la mémoire tampon" pour stocker les données suivante. Les données sont donc "écrasée" continuellement.

Conceptuellement, il est facile d'imaginer une telle mémoire tampon comme un cercle sans fin :

{{{2}}}
Crédit: AdaFruit Industries www.adafruit.com

La fréquence du son enregistré correspondra rarement à la longueur du tampon. Cependant, les échantillons audio sont stockés et lus à des vitesses différentes. Cela peut produire une discontinuité notable -un bruit sec- à chaque fois que l'entrée et la sortie se croisent. Une petite mémoire tampon supplémentaire est utilisée pour stocker les premiers échantillons et le code effectue des fondu-enchaînés en passant d'un tampon à l'autre pour réduire les « craquements ».

Parce que notre « grain » audio est relativement court (environ 10 millisecondes), le besoin en mémoire RAM devrait être modéré (quelques centaines d'octets/bytes).

Le problème c'est que nous aimerions aussi utiliser le Wave Shield pour faire ce pourquoi il a été conçu - la lecture de fichiers WAV. La lecture se fait depuis une carte carte SD et cette opération consomme vraiment beaucoup de mémoire. Heureusement, la bibliothèque de lecture des fichiers WAV est bien conçue, ce qui permet d'accéder à la mémoire de la librairie et de l'utiliser pour nos propres besoins.

Les détails techniques sont bien commentés dans le code source. Donc, si vous êtes curieux de connaître les détails de mise en œuvre... utilisez le source à votre disposition.

Limitations

Lorsque LadyAda présente Arduino à des nouveaux utilisateur, elle le décrit comme "un ordinateur juste assez puissant pour réaliser une des nombreuses choses possible mais de le faire vraiment bien".

Il faut quand même garder à l'esprit, que même pour l'humain, il est difficile de coordonnées des tâches distinctes pour les réaliser en même temps. Ce que l'on traduirait en anglais par "Walking while chewing gum is a challenge!" ("c'est un challenge de se promener en chiquant" sous entendu marcher à un rythme totalement désynchronisé de la mastication).

Arduino aussi à ses limites

Gardez les limitations suivantes à l'esprit :

  • il peut traiter l'effet vocal ou jouer des fichiers WAVs (et peut faire les deux avec le même sketch), mais il ne peut pas le faire simultanément.
  • Vous ne pouvez pas lire d'autres entrées analogiques lorsque l'effet de voix est en fonction (cas concret, vous ne pouvez pas faire varier la fréquence de l'effet de voix à la volée avec le potentiomètre). Si vous utilisez des capteurs analogiques comme déclencheurs (par ex. Des capteurs de force résistifs dans des chaussures), envisagez des solutions de contournement comme l'utilisation d'un diviseur de tension, soigneusement calculé, sur une entrée digitale, ou un deuxième microcontrôleur (MCU) pour traiter les entrées analogiques, déclenchant la suite au travers une liaison série ou une connexion I2C.

Source: Wave Shield Voice Changer. Crédit: Adafruit Industries

Réalisé avec l'aide de Mr Carette J. à qui nous remettons tous nos remerciements.

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.