Ogni ogni frase, ogni parola ma anche ogni singola lettera possono essere pronunciati in maniera diversa da persona a persona. In particolare persone diverse possono impiegare tempi diversi per pronunciare lo stesso fonema. Queste differenze rappresentano un forte ostacolo per i processi di riconoscimento del parlato, non è possibile confrontare direttamente segnali audio.
Una possibile soluzione agli “sfasamenti” è rappresentata dalle tecniche basate sul Dynamic Time Warping. Questo tipo di tecnica tenta di normalizzare la durata dei frame del parlato da riconoscere con quella dei frame memorizzati durante la fase di training, si “dilata” o si “contrae” l’asse dei tempi in modo da far coincidere i picchi di segnale.

L’algoritmo del Dynamic time warping permette l’allineamento tra due sequenze in modo da eliminare gli sfasamenti dovuti alla soggettività delle persone. Una possibile implementazione del calcolo di una misura di distanza, quando le due sequenze sono stringhe di simboli discreti. d(x, y) è la distanza tra i simboli, e.g. d(x, y) = | x – y | (fonte Wikipedia):
int DTWDistance(char s[1..n], char t[1..m]) {
declare int DTW[0..n, 0..m]
declare int i, j, cost
for i := 1 to m
DTW[0, i] := infinity
for i := 1 to n
DTW[i, 0] := infinity
DTW[0, 0] := 0
for i := 1 to n
for j := 1 to m
cost:= d(s[i], t[j])
DTW[i, j] := cost + minimum(DTW[i-1, j ], // insertion
DTW[i , j-1], // deletion
DTW[i-1, j-1]) // match
return DTW[n, m]
}
Photo Credit Wikimedia Commons.