Zone de Texte: Projet de traitement du son

Synthèse de l’algorithme PSOLA de modification du pitch
 

 

 

 

 

 

 

 

 

 

 

 

 

 


Présenté par

 

FLORENCE PLACE

 

SILVIO DUPONT FERREIRA

 

 

Année académique 2001 – 2002

 

Table des matières

 

1.     INTRODUCTION

2.     ANALYSE : détermination du vecteur de marqueurs de pitch Ta[i] et de période instantanée Pa[i]

1.     Détermination d’une estimation de F0 initial

2.     Estimation des ta[i] et des Pa[i]

3.     SYNTHESE : synthèse des ts[j], des Ps[n] et de y[n]

a)     Synthèse de Ps[n]

b)     Synthèse du vecteur Ts[j]

c)     Construction du signal de synthèse Z[n]

4.     Vérification du signal de synthèse

5.     Conclusion

 

1.   INTRODUCTION

 

Le but de ce projet est de synthétiser, sous Matlab, l’algorithme utilisé pour la modification du pitch et de la durée nommé PSOLA (Pitch Synchronous Overlap and Add).

 

Afin de simplifier l’algorithme, on suppose le signal d’entrée comme un signal voisé dont le pitch ne varie pas trop brusquement. Dans le cadre de cette étude, nous traiterons uniquement de la modification du pitch en considérant la durée constante.


La première chose à effectuer est de rechercher une bonne estimation du pitch du signal original. Pour cela, nous considérons que notre signal d’entrée X[n] peut-être exprimé par une fonction de cycles de pitch Xi[n] :

Où les ta[i] sont les marqueurs temporels du signal et la différence entre deux marqueurs temporels adjacents, Pa[i] = ta[i]- ta[i-1], représente la période du pitch du signal au temps ta[i] .


Le cycle de pitch est une version fenêtrée du signal d’entrée, c’est à dire qu’il correspond pour l’indice i, au signal d’entrée convolué avec une fenêtre de Hanning centrée sur ta[i] et de longueur 2.Pa[i] :

La largeur 2.Pa(i) doit à tout prix être respectée pour pouvoir appliquer par la suite le théorème de Poisson qui permettra d’expliquer la conservation de l’enveloppe spectrale.


Notre but est de synthétiser un signal y[n] qui a les mêmes caractéristiques spectrales que x[n] mais avec un pitch différent. Pour y arriver, nous allons remplacer les ta[i] provenant de l’analyse du signal par des ts[j] de synthèse et les cycles de pitch Xi(n)  par des cycles de pitch de synthèse Yj[n] :

Les ts[j] de synthèse sont calculés de façon à avoir le nouveau pitch souhaité pour le signal de synthèse. Le cycle de pitch Yj[n] est obtenu en le faisant correspondre au cycle de pitch Xi[n] le plus proche.


2.   ANALYSE : détermination du vecteur de marqueurs de pitch Ta[i] et de période instantanée Pa[i]

Comme modèle d’expérimentation, nous avons essayé de prendre un échantillon de la voyelle a d’une durée de 2 secondes, le plus monocorde possible. Ceci permet donc d’avoir un signal d’entrée voisé, dans le but d’éviter les fluctuations importantes de pitch.

 

 

Pour estimer les marqueurs de pitch ta[i], nous allons prendre comme hypothèse que l’ensemble des maxima de chaque cycle peut être considéré comme les marqueurs de pitch ta[i] .

Le principe de détermination du pitch sera donc de parcourir le signal et de déterminer l’ensemble des maxima. De ce fait, pour initier la procédure, nous avons besoin de connaître une estimation du pitch instantané au début du signal.


1.     Détermination d’une estimation de F0 initial

 

Pour trouver une bonne approximation de la fréquence F0 initiale, nous avons pris un échantillon du signal contenant les 40 premières ms et nous avons calculé le spectre. La fréquence fondamentale correspond à la fréquence du premier lobe. Le choix est laissé à l’utilisateur de déterminer  la fréquence du premier lobe.

 

 

2.     Estimation des ta[i] et des Pa[i]

 

Nous avons choisi de placer ta[0] sur le premier maximum du signal. De cette manière, le vecteur des ta[i] contient l’emplacement de tous les autres maxima et à partir de celui-ci, nous pouvons calculer sans difficultés le vecteur des Pa[i] correspondant aux différentes périodes de pitch du signal.

Afin de déterminer le maximum suivant ta[1], on mesure le maximum dans l’intervalle [To-10 , To+10] avec To représentant l’estimation de la période de pitch déterminée initialement. Nous avons choisi cet intervalle pour nous assurer que le maximum suivant se trouve bien dans l’intervalle.

 

Nous pouvons à présent commencer à remplir le vecteur des ta[i] et des Pa[i] puisque Pa[0] peut-être déterminé : Pa[0] = ta[1] – ta[0].

Nous reprenons ensuite le même principe pour continuer la procédure, nous recherchons le maximum de l’intervalle [ ta[1] + Pa[0] –10 , ta[1] + Pa[0] +10 ] et nous le faisons correspondre à ta[2]. De là, Pa[1] peut-être déterminé et ainsi de suite jusqu’à la fin du signal. Ce procédé fonctionne bien tant que le pitch ne fluctue pas trop vite. Son avantage consiste au fait qu’il emploie toujours la période de pitch précédente pour aller chercher le maximum suivant donc il tient compte des modifications lentes de la période de pitch.

 

Pour vérifier nos résultats nous avons créé un vecteur Ta contenant des ‘1’ aux emplacements des ta[i] et nous l’avons superposé au signal d’origine. Ceci va nous permettre de voir s’il y a bien correspondance entre les maxima du signal et les ‘1’.

 

 

Nous avons également affiché les différentes périodes de pitch trouvées : les Pa[i] et nous avons pu vérifier l’hypothèse des petites fluctuations.

 


3.   SYNTHESE : synthèse des ts[j], des Ps[n] et de y[n]

a)     Synthèse de Ps[n]

Ps[n] correspond au vecteur qui représente la période instantanée du signal à synthétiser.

Plus précisément, nous nous donnons une fréquence de pitch à laquelle nous voulons arriver, ensuite nous calculons une moyenne des différentes périodes contenues dans le vecteur des Pa[i]. En partant de cette moyenne, nous modifions progressivement la période jusqu’à atteindre la période de pitch choisie pour le signal de synthèse.

Pour déterminer le vecteur Ps, nous commençons par définir un facteur de modification du pitch, beta. Si le signal d’origine présente un pitch qui vaut en moyenne F, le signal de synthèse aura une période de pitch qui fluctue de T  à (beta * T). Ensuite, nous construisons le vecteur beta_i qui va nous permettre de modifier le vecteur Ps[n] en fonction du temps. Pour mieux comprendre, basons-nous sur le schéma représenté ci-dessous dans le cas où l’on augmente la fréquence fondamentale F0 et donc réduisons la période de pitch :

                 

 

                  

 

 

                    

                                                                           

 

 

                                                                                             

                                                                                          t     

 

b = Ps final – T  et beta = Ps final / T

b/T = beta – 1 à  b = (beta-1) * T

 

 

 

 

Pour trouver les valeurs du vecteur Ps en chaque point, nous avons procédé de la sorte :

à  beta_i = ( (1 :1 :taille du signal) * (beta – 1) *  T ) / taille du signal

 
 

 


Ce vecteur représente la valeur que nous allons ajouter à Pa, en chaque point pour déterminer Ps :

à   Ps = Pa (1 : taille du signal) + beta_i

 
 

 

 


 

b)    Synthèse du vecteur Ts[j]

Pour synthétiser le vecteur des ts[j] nous avons procédé de la manière suivante :

ts[j+1] – ts[j] = (Ps[ts[j+1]] – Ps[ts[j]] ) / 2

 
ts[j+1] peut-être calculé de manière à ce que ts[j+1] – ts[j] corresponde à la moyenne du pitch du signal à synthétiser calculé dans l’intervalle ts[j] £ t £ ts[j+1] c’est à dire

 

 

 

c)     Construction du signal de synthèse Z[n]

 

Une fois les marqueurs temporels ts[j] déterminés, il nous reste encore à construire les différents Xi[n] représentant les versions fenêtrées du signal d’entrée. A partir de ceux-ci et des ts[j], le signal de synthèse pourra être réalisé.

 

Pour synthétiser Xi[n], nous avons convoluté le signal d’origine par une fenêtre de Hanning centrée sur ta[i] et dont la longueur vaut deux fois la période associée à ta[i] (c’est à dire Pa[i] = ta[i] – ta[i-1] ). Ensuite, nous avons centré celui-ci sur le ts[j] le plus proche du ta[i] correspondant à sa création.

 

De cette façon, nous avons pu obtenir le signal de synthèse en sommant chacune des contributions des Xi[n] centrés sur les différents ts[j]. Par le théorème de Poisson, on peut montrer que ce procédé d’addition de fenêtres bien calibrées ne modifie pas l’enveloppe spectrale.

 

4.   Vérification du signal de synthèse

 

 

Pour bien démontrer que le timbre du signal synthétisé n’a pas été altéré par l’algorithme PSOLA, nous avons comparé son enveloppe spectrale à celle du signal d’origine et nous avons pu constater qu’elles étaient bien identiques(ce qui était démontré par le théorème de Poisson).

 

Les fichiers sonores suivants représentent un son voisé respectivement sans puis avec modification par PSOLA (facteur 1,4)

"he" original

"he" modifié par PSOLA

 

On a constaté qu’à partir d’un facteur de modification de pitch de 2, le son produit a un effet inhumain trop important (effet d’accélération de voiture !)

5.   Conclusion

 

Nous avons pu démontrer qu’un algorithme aussi simple que PSOLA permet de donner de bons résultats pour la modification du pitch. Tant que le signal d’origine est bien voisé, notre algorithme conserve le timbre de la voix pour des modifications de pitch inférieure à deux.