2016-04-29 6 views
0

Я нашел пример кода для получения тона, используя aubio, но я не уверен, что изменить, чтобы заставить его отображать шаг вторые приращения :Как использовать aubio для получения частоты каждого тона в серии тонов в python

import sys 
from aubio import source, pitch, freqtomidi 

if len(sys.argv) < 2: 
    print "Usage: %s <filename> [samplerate]" % sys.argv[0] 
    sys.exit(1) 

filename = sys.argv[1] 
downsample = 1 
samplerate = 44100/downsample 
if len(sys.argv) > 2: samplerate = int(sys.argv[2]) 

win_s = 4096/downsample # fft size 
hop_s = 512/downsample # hop size 


s = source(filename, samplerate, hop_s) 
samplerate = s.samplerate 

tolerance = 0.8 


pitch_o = pitch("yin", win_s, hop_s, samplerate) 
pitch_o.set_tolerance(tolerance) 

pitches = [] 
confidences = [] 

total_frames = 0 
while True: 
    samples, read = s() 
    pitch = pitch_o(samples)[0] 
    pitch = int(round(pitch)) 
    confidence = pitch_o.get_confidence() 
    #if confidence < 0.8: pitch = 0. 
    print "%f %f %f" % (total_frames/float(samplerate), pitch, confidence) 
    pitches += [pitch] 
    confidences += [confidence] 
    total_frames += read 
    if read < hop_s: break                                             

Кроме того, возможно ли это сделать непосредственно из вывода вместо wav-файла?

ответ

0

Этот скрипт (также в aubio/python/demos/demo_pitch.py) извлекает кандидат на каждый аудиокадр (здесь 512./44100 * 1000 = 11.6ms).

дисплей с шагом в секунде

Что вы имеете в виду «в секунде»? «Общий» шаг для каждого последовательного 1-секундного длинного сегмента? Вы могли бы взять np.median(pitches).

Новая подача после каждой ноты меняется? Вы можете обработать вывод и сгруппировать аналогичные кандидаты в ноты.

Или просто используйте aubionotes напрямую.

сделать это непосредственно с выхода

От которого "выход" вы имеете в виду?

См. Также run aubiopitch continuously on a file descriptor.

Пожалуйста, задайте свои вопросы aubio @https://github.com/aubio/aubio.