Saltar al contenido

Lectura de archivos *.wav en Python

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *