8.5 Archivos de Audio.wav – Abrir, extraer una porción

El manejo de archivo de audio en formato wav permite analizar varios conceptos como , en los cursos de Señales y Sistemas y Procesos estocásticos:

Modulación Delta Sigma

Señales de energía y potencia

Señales Analógicas y Digitales

Correlación(señal01,señal02)

Morse – Generador de Tonos

Conocer conceptos de la Unidad 4 para arreglos como vectores y matrices son suficientes para manejar archivos.wav.

1. Abrir archivo de audio.wav

Se requiere usar la libreria scipy.io.wavfile con el alias wave para usar las instrucciones para abrir, modificar y grabar un archivo de audio en formato wav. Con los datos se pueden graficar las ondas de sonido como la mostrada en la imagen.

Para mostrar el concepto se tiene como archivo ejemplo:

muestra_Invernal01.wav

El formato .wav es el más simple de manejar pues contiene directamente los datos de las muestras de sonido similar a la mostrada en la figura.

El primer parámetro a obtener es la frecuencia de muestreo en Hz, o cuántas muestras por segundo se realizan, y luego los datos del sonido.

# Abrir un archivo de audio .wav
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO 
# archivo = input('archivo de sonido:' )
archivo = 'muestra_Invernal01.wav'
muestreo, sonido = waves.read(archivo)

# PROCEDIMIENTO
tamano=np.shape(sonido)
canales=len(tamano)
tipo = 'estéreo'
if (canales<2):
    tipo = 'monofónico'
duracion = len(sonido) /muestreo

# SALIDA
print('muestreo (Hz) : ',muestreo)
print('canales: ' + str(canales) + ' tipo ' + tipo )
print('duración (s): ',duracion)
print('tamaño de matriz: ', tamano)
print(sonido)
plt.plot(sonido)
plt.show()

Con lo que obtiene la gráfica mostrada al inicio y los siguientes resultados:

muestreo (Hz) :  44100
canales: 2 tipo estéreo
duración (s):  15.0
tamaño de matriz:  (661500, 2)
[[-4355 -4561]
 [-4353 -4572]
 [-4347 -4578]
 ..., 
 [  120  1008]
 [  124   993]
 [  100   935]]

Referencias:
https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.io.wavfile.read.html

la librería de funciones scipy (scientific python), dispone de funciones para el tratamiento de señales, estadísticas, audio, entre otras.

El orden de las instrucciones es el que aparece en los post del blog.

instrucciones
import scipy.io.wavfile as waves librerias de audio en formato wac para lectura y escritura de archivos.
fsonido, sonido = waves.read(archivo) lectura de datos de un archivo de audio en formato wav. Se obtiene la frecuencia de muestreo en fsonido y los datos en sonido
import scipy.integrate as integrate importar metodos de integración de scipy
integrate.simps(valrores, ejex) integral de muestras de señal usando el método de Simpson.
. .
. .

2. Extraer una Porción del audio

Para extraer una porción de un archivo de audio se requiere: abrir el archivo, seleccionar la porción de interés y grabar el resultado un archivo de salida.

archivo origen: muestra_Invernal01.wav

archivo resultado: muestra_Invernal02.wav

La porción puede ser indicada en unidades de tiempo que luego deben ser convertidas a índices de muestras para extraer la porción requerida.

El procesamiento del archivo simplificado en Python es:

# Extrae porción de un archivo de audio .wav
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO 
# archivo = input('archivo de sonido:' )
archivo = 'muestra_Invernal01.wav'
archivosalida = 'muestra_Invernal02.wav'
# tiempo en segundos
desde = 7.5
hasta = 10.2

muestreo, sonido = waves.read(archivo)

# PROCEDIMIENTO
# indices de muestras
idesde = int(desde*muestreo)
ihasta = int(hasta*muestreo)
porcion = sonido[idesde:ihasta,:]
duracion = len(porcion)/muestreo

# SALIDA
waves.write(archivosalida, muestreo, porcion)
print('archivo creado: ', archivosalida)

La instrución waves.write() requiere el nombre del archivo de salida, la velocicad de muestreo y los datos a grabar.

Ejercicio

Si el archivo de origen es estéreo, extraer un solo canal y convertirlo a monofónico.

Referencia: https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.io.wavfile.write.html