python - usar - Cómo trazar un archivo wav
python text to speech español (4)
Acabo de leer un archivo wav con scipy y ahora quiero hacer la gráfica del archivo usando matplotlib, en la "escala y" quiero ver la aplitude y sobre la "escala x" quiero ver el número de fotogramas ! Cualquier ayuda, ¿cómo puedo hacer esto? ¡Gracias!
from scipy.io.wavfile import read
import numpy as np
from numpy import*
import matplotlib.pyplot as plt
a=read("C:/Users/Martinez/Desktop/impulso.wav")
print a
Alternativamente, si desea utilizar SciPy, también puede hacer lo siguiente:
from scipy.io.wavfile import read
import matplotlib.pyplot as plt
# read audio samples
input_data = read("Sample.wav")
audio = input_data[1]
# plot the first 1024 samples
plt.plot(audio[0:1024])
# label the axes
plt.ylabel("Amplitude")
plt.xlabel("Time")
# set the title
plt.title("Sample Wav")
# display the plot
plt.show()
Aquí hay una versión que también manejará entradas estéreo, según la respuesta de @ederwander
import matplotlib.pyplot as plt
import numpy as np
import wave
file = ''test.wav''
with wave.open(file,''r'') as wav_file:
#Extract Raw Audio from Wav File
signal = wav_file.readframes(-1)
signal = np.fromstring(signal, ''Int16'')
#Split the data into channels
channels = [[] for channel in range(wav_file.getnchannels())]
for index, datum in enumerate(signal):
channels[index%len(channels)].append(datum)
#Get time from indices
fs = wav_file.getframerate()
Time=np.linspace(0, len(signal)/len(channels)/fs, num=len(signal)/len(channels))
#Plot
plt.figure(1)
plt.title(''Signal Wave...'')
for channel in channels:
plt.plot(Time,channel)
plt.show()
Puede llamar a wave lib para leer un archivo de audio.
Para graficar la forma de onda, use la función "plot" de matplotlib
import matplotlib.pyplot as plt
import numpy as np
import wave
import sys
spf = wave.open(''wavfile.wav'',''r'')
#Extract Raw Audio from Wav File
signal = spf.readframes(-1)
signal = np.fromstring(signal, ''Int16'')
#If Stereo
if spf.getnchannels() == 2:
print ''Just mono files''
sys.exit(0)
plt.figure(1)
plt.title(''Signal Wave...'')
plt.plot(signal)
plt.show()
Tendrás algo así como:
Para graficar el eje x en segundos, necesitas obtener la velocidad de cuadros y dividir por el tamaño de tu señal, puedes usar la función linspace de numpy para crear un vector de tiempo espaciado linealmente con el tamaño del archivo de audio y finalmente puedes usar plot de nuevo como plt.plot(Time,signal)
import matplotlib.pyplot as plt
import numpy as np
import wave
import sys
spf = wave.open(''Animal_cut.wav'',''r'')
#Extract Raw Audio from Wav File
signal = spf.readframes(-1)
signal = np.fromstring(signal, ''Int16'')
fs = spf.getframerate()
#If Stereo
if spf.getnchannels() == 2:
print ''Just mono files''
sys.exit(0)
Time=np.linspace(0, len(signal)/fs, num=len(signal))
plt.figure(1)
plt.title(''Signal Wave...'')
plt.plot(Time,signal)
plt.show()
Nueva trama x-eje en segundos:
Solo una observación (no puedo agregar comentario).
Recibirás el siguiente mensaje:
Anuncio de depreciación: los códigos de tipo de estilo numérico están en desuso y darán lugar a un error en el futuro.
No use np.fromstring con binarios. En lugar de signal = np.fromstring(signal, ''Int16'')
, se prefiere usar signal = np.frombuffer(signal, dtype=''int16'')
.