2016-05-16 2 views
0

Я надеялся, что смогу найти способ получить данные амплитуды из mp3 в python. Подобно смелости, но я не хочу визуального, простой массив значений будет делать. Я хочу, чтобы мой код реагировал на звук в определенные моменты, когда он становился громче. Я использую pygame для воспроизведения звука и пытаюсь преобразовать его в sndarray, но это только дало мне первые 0.00018 секунды. В любом случае, я могу получить весь mp3? Это не должно быть в режиме реального времени, так как я хотел бы быть в состоянии реагировать раньше времени в любом случае и будет отслеживать мою позицию, используя pygame.Python - Получить форму волны/амплитуду mp3

Я создаю this cloud, используя вместо этого малиновый pi для других функций. У меня уже есть работа по освещению и нужно, чтобы она реагировала на молнию, огни, но это не вариант. Любая помощь будет принята с благодарностью

Редактировать: Так вот что я до сих пор благодаря кодер-дону. Он работает, но я зависаю в цикле while. Я не знаю почему. Mp3, который я использую, довольно длинный, может быть, проблема?

import os, sys 
from gi.repository import Gst, GObject 
Gst.init() 
GObject.threads_init() 

def get_peaks(filename): 
global do_run 

pipeline_txt = (
    'filesrc location="%s" ! decodebin ! audioconvert ! ' 
    'audio/x-raw,channels=1,rate=22050,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 = True 

def show_peak(bus, message): 
    global do_run 
    if message.type == Gst.MESSAGE_EOS: 
     pipeline.set_state(Gst.State.NULL) 
     do_run = False 
     return 
    # filter only on level messages 
    if message.src is not 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.MainContext() 
while ctx and do_run: 
    ctx.iteration() 

return peaks 

def normalize(peaks): 
    _min = min(peaks) 
    print(_min) 
    _max = max(peaks) 
    print(_max) 
    d = _max - _min 
    return [(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) 
+0

Я думаю, что это было уже задавала - http://stackoverflow.com/questions/9344888/getting-max-amplitude-for-an-audio-file-per-second?lq=1 HTTP: //stackoverflow.com/questions/10304495/python-getting-the-amplitudes-of-a-sound-file –

ответ

0

Используя pydub, вы можете получить loudness и highest amplitude из файла с mp3 очень легко. Затем вы можете использовать один из этих параметров, чтобы заставить код/​​свет реагировать на это.

С pydub сайта,

AudioSegment (...) .max

наибольшую амплитуду любого образца в AudioSegment. Полезно для таких вещей, как нормализация (которая предоставляется в pydub.effects.normalize).

from pydub import AudioSegment 
sound = AudioSegment.from_file("/path/to/sound.mp3", format="mp3")  
peak_amplitude = sound.max 

AudioSegment (...) .dBFS

Возвращает громкость AudioSegment в DBFs (дБ по отношению к максимально возможной громкости). Квадратная волна с максимальной амплитудой будет примерно 0 dBFS (максимальная громкость), тогда как синусоидальная волна с максимальной амплитудой будет примерно -3 dBFS.

from pydub import AudioSegment 
sound = AudioSegment.from_file("/path/to/sound.mp3", format="mp3") 
loudness = sound.dBFS 

 Смежные вопросы

  • Нет связанных вопросов^_^