Ein Memo, als ich den Code schrieb, um die Wellenform der Stimme anzuzeigen. Es ist einfach, librosa.display.waveplot zu verwenden, eine Bibliothek namens librosa. Da jedoch ein Fehler auftritt, wenn die Anzahl der Daten in der Audiodatei groß ist, wird auch die Methode zur Anzeige mit matplotlib.pyplot beschrieben.
Der einfachste Weg.
import librosa
def make_waveform_librosa(filename):
y, sr = librosa.load(filename)
librosa.display.waveplot(y, sr=sr)
make_waveform_librosa("test.mp3")
Wenn jedoch die Anzahl der Daten in der zu lesenden Audiodatei groß ist, kann es zu OverflowError: Überschreiten des Zellenblocklimits kommen und die Wellenform wird möglicherweise nicht richtig angezeigt.
Da die Blockgröße des Aggs, das am hinteren Ende von matplotlib ausgeführt wird, geändert werden kann, ist es möglich, auch dann zu verarbeiten, wenn die Anzahl der Daten in der Audiodatei groß ist.
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")
Die Blockgröße wurde wie folgt geschrieben, wenn auf [hier] verwiesen wurde (https://matplotlib.org/xkcd/users/customizing.html), daher habe ich sie entsprechend auf 100000 eingestellt.
### 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.
Ich konnte dasselbe wie librosa.display.waveplot ausgeben.
Da librosa.display.waveplot auch intern matplotlib verwendet, denke ich, dass es möglich sein wird, es anzuzeigen, indem mit Chunksize auf die gleiche Weise gespielt wird, aber ich denke, dass es notwendig ist, direkt mit dem Code der Bibliothek zu spielen.
Recommended Posts