Te damos la bienvenida a nuestro espacio, ahora vas a encontrar la respuesta de lo que estás buscando.
Solución:
Según la documentación, scipy.io.wavfile.read(somefile)
devuelve una tupla de dos elementos: el primero es la tasa de muestreo en muestras por segundo, el segundo es un numpy
array con todos los datos leídos del archivo:
from scipy.io import wavfile
samplerate, data = wavfile.read('./output/audio.wav')
Utilizando el struct
módulo, puede tomar los marcos de onda (que están en binario complementario de 2 entre -32768 y 32767 (es decir, 0x8000
y 0x7FFF
). Esto lee un archivo MONO, 16-BIT, WAVE. Encontré esta página web bastante útil para formular esto:
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("
Este fragmento lee 1 cuadro. Para leer más de un cuadro (p. ej., 13), utilice
wavedata = wavefile.readframes(13)
data = struct.unpack("<13h", wavedata)
Diferentes módulos de Python para leer wav:
Hay al menos estas bibliotecas siguientes para leer archivos de audio de onda:
- Archivo de sonido
- scipy.io.wavfile (de scipy)
- wave (para leer flujos. Incluido en Python 2 y 3)
- scikits.audiolab (sin mantenimiento desde 2010)
- dispositivo de sonido (reproduce y graba sonidos, bueno para transmisiones y en tiempo real)
- cochinillo
- librosa (análisis de música y audio)
- madmom (fuerte enfoque en tareas de recuperación de información musical (MIR))
El ejemplo más simple:
Este es un ejemplo simple con SoundFile:
import soundfile as sf
data, samplerate = sf.read('existing_file.wav')
Formato de la salida:
Advertencia, los datos no siempre están en el mismo formato, eso depende de la biblioteca. Por ejemplo:
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)
Producción:
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 y Audiolab devuelven valores flotantes entre -1 y 1 (como lo hace matab, esa es la convención para las señales de audio). Scipy y wave devuelven números enteros, que puede convertir en flotantes según la cantidad de bits de codificación, por ejemplo:
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
Si tienes algún titubeo y forma de aclarar nuestro crónica te inspiramos añadir una ilustración y con deseo lo observaremos.