\chapter{Monolocuteur}

\section{Calcul des paramètres LPC (Linear Predictive Coding)}

LPC est une des plus performantes techniques d'analyse de la parole, et une
des méthodes les  plus utiles pour encoder la parole en  bonne qualité et à
un faible  bitrate. Elle fournit  des estimations extrêmement  précises des
paramètres de la parole.

\subsection{Principes de base}

LPC  part du  principe  que le  signal de  la  parole est  produit par  une
vibration à  l'extrémité d'un  tube. La glotte  (l'espace entre  les cordes
vocales) produit cette vibration, qui est caractérisée par son intensité et
sa fréquence. La région vocale (la gorge et la bouche) forment le tube, qui
est caractérisé par ses résonances, appelées \textit{formants}.

LPC analyse  le signal de la  parole en estimant les  formants, en enlevant
leurs effets  du signal et  en estimant l'intensité  et la fréquence  de la
vibration résultante.  Le processus de suppression des  formants est appelé
\textit{filtrage   inverse},  et   le  signal   résultant  est   appelé  le
\textit{résidu}.

Les données représentant les formants et le résidu peuvent être stockées ou
transmises.  LPC peut  synthétiser  un  signal de  parole  en inversant  le
processus  : il  utilise  le résidu  pour  créer un  signal  source et  les
formants pour créer un filtre.

Comme le signal de la parole varie avec le temps, ce processus est effectué
sur des  petites parties  du signal, qui  sont appelées  \textit{fenêtres}. 
Habituellement, trente à cinquante  fenêtres par seconde donnent une parole
intelligible et une bonne compréhension.

\subsection{Estimation des formants}
Le problème basique du système LPC est de déterminer les formants du signal
de  la parole.  La solution  basique est  une équation  différentielle, qui
donnent l'expression de chaque  échantillon du signal comme une combinaison
linéaire  des  autres  échantillons.  Une  telle équation  est  appelée  un
\textit{prédicateur linéaire}.

Les coefficients de  l'équation différentielle (les \textit{coefficients de
  prédiction}) caractérisent les formants, donc  le système de LPC a besoin
d'estimer ses  coefficients. Ces estimations  sont faites en  minimisant le
carré de l'erreur entre le signal prédit et le signal actuel.

En pratique, ce problème implique  le calcule d'une matrice de coefficients
et  la solution  d'un  ensemble d'équations  linéaires. Plusieurs  méthodes
(autocorrélation, covariance,  ...) peuvent être utilisées  pour assurer la
convergence vers une unique solution.

\subsubsection{Complexité du tube}
Cela peut  sembler surprenant qu'un  signal puisse être caractérisé  par un
prédicateur linéaire aussi simple. En fait, pour que ce système fonctionne,
le tube ne doit avoir aucune branches secondaires.

Pour les voyelles  ordinaire, la région vocale est  bien représentée par un
simple tube.  Pourtant, pour les  sons nasaux, la  cavité du nez  forme une
branche  secondaire.  Théoriquement ces  sons  demanderaient un  algorithme
différent et  plus compliqué. En  pratique, cette différence est  en partie
ignorée et en partie réglée durant le codage du résidu (voir plus bas).

\subsection{Encoder la source}
Si les  coefficients de prédiction sont  efficaces, et que  le reste marche
bien, le signal de la parole peut être filtré inverse par le prédicateur et
le résultat sera la source pure  (la vibration). Pour un tel signal, il est
simple d'extraire la fréquence et l'amplitude et de les encoder.

Cependant, certaines consonnes sont produites avec un flux d'air inégal, ce
qui donne  un sifflement. Heureusement,  l'équation de prédiction  ne prend
pas en compte  le fait que le son soit  périodique (vibration) ou chaotique
(sifflement).

Cela veut dire  que pour chaque fenêtre, l'encodeur LPC  doit décider si le
son source est  une vibration ou un sifflement. Si  c'est une vibration, il
doit en estimer la fréquence, sinon il doit en estimer l'intensité. Il doit
alors  encoder ces  informations de  manière à  ce que  le  décodeur puisse
refaire toutes  ces étapes en ordre  inverse. L'algorithme \textbf{LPC-10e}
fonctionne ainsi : il utilise un nombre pour représenter la fréquence de la
vibration, et le nombre 0 est compris comme un sifflement.

\subsubsection{Complexité du sifflement}
Malheureusement les  choses ne sont pas  si simples. Certains  sons sont en
fait une combinaison de vibrations  et de sifflements. Ces sons ne pourront
pas être reproduit efficacement par l'encodeur LPC.

Un   autre   problème  est   qu'inévitablement,   toute  imprécision   dans
l'estimation des formants implique que plus d'informations sont laissées dans
le résidu. Les  aspects des sons nasaux qui ne  correspondent pas au modèle
LPC, par exemple seront compris dans le résidu. Il existe d'autres sons qui
ne correspondent pas  au modèle, des branches secondaires  induites pas des
positions de la langue pour former certaines consonnes, \dots

Par  conséquent, le  résidu contient  des informations  importantes  sur la
manière  dont  la  parole  doit  sonner,  et  la  synthèse  LPC,  sans  ces
informations,  donnera une  parole  de faible  qualité.  Pour de  meilleurs
résultats, on pourrait juste envoyer le  signal du résidu et la synthèse du
LPC sonnerait  mieux. Malheureusement, l'idée de cette  technique est aussi
de compresser  le signal de la parole  et le signal résidu  prend autant de
place que le signal original, il n'y aurait donc plus de compression.

\subsection{Encoder le résidu}
Plusieurs tentatives  ont été  faites pour encoder  le signal du  résidu de
manière  efficace,  en  donnant  un  résultat de  meilleur  qualité  de  le
\textbf{LPC-10e}  sans  trop  augmenter  le  bitrate. La  méthode  la  plus
performante utilise  un \textit{codebook}, une table  des résidus typiques,
qui est fournie par les créateurs du système. L'analyseur compare le résidu
avec toutes les entrées du  codebook, choisi l'entrée la plus ressemblante,
et l'utilise pour \textit{exiter} le filtre de formants. Les méthodes de ce
types sont appelées \textit{Code Excited Linear Prediction} (CELP).

Pour que les CELP fonctionnement  correctement, le codebook doit être assez
important pour inclure tous les types de résidus. Mais s'il est trop grand,
cela  va prendre  beaucoup  de temps  de  chercher dedans...  Le plus  gros
problème  est qu'un  tel système  exigerait un  code différent  pour chaque
fréquence différente de la source,  ce qui rendrait le codebook extrêmement
grand.

Ce problème  peut être  résolu en utilisant  deux petits codebooks  au lieu
d'un gros. Un premier codebook est fixé par les créateurs et contient juste
assez  de codes  pour  représenter  une fréquence  du  résidu. L'autre  est
adaptatif, il  démarre vide,  et est remplis  durant l'opération,  avec des
copies des précédents résidus.


\section{Calcul des Mel-Frequency Cepstrum Coefficients (MFCC)}

% intro... qu'est ce que la mfcc, pkoi ca ameliore
% Mel-Frequency Cepstrum Coefficients (MFCC)

La fonction de la MFCC est à  peu près identique à celle du LPC. Néanmoins,
la MFCC  est plus robuste au  bruit que le LPC.  Les coefficients cepstraux
permettent de  mettre en avant  certaines fréquences (en  l'occurence, nous
voulons mettre en avant la voix).


\subsubsection{Principe de l'algorithme}

Les différentes phases de d'algorithmes sont:
\begin{enumerate}
\item Nous découpons le signal en plusieurs fenêtres qui se recoupent entre
  elles.  Par exemple  si nous découpons un signal en  $x$ fenêtres de 256,
  avec un  recoupement de  100, alors, la  première fenêtre sera  0-255, la
  seconde 155-411, etc \dots Nous appliquerons la MFCC à chaque fenêtre.

\item
  Afin de diminuer  la distorsion spectrale nous appliquons  une fenêtre de
  Hamming au signal :

  $$
  W(n) = 0.54 - 0.46 * cos(\frac{2 \pi n}{N - 1})
  $$

  Par la suite nous multiplions cette fonction par le signal à transformer,
  nous minimisons ainsi la distorsion spectrale créée par le recoupement.
  
\item Nous  appliquons ensuite  la FFT  à la fenêtre  pour en  ressortir la
  magnitude, on obtient donc le spectre.
  
\item Nous  passeons à l'échelle  de Mel.  En  effet, après des  études sur
  l'ouïe  humaine, il  a été  montré que  l'homme se  base sur  une échelle
  fréquentielle spécifique. La formule de transfert est simple :

  $$
  mel(f) = 2595 * log_{10}(1 + \frac{f}{100})
  $$

  Pour simuler  l'oreille humaine,  il faut passer  par un Banc  Filtre, un
  filtre  pour chaque  fréquence que  l'on  cherche.  Ces  filtres ont  une
  réponse  de  bande passante  triangulaire.   Pour connaître  l'intervalle
  entre chaque  filtre, on utilise  une constante: Mel-Frequency  interval.
  Nous utilisons 20 filtres. Nous verrons plus loin le détails des filtres.

\item

  Pour  finir, nous  travaillons  avec le  Cepstre,  nous convertissons  le
  spectre logarithmique de Mel en temps au moyen de la DCT (Discret Cosinus
  Transform). La formule de cette transformation est simple :

  $$
  y(k) = \sum_{n=1}^{N} w(n)x(n) cos(\frac{\pi(2\pi - 1)(k - 1)}{2N})
  $$
  
  avec $k = 1,  1, \cdots, N$ et où $w(n) =  \sqrt{\frac{1}{N}}$ si $n = 1$
  et $w(n) = \sqrt{2}{N}$ sinon. $N$ est la taille du signal.

  Ainsi, nous  réduisons le  nombre de données  caractérisant le  signal et
  nous en ressortons 13 (dans notre cas) coefficients cepstraux par fenêtre
  ( 6 dans notre cas).

  En général, il est conseillé de travailler sur ces coefficients cepstraux
  en prenant en compte toutes les sous fenêtres.

  Dans  notre  cas,  vu  que   l'on  veut  retrouver  juste  une  empreinte
  caractéristique,  nous  faisons la  moyenne  des  sous  empreintes de  la
  portion de  signal sur  laquelle nous travaillons,  ce qui nous  donne au
  final une empreinte très caractéristique.

\end{enumerate}

\subsubsection{Filtres utilisés}

Nous  utilisons un  banc  de  filtres triangulaires  tel  que proposé  dans
\cite{huang} ou chaque filtre $m$ est donné par:

\begin{equation}
H_m[k] = \left\{ 
\begin{array}{ll}
0                                                & k < f[m-1]\\
\frac{2(k-f[m-1])}{(f[m+1]-f[m-1])(f[m]-f[m-1])} & f[m-1] \le k \le f[m]\\
\frac{2(f[m+1]-k)}{(f[m+1]-f[m-1])(f[m+1]-f[m])} & f[m] \le k \le f[m+1]\\
0                                                & k > f[m+1]
\end{array}
\right.
\end{equation}

La figure \ref{mfccfig} illustre cette formule.

\begin{figure}
  \begin{center}
    \caption{Filtres triangulaires utilisés\label{mfccfig}}
    \includegraphics[width=\textwidth]{MFCC}
  \end{center}
\end{figure}

A la suite  de MFCC et de  LPC, nous avons implémenté une  DTW. Le fonction
est celui courament recontré. Nous  possèdons une base d'exemples à comparer
et plusieurs exemples peuvent être associés à un seul mot.


\section{Résultats}

Les  résultats  de l'utilisation  de  LPC  et de  MFCC  avec  DTW sont  peu
concluants. Nous avons  réussis à obtenir environ 60\%  de reconnaissance en
monolocuteur. Malgrés nos  efforts nous n'avons pas réussit  à améliorer ses
résultats.


