Devoir "Cognitive restoration of reversed speech"

Enoncé de l'exercice

Lire le très court article "Cognitive Restoration of reversed speech" de Saberi et Perrot (http://www.pallier.org/ressources/tpexp3/Saberi.reversed.speech.Nature_1999.pdf).

Leurs données suggèrent qu'on peut renverser temporellement le signal de parole dans des fenêtres successives de 50 millisecondes de durées sans que l'intelligibilité soit affectée. Ce résultat est important car cette transformation a tendance à détruire des indices que l'on croyait très importants dans l'identification des sons de parole.

Je vous demande de réaliser au moins un stimulus où les échantillons sont inversés temporellement par segments de 50 millisecondes.

Vous pouvez utiliser l'un des fichiers (voire tous) : ph1.wav, ph2.wav, ph3.wav ou ph4.wav disponibles sur http://www.pallier.org/ressources/tpexp3.

Il est possible de réaliser cette opération manuellement dans Praat ("Extract sound selection" dans le menu File de la fénètre d'édition "Edit" et la fonction "Modify/Reverse" associé à un objet son sont vos amis).

Ceux qui sont à l'aise en maths et/ou en programmation peuvent implémenter cet algorithme dans le language de leur choix (python, praat, C, java...) et générer des versions avec des segments de longueurs différentes.

J'attend de vous une courte explication de ce que vous avez fait et la confirmation (?) que la ou les phrase ainsi transformée est bien compréhensible par un sujet naïf (i.e. qui ne l'a pas déja entendue).

Cet exercive ne doit pas prendre plus d'une heure (un peu plus éventuellement pour ceux qui s'aventuront à programmer). Si vous n'y arrivez pas, expliquez moi simplement ce que vous eters arrivé à faire et ce que vous avez essayé de faire sans succès.


Solutions

J'ai reçu des emails de Catherine Soares, Cova Florian, Y-Lan Boureau, Katrin Skoruppa, Olivier Morain, Eloïse Pain Prado. Remarque: évitez les fichiers .rar et .doc...
Y-Lan:

On ouvre le son dans l'éditeur de Praat, et grâce à l'indication du temps donnée très précisément par Praat, on sélectionne à la souris une tranche de 50 ms puis on utilise la fonction "inverser" du menu, puis on recommence avec la tranche temporelle suivante, et on fait comme ça jusqu'à la fin du fichier son.


Florian:
  1. Avec la commande « Convert » puis « Extract Part », j'ai divisé le son ph1 en fragments de 50 millisecondes (en demandant au logiciel d?extraire un son entre T et T.05).
  2. Après, on sélectionne toute la liste des extraits puis on les inverse tous d'un coup avec la commande « Modify » puis « Reverse ».
  3. Enfin, on associe tous les sons en un seul en les sélectionnant tous et en utilisant la commande « Combine sounds » puis « Concatenate »

Eloïse Pain Prado:
Move cursor to... 0
for i from 0 to 44
        curs=Get cursor
        Select... curs curs+0.05
        Reverse selection
        Move cursor to... curs+0.05
endfor

Katrin:
Read from file... D:\Katrin\MasterSciencesCo\ExpHum\ownstuff\ph1.wav

# entrer la longueur des tranches désirée
tranche = 0.12
reste = Get finishing time
n = floor (reste/tranche)
fin = n*tranche

Edit
editor Sound ph1

for i from 1 to n
x = tranche*(i-1)
y = tranche*i
Select... 'x' 'y'
Reverse selection
endfor

Select... 'fin' 'reste'
Reverse selection

endeditor
Rename... ph1rev
Write to WAV file... D:\Katrin\MasterSciencesCo\ExpHum\ownstuff\ph1rev.wav
Remove

Christophe:

Idée: appliquer aux indices du vecteur qui contiennent les échantillons la transformation:

 (1+x div 100)*100 - x modulo 100 /pre>





 Formula... self[(1+col div 2205)*2205-(col mod 2205)]



Généralisation:


procedure reverse_segments file$ newfile$ duration
 Read from file... /home/pallier/cours/methodo/phoneme.restauration/'file$'.wav
 Copy... 'newfile$'
 x = Get sampling frequency
 length = (duration * x) div 1000
 Formula... self[(1+col div length)*length-(col mod length)]
 Write to WAV file... /home/pallier/cours/methodo/phoneme.restauration/'newfile$'.wav
endproc

call reverse_segments "ph1" "100ph1"  100
call reverse_segments "ph1" "50ph1" 50
call reverse_segments "ph2" "100ph2" 100
call reverse_segments "ph2" "50ph2" 50