HMM: Mode d'emploi

Philippe Chose, IRCAM





Présentation

    Hmm est un programme d'analyse-synthèse fonctionnant sous Unix, aussi bien sur DEC Alpha que sur station de travail SGI. Hmm se compose d'un script appelant un certain nombre de modules. Ce manuel décrit l'utilisation de ce script dans le but d'analyser un son et de le resynthétiser après transformation.

    Le modèle sonore utilise par Hmm se décrit en termes de sinusoïdes appelées partiels dont les fréquences, les amplitudes et les phases varient au cours du temps. Cette description du son est obtenue en trois temps: tout d'abord une analyse spectrale du son est effectuée (FFT à fenêtre glissante) puis les maxima locaux (pics) de chaque spectre sont detectés; enfin ces pics sont reliés entre eux afin de former des partiels. Hmm utilise la librairie Pm pour calculer les différentes FFT et pour détecter les pics. Le coeur du programme se situe dans la phase de détection des partiels qui utilise un algorithme inspiré des Modèles de Markov Cachés (Hidden Markov Models).

Exemple

Cette ligne de commande effectue l'analyse et la resynthèse du fichier sonore test.sf:
hmm -A -R -D -S test.sf
Un sous-répertoire HMMtest est crée dans lequel sont placés les fichiers obtenus aux différents stades de l'analyse. Tout d'abord un fichier test.peak.sdif contenant  l'ensemble des pics détectés dans le fichier sonore; un fichier test.sdif contenant les partiels détectés; et enfin un fichier history dans lequel sont stockées les lignes de commande de toutes les analyses effectuées sur ce son. Par ailleurs, dans le répertoire courant, deux nouveaux fichiers sont apparus: test.synt.sf et test.noise.sf contenant respectivement le son resynthétise et le résiduel, c'est à dire ce qu'il reste dans le son après soustraction du son resynthétisé.

Fichiers sons et fichiers SDIF

    Hmm utilise la variable d'environnement Unix SFDIR pour désigner le répertoire contenant les fichiers sonores à traiter et devant contenir les fichier sonores produits. Si un nom de fichier est donné avec un chemin relatif, ce chemin est supposé être relatif au répertoire désigné par la variable SFDIR. Si le fichier son est donné avec un chemin absolu alors la variable SFDIR est ignorée. La variable SFDIR peut être modifiée par la commande setenv (sous le Cshell):
setenv SFDIR /user/my_group/my_name/sound_dir/
     Hmm reconnaît en entrée les formats AIFF/AIFF-C ainsi que le format IRCAM .sf. Un ensemble de programmes est disponible à l'IRCAM afin de manipuler ces fichier sonores: fromsf, tosf, querysf, playsf, normsf, peaksf, diffsf, sfmix et xspect. Utilisez l'option -h en ligne de commande pour obtenir plus d'information.

     Hmm utilise la variable d'environnement DATADIR pour désigner le répertoire devant recevoir les fichiers de pics et de partiels crées. Par défaut, cette variable est initialisée à la même valeur que SFDIR. Les fichiers sont placés dans un sous-répertoire de DATADIR portant un nom commençant par HMM suivi par le nom du son analysé sans son extension. Un fichier history est aussi écrit dans ce répertoire: il contient la trace de l'ensemble des analyses effectuées sur le fichier son correspondant. Si par exemple le fichier analyse s'appelle wood.sf, les fichiers de pics et de partiels wood.peak.sdif et wood.sdif ainsi que le fichier history seront plac's dans le sous-répertoire HMMwood de DATADIR.

Les deux fichiers de pics et de partiels sont au format SDIF. Ils contiennent respectivement les pics détectés dans le spectre à tous les instants d'analyse (trames 1PIC) et les partiels détectés (trames 1TRC). Ces fichiers peuvent être visualisés graphiquement avec le programme sview ou être convertis et manipulés grâce aux outils suivants: sdiftofmt, sdiftoformat et sdifextract. Voici par exemple un fichier de pics visualisé avec sview:
 
 




 








Utilisation de hmm

    Le programme se lance en tapant sur la ligne de commande:
hmm <options, ....>
ou options est une liste d'options separées par des blancs. Notons tout de suite l'option -h qui permet d'obtenir l'aide en ligne:
hmm -h
  Analysis/Synthesis steps
        -A              hmm tracking
        -R              additive synthesis
        -D              residual
        -P              peak detection
        -T              partial tracking

  Analysis parameters
  N.B. SPACE BETWEEN FLAG AND ITS VALUE
        -S              input sound file (relative paths will be searched in SFDIR, except for paths
                          starting with '~', './', or '../', and of course absolute paths.)
        -B              begin analysis in s (0)
        -E              end analysis in s (end of file)
        -M              analysis window width in s (.08)
        -I              analysis step in s (.01)
        -W              min length of partials in frames (3)
        -f              frequency variance in Hz^2 per ms (5.)
        -a              amplitude variance per ms (0.1)
        -y              phase variance in radians per ms (2.5)
        -d              absolute freq slope coefficient in Hz per ms (1.5)
        -e              relative freq slope coefficient in Hz per Hz and per ms (0.)
        -fm             minimum frequency in Hz (0.)
        -fM             maximum frequency in hz (srate/2)
        -p              zero padding exponent (0)
        -u              additive frequency coefficient for HMM score (8)
        -v              additive amplitude coefficient for HMM score (8)
        -w              additive phase coefficient for HMM score (8)
        -X              gain for frequency weight in HMM score (1)
        -Y              gain for amplitude weight in HMM score (1)
        -Z              gain for phase weight in HMM score (1)
        -s              gain smoothing in HMM score (1)

Options sans argument

-A : analyse complète (détection des pics et suivi de partiels)
Cette option indique qu'on souhaite effectuer un calcul des trajectoires de partiels. Ceci est realisé en trois étapes:
  1. calcul des spectres par FFT glissante.
  2. détection des pics dans ces spectres (maxima locaux).
  3. assemblage des pics au sein de partiels (algorithme HMM).
Le resultat au terme de la seconde phase (pics detectés) est placé dans le fichier <nom_du_fichier_son>.peak.sdif dans le sous-repertoire HMM<nom_du_fichier_son>. Le résultat au terme de la troisième étape est placé dans le meme répertoire dans le fichier <nom_du_fichier_son>.sdif.
-P : détection des pics uniquement
    Cette option indique que l'on souhaite effectuer une détection des pics uniquement sans relier ces pics dans des partiels. Le résultat est un fichier SDIF contenant des trames de type 1PIC dans le sous-répertoire HMM<nom_du_fichier_son>.peak.sdif. De ce fichier peuvent être extraites les données grâce au programme sdifextract. Par ailleurs, le fichier peut être visualisé graphiquement à l'aide de sview. Les données stockées pour chaque pic sont la fréquence de ce pic, son amplitude et sa phase mesurée au centre de la fenêtre d'analyse, c'est à dire à l'instant repéré par le temps de la trame.
-T : tracking des partiels
    Cette option indique que l'on souhaite effectuer un tracking des partiels à partir du fichier <nom_du_fichier_son>.peak.sdif situe dans le sous-répertoire HMM<nom_du_fichier_son>. Le résultat de cette opération est stocké dans le fichier <nom_du_fichier_son>.sdif situé dans le même sous-répertoire. Ce fichier est un fichier SDIF contenant des trames de type 1TRC. Les données peuvent être extraites grâce au programme sdifextract ou visualisées graphiquement avec sview (voir ci dessous un exemple de visualisation):  pour chaque partiel on dispose de sa fréquence, de son amplitude, de sa phase (mesurée au centre de la fenêtre d'analyse) et de son numéro d'index (ce qui permet de le relier aux pics des autres trames).
 
 


 
















-R : synthèse additive
    Cette option indique que l'on souhaite effectuer une resynthèse à partir des partiels détectés en utilisant les données stockées dans le fichier <nom_du_fichier_son>.sdif dans le répertoire HMM<nom_du_fichier_son>. Le fichier sonore produit est un fichier de meme format que le son original (sf ou aiff). Sa fréquence d'échantillonage est la même que le fichier source. Il est nécessaire pour utiliser cette option d'avoir lancé hmm préalablement avec les options -A ou -P et -T.
-D : calcul du résiduel
Cette option indique que l'on souhaite calculer le résiduel c'est à dire ce qu'il reste dans le son après soustraction des partiels détectés. Cette opération est effectuée par soustraction dans le domaine temporel des deux formes d'onde du fichier son original et du fichier son resynthétisé qui aura ete préalablement calculé grâce à l'option -R. Si tous les partiels ont ete détectés au cours de l'analyse, seul les parties non-sinusoïdales du son subsistent dans le résiduel. Le fichier son crée se nomme <nom_du_fichier_son>.noise.sf ou .aiff, sa fréquence d'échantillonage étant la même que celle du fichier son original; il est situé dans le répertoire $DATADIR.

Options avec argument

Les options suivantes nécessitent un argument. Notons qu'un espace est nécessaire entre l'option et son argument.
-S nom_du_fichier_son_à_traiter
Donne le nom du fichier à analyser. Exemple -S test.sf.

Si un chemin relatif est donné, il sera cherché à partir du répertoire $SFDIR. Le nom du son, c'est à dire ce qui précède l'extension .sf ou .aiff sera utilisé pour former le nom du sous-répertoire de $DATADIR devant recevoir les fichier produits (voir Fichier sons et fichiers SDIF ci-dessus). Cette option ne peut JAMAIS être omise.

-B instant_de_début_d'analyse_en_secondes
    Instant repérant le début de l'analyse par rapport au début du fichier son. Exemple -B 1.32. La valeur par défaut est 0.
-E instant_de_fin_d'analyse_en_secondes
    Instant repérant la fin de l'analyse par rapport au début du fichier son. Exemple -E 1.64. La valeur par défault place ce repère en fin de fichier.
-M taille_de_la_fenêtre_d'analyse_en_secondes
    Taille de la fenêtre d'analyse c'est à dire de la portion du signal analysée à chaque pas d'analyse par une FFT. Exemple -M 0.022. La valeur par défaut est de 0.08 secondes. Afin que les différents pics spectraux apparaissent séparés dans la FFT et puissent ainsi être correctement détectes, il est nécessaire d'utiliser une taille de fenêtre d'analyse au moins 3 fois plus grande que l'inverse de la plus petite distance en Hertz que l'on souhaite séparer. Si par exemple df dénote l'e'eartement minimal en fréquence entre deux partiels du son a analyser, la taille de la fenêtre d'analyse devra être au moins égale à 3/df, voire même 3.5/df pour éviter toute surprise. Plus la taille de cette fenêtre est grande, plus les pics seront séparés et meilleure sera leur détection. La contrepartie est une moins bonne résolution temporelle.
-I pas_d'analyse_en_secondes
Intervalle de temps s'ecoulant entre deux analyses successives. Exemple -I 0.005. La valeur par défaut est de 0.01 secondes. Pour une meilleure estimation des paramètres des partiels lors d'une évolution rapide de ceux-ci, une valeur plus faible pourra être utilisée. Néanmoins une faible valeur augmente le temps de calcul et la taille des fichiers produits.
-fm fréquence_minimale_explorée
-fM fréquence_maximale_explorée
Limite inférieure et supérieure de fréquence explorée pour la détection des pics. Les valeurs par défaut sont 1 Hertz et la moitié de la fréquence d'échantillonage du fichier son analysé.
 
-W taille_minimale_d'un_partiel
Durée minimale d'un partiel en nombre de trames. Tout partiel plus court sera rejeté. La valeur par défaut est de 3 trames. Cette taille est directement reliée à la taille de la fenêtre HMM, c'est à dire la portion de signal sur laquelle une détection globale des partiels sera effectuée. Plus cette valeur sera grande plus le nombre de partiels candidats sera élevé et plus le temps de calcul sera important. Des valeurs très importantes de ce paramètre combiné avec des valeurs importantes du seuil de différence de fréquence (-d, -e) peuvent conduire à des calculs extrêmement longs.
-p exposant_de_zero_padding
Le rapport entre taille de la FFT et taille de la fenêtre d'analyse est égal à 2^exposant. Ce paramètre permet donc de contrôler la taille de la FFT. La valeur par défaut est 0.
-d différence_absolue_maximale_de_fréquence
-e différence_relative_maximale_de_fréquence
Ces deux paramètres servent à contrôler la différence maximale de fréquence entre deux pics successifs d'un même partiel. Cette différence maximale est calculée de la manière suivante:
    différence_maximale ^ 2 = différence_absolue ^ 2 + (différence_relative * fréquence) ^ 2
où  fréquence désigne la fréquence du premier pic. Si la différence de fréquence entre deux pics dans des trames successives est supérieure à cette borne alors ces deux pics ne peuvent être reliés pour faire partie d'un même partiel. Si par contre elle est inférieure à cette même borne, un partiel contenant ces deux pics est possible. Un autre lui sera peut être preféré au cours de l'optimisation HMM (cf les options -f, -a, -y, -u, -v, -w, -X, -Y, -Z, -s).  L'interêt d'avoir scinde ce seuil en partie absolue et relative permet d'avoir un seuil variant en fonction de la fréquence, très pratique lors de l'analyse de signaux harmoniques, puisqu'une variation de fréquence (Hz/ms) df_n pour l'harmonique d'ordre n entraînera une variation de fréquence df_m valant approximativement df_n * m / n, ce qui montre bien la proportionnalité entre cette différence de fréquence et la fréquence elle-même.
    Les valeurs par défaut de ces deux paramètres sont respectivement de 5 et de 0.1, les unités étant des Hz/ms et des Hz/Hz/ms.
 
-f variance_de_la_fréquence
-a variance_de_l'amplitude
-y variance_de_la_phase
Ces trois paramètres sont utilis's dans le calcul du score d'une séquence de pics. Ils contrôlent le degré de tolérance aux variations de la grandeur considerée (fréquence, amplitude ou phase) entre deux pics successifs d'une meme séquence. Leurs valeurs par défaut sont respectivement 5, 0.1, 2.5, les unites etant des Hz^2/ms, des 1/ms, et des rad/ms.
-u coefficient_additif_de_la_fréquence
-v coefficient_additif_de_l'amplitude
-w coefficient_additif_de_la_phase
Ces trois paramètres sont utilisés dans le calcul du score d'une sequence de pics et sont en fait redondants. Ils permettent lorsqu'on les augmente de tolérer beaucoup plus de séquences qui sinon aurait été rejetées. Leur valeur par défaut est 8.
-X gain_de_la_partie_fréquence
-Y gain_de_la_partie_amplitude
-Z gain_de_la_partie_phase
-s gain_de_la_partie_lissage
Ces quatres paramètres sont utilisés dans le calcul du score d'une séquence de pics. Ils permettent de modifier le poids relatif de la fréquence, de l'amplitude ou de la phase dans le calcul du score et ainsi donner plus d'importance à la relative linéarité du dit paramètre. Leur valeur par défaut est 1.
 

ATTENTION: Le script à la date du 19 Juin 2000 n'utilise pas LissHarm: les naissance et morts font donc des clicks a enlever avec LissHarm, par exemple: sdifextract -format sop6a6.hmm.sdif | LisHarm -n2020 -a.01 -r.01 | formattosdif sop6a6.hmmL.sdif

Calcul du score d'une séquence de pics

Le score d'une séquence de pics represente la vraisemblance que cette séquence soit un partiel du son. Plus sa valeur est élevée, plus cette séquence aura de chances d'être promue au rang de partiel. Ce score est calculé de la maniere suivante:

    Soit p[i], i = 0..W-1, une séquence de pics extraits de W trames successives (W est la taille de la fenêtre HMM). Le score S de cette séquence vaut:
 
 

S = S_1* S_2 * ... * S_(W-2)
avec:
S_i = S_i_f * S_i_a * S_i_p
S_i_f = exp( -gain_f * (p[i-1].f - 2*p[i].f + p[i+1].f)^2 / variance_f - additive_f) )
S_i_a = exp( -gain_a * (p[i-1].a - 2*p[i].a + p[i+1].a)^2 / p[i].a^2 / variance_a - additive_a) )
S_i_p = exp( -gain_p * (p[i-1].p - 2*p[i].p + p[i+1].p)^2 / variance_p - additive_p) )
ou gain_?, variance_? et additive_? correspondent aux paramètres -f, -u, -X pour la fréquence, -a, -v, -y pour l'amplitude et -y, -w, -z pour la phase.

    Le score d'une séquence de pics est donc le produit des scores de séquences de trois pics successifs, chacun de ces scores étant le produit de trois termes, le premier relatif à la variation de fréquence, le second à la variation d'amplitude et le troisieme à la variation de phase. Ces trois termes sont des gaussiennes ayant pour argument la derivée seconde discrète de la quantité considerée (fréquence, amplitude ou phase). Il s'en suit donc que le score est plus important lorsque cette derivée seconde est la plus faible possible et donc lorsque ces paramètres suivent des évolutions linéaires.
    La variance permet de contrôler quantitativement l'écart à la linéarite du paramètre; le gain permet de contrôler quant à lui le poids relatif de ces trois termes afin de donner plus d'importance à la fréquence, à l'amplitude ou à la phase dans le choix des partiels sélectionnes. Les trois paramètres additifs sont en fait redondants et ne sont qu'un seul et même paramètre multiplicatif global du score. Les séquences de pics de score inférieur à 1 etant immediatement rejetées, ce paramètre permet de ne sélectionner que les séquences de score important.
    Notons que l'implémentation de ce calcul dans hmm est faite avec le logarithme du score, ceci afin d'optimiser les calculs