119 votes

Lecture de fichiers *.wav en Python

J'ai besoin d'analyser un son écrit dans un fichier .wav. Pour cela, je dois transformer ce fichier en un ensemble de nombres (des tableaux, par exemple). Je pense que je dois utiliser le paquetage wave. Cependant, je ne sais pas comment il fonctionne exactement. Par exemple, j'ai fait ce qui suit :

import wave
w = wave.open('/usr/share/sounds/ekiga/voicemail.wav', 'r')
for i in range(w.getnframes()):
    frame = w.readframes(i)
    print frame

Grâce à ce code, je m'attendais à ce que la pression acoustique soit fonction du temps. En revanche, je vois un grand nombre de symboles étranges et mystérieux (qui ne sont pas des nombres hexadécimaux). Quelqu'un peut-il, s'il vous plaît, m'aider à résoudre ce problème ?

148voto

Alex Martelli Points 330805

Par la documentation , scipy.io.wavfile.read(somefile) renvoie un tuple de deux éléments : le premier est l'élément taux d'échantillonnage en échantillons par seconde, la seconde est une numpy avec toutes les données lues dans le fichier :

from scipy.io import wavfile
samplerate, data = wavfile.read('./output/audio.wav')

66voto

nak Points 962

L'utilisation de la struct module Vous pouvez prendre les cadres d'ondes (qui sont en 2 complémentaires binaire entre -32768 et 32767 (c'est-à-dire 0x8000 y 0x7FFF ). Ce fichier lit un fichier MONO, 16 bits, WAVE. J'ai trouvé cette page web très utile dans sa formulation :

import wave, struct

wavefile = wave.open('sine.wav', 'r')

length = wavefile.getnframes()
for i in range(0, length):
    wavedata = wavefile.readframes(1)
    data = struct.unpack("<h", wavedata)
    print(int(data[0]))

Cet extrait lit 1 trame. Pour lire plus d'une image (par exemple, 13), utilisez

wavedata = wavefile.readframes(13)
data = struct.unpack("<13h", wavedata)

42voto

PatriceG Points 1401

Différents modules Python pour lire les fichiers wav :

Il existe au moins les bibliothèques suivantes pour lire les fichiers audio wave :

L'exemple le plus simple :

Voici un exemple simple avec SoundFile :

import soundfile as sf
data, samplerate = sf.read('existing_file.wav') 

Format de la sortie :

Attention, les données ne sont pas toujours dans le même format, cela dépend de la bibliothèque. Cela dépend de la bibliothèque :

from scikits import audiolab
from scipy.io import wavfile
from sys import argv
for filepath in argv[1:]:
    x, fs, nb_bits = audiolab.wavread(filepath)
    print('Reading with scikits.audiolab.wavread:', x)
    fs, x = wavfile.read(filepath)
    print('Reading with scipy.io.wavfile.read:', x)

Sortie :

Reading with scikits.audiolab.wavread: [ 0.          0.          0.         ..., -0.00097656 -0.00079346 -0.00097656]
Reading with scipy.io.wavfile.read: [  0   0   0 ..., -32 -26 -32]

SoundFile et Audiolab renvoient des valeurs flottantes entre -1 et 1 (comme matab, c'est la convention pour les signaux audio). Scipy et wave renvoient des entiers, que vous pouvez convertir en flottants en fonction du nombre de bits d'encodage, par exemple :

from scipy.io.wavfile import read as wavread
samplerate, x = wavread(audiofilename)  # x is a numpy array of integers, representing the samples 
# scale to -1.0 -- 1.0
if x.dtype == 'int16':
    nb_bits = 16  # -> 16-bit wav files
elif x.dtype == 'int32':
    nb_bits = 32  # -> 32-bit wav files
max_nb_bit = float(2 ** (nb_bits - 1))
samples = x / (max_nb_bit + 1)  # samples is a numpy array of floats representing the samples

17voto

Matthias Points 177

IMHO, la façon la plus simple de récupérer les données audio d'un fichier son dans un tableau NumPy est la suivante SoundFile :

import soundfile as sf
data, fs = sf.read('/usr/share/sounds/ekiga/voicemail.wav')

Il prend également en charge les fichiers 24 bits dès le départ.

Il existe de nombreuses bibliothèques de fichiers sonores, j'ai écrit une vue d'ensemble où l'on peut voir quelques avantages et inconvénients. Il comporte également une page expliquant comment lire un fichier wav de 24 bits avec le wave module .

9voto

ch3rryc0ke Points 1104

Pour ce faire, vous pouvez utiliser la fonction scikits.audiolab module. Il nécessite NumPy et SciPy pour fonctionner, ainsi que libsndfile.

Attention, je n'ai pu le faire fonctionner que sur Ubunutu et pas sur OSX.

from scikits.audiolab import wavread

filename = "testfile.wav"

data, sample_frequency,encoding = wavread(filename)

Vous avez maintenant les données wav

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X