Lecture du fichier WAV en Python
Méthode : Commande wavread
Pour lire un fichier WAV sous python avec les librairies sounddevice et soundfile, nous utiliserons la fonction read. la syntaxe que nous utiliserons sera la suivante :
import soundfile as sf
import numpy as np
s, Fe = sf.read(r'c:/tmp/mypython/la.wav')
s sera le signal, Fe la fréquence d'échantillonnage du signal. Le nombre de voie est donné par l'instruction :
s.shape
ou par l'instruction
s.ndim
Par exemple pour le fichier WAV suivant :
que vous enregistrerez dans le répertoire TS\sons, il faut entrer la commande :
import soundfile as sf
import numpy as np
s, Fe=sf.read(r'h:\TS\sons\la.wav')
Fondamental : Écoute d'un son
Pour écouter un son il faut utiliser la fonction play
du module sounddevice :
import soundfile as sf
import sounddevice as sd
import numpy as np
s, Fe=sf.read(r'h:\TS\sons\la.wav')
sd.play(s, Fe)
sd.wait()
Après l'exécution de ce programme, vous devriez entendre le la d'une guitare.
Remarque : Tableau numpy
Un son en python est un tableau numpy. Un son monophonique enregistré pendant 6.5367 secondes à la fréquence de 22050Hz(22050 mesures par seconde) sera un tableau Numpy composé de 144135 lignes et de 1 colonne. En stéréophonie le son aurait 2colonnes.
La commande sd.play(s,Fe) permet d'écouter le son. Mais c'est aussi un tableau que l'on peut écouter à l'envers : sd.play(s[ : :-1,], Fe)
. On peut aussi appliquer une fonction avant d'écouter le son : sd.play(numpy.sin(s), Fe)
Attention : Normalisation des données
La fonction sf.read
normalise les mesures entre -1 et +1. Cette mesure devrait normalement comprise entre -2^(nbits-1) et 2^(nbits-1)-1
Cette normalisation n'est pas gênante pour l'ensemble des calculs que nous ferons cette année.
Complément : Tracé du signal en fonction du temps
Pour tracer le signal en fonction du temps, if faut créer une variable te contenant le temps d'échantillonnage à partir de la fréquence d'échantillonnage Fe et du nombre d'échantillon N :
import soundfile as sf
import numpy as np
s, Fe= sf.read(r'h:\TS\sons\la.wav')
N = s.shape[0]
te = np.arange(0,N)/ Fe
Pour tracer le signal temporel, il suffit d'appliquer ce qui a été déjà vu ici.