voz usar texto spanish reconocimiento pyttsx hacer español convertir control con como comando asistente python audio matplotlib

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'') .