Un mémo quand j'ai écrit le code pour afficher la forme d'onde de la voix. Il est facile d'utiliser librosa.display.waveplot, qui est une bibliothèque appelée librosa, mais comme une erreur se produit lorsque le nombre de données dans le fichier audio est important, la méthode d'affichage à l'aide de matplotlib.pyplot est également décrite.
Le moyen le plus simple.
import librosa
def make_waveform_librosa(filename):
y, sr = librosa.load(filename)
librosa.display.waveplot(y, sr=sr)
make_waveform_librosa("test.mp3")
Toutefois, si le nombre de données dans le fichier audio à lire est important, OverflowError: dépassement de la limite de bloc de cellules peut se produire et la forme d'onde peut ne pas s'afficher correctement.
Étant donné que la taille de bloc de l'agrégation exécutée sur le back-end de matplotlib peut être modifiée, il est possible de la gérer même lorsque le nombre de données dans le fichier audio est important.
import matplotlib.pyplot as plt
import matplotlib
import librosa
def make_waveform_pyplot(filename):
y, sr = librosa.load(filename)
totaltime = len(y)/sr
time_array = np.arange(0, totaltime, 1/sr)
mpl.rcParams['agg.path.chunksize'] = 100000
fig, ax = plt.subplots()
formatter = mpl.ticker.FuncFormatter(lambda s, x: time.strftime('%M:%S', time.gmtime(s)))
ax.xaxis.set_major_formatter(formatter)
ax.set_xlim(0, totaltime)
ax.set_xlabel("Time")
ax.plot(time_array, y)
plt.show()
make_waveform_pyplot("test.mp3")
En faisant référence à here, la taille du morceau a été écrite comme suit, donc je l'ai réglée à 100000 de manière appropriée.
### Agg rendering
### Warning: experimental, 2008/10/10
#agg.path.chunksize : 0 # 0 to disable; values in the range
# 10000 to 100000 can improve speed slightly
# and prevent an Agg rendering failure
# when plotting very large data sets,
# especially if they are very gappy.
# It may cause minor artifacts, though.
# A value of 20000 is probably a good
# starting point.
J'ai pu sortir le même que librosa.display.waveplot.
Puisque librosa.display.waveplot utilise également matplotlib en interne, je pense qu'il sera possible de l'afficher en jouant avec chunksize de la même manière, mais je pense qu'il faut jouer directement avec le code de la librairie.
Recommended Posts