Getting Max Amplitude For An Audio File Per Second
I know there are some similar questions here, but most of them are concerning generating waveform images, which is not what I want. My goal is to generate a waveform visualization
Solution 1:
If you allow gstreamer, here is a little script that could do the trick. It accept any audio file that gstreamer can handle.
- Construct a gstreamer pipeline, use audioconvert to reduce the channels to 1, and use level module to get peaks
- Run the pipeline until EOS is hit
- Normalize the peaks from the min/max found.
Snippet:
import os, sys, pygst
pygst.require('0.10')
import gst, gobject
gobject.threads_init()
defget_peaks(filename):
global do_run
pipeline_txt = (
'filesrc location="%s" ! decodebin ! audioconvert ! ''audio/x-raw-int,channels=1,rate=44100,endianness=1234,''width=32,depth=32,signed=(bool)True !''level name=level interval=1000000000 !''fakesink' % filename)
pipeline = gst.parse_launch(pipeline_txt)
level = pipeline.get_by_name('level')
bus = pipeline.get_bus()
bus.add_signal_watch()
peaks = []
do_run = Truedefshow_peak(bus, message):
global do_run
if message.type == gst.MESSAGE_EOS:
pipeline.set_state(gst.STATE_NULL)
do_run = Falsereturn# filter only on level messagesif message.src isnot level or \
not message.structure.has_key('peak'):
return
peaks.append(message.structure['peak'][0])
# connect the callback
bus.connect('message', show_peak)
# run the pipeline until we got eos
pipeline.set_state(gst.STATE_PLAYING)
ctx = gobject.gobject.main_context_default()
while ctx and do_run:
ctx.iteration()
return peaks
defnormalize(peaks):
_min = min(peaks)
_max = max(peaks)
d = _max - _minreturn [(x - _min) / d for x in peaks]
if __name__ == '__main__':
filename = os.path.realpath(sys.argv[1])
peaks = get_peaks(filename)
print'Sample is %d seconds' % len(peaks)
print'Minimum is', min(peaks)
print'Maximum is', max(peaks)
peaks = normalize(peaks)
print peaks
And one output example:
$ python gstreamerpeak.py 01\ Tron\ Legacy\ Track\ 1.mp3
Sample is182 seconds
Minimum is-349.999999922
Maximum is-2.10678956719
[0.0, 0.0, 0.9274581631597019, 0.9528318436488018, 0.9492396611762614,
0.9523404330322813, 0.9471685835966183, 0.9537281219301242, 0.9473486577135167,
0.9479292126411365, 0.9538221105563514, 0.9483845795252251, 0.9536790832823281,
0.9477264933378022, 0.9480077366961968, ...
Post a Comment for "Getting Max Amplitude For An Audio File Per Second"