Lecture du fichier WAV en Python

MéthodeCommande 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 :

1
import soundfile as sf
2
import sounddevice as sd
3
import numpy as np
4
5
s, Fe=sf.read(r'h:\TS\sons\la.wav')
6
sd.play(s, Fe)
7
sd.wait()

Après l'exécution de ce programme, vous devriez entendre le la d'une guitare.

RemarqueTableau 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)

AttentionNormalisation 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émentTracé 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 :

1
import soundfile as sf
2
import numpy as np
3
s, Fe= sf.read(r'h:\TS\sons\la.wav')
4
N = s.shape[0]
5
6
te = np.arange(0,N)/ Fe

Pour tracer le signal temporel, il suffit d'appliquer ce qui a été déjà vu ici.