Как использовать aubio для получения частоты каждого тона в серии тонов в питоне
Я нашел пример кода для получения высоты тона с помощью aubio, но я не уверен, что изменить, чтобы заставить его отображать высоту тона с точностью до секунды:
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?
1 ответ
Этот сценарий (также в aubio/python/demos/demo_pitch.py
) извлекает кандидата на высоту тона для каждогоаудиокадра(здесь 512./44100 * 1000 = 11,6 мс).
отображать высоту тона в секундах
Что вы подразумеваете под "во втором шаге"? "Общая" высота для каждого последовательного 1-секундного длинного сегмента? Вы могли бы взять np.median(pitches)
,
Новый шаг после каждого изменения ноты? Вы можете обработать вывод и сгруппировать схожие кандидаты на подачу в заметки.
Или просто использовать aubionotes
непосредственно.
сделать это прямо из вывода
Из какого "выхода" ты имеешь ввиду?
Смотрите также непрерывный запуск aubiopitch для файлового дескриптора.
Пожалуйста, задавайте свои вопросы aubio @ https://github.com/aubio/aubio.