Марсий был бы отличным выбором для этого, он создан именно для такого рода задач.
Для настройки инструмента вам нужно иметь алгоритм, который оценивает основную частоту (F0) звука. Для этого существует ряд алгоритмов, одним из новейших и лучших является алгоритм YIN, разработанный Аленом де Шевенем. Я недавно добавил алгоритм YIN к Marsyas, и использовать его очень просто.
Вот базовый код, который вы бы использовали в Marsyas:
MarSystemManager mng;
// A series to contain everything
MarSystem* net = mng.create("Series", "series");
// Process the data from the SoundFileSource with AubioYin
net->addMarSystem(mng.create("SoundFileSource", "src"));
net->addMarSystem(mng.create("ShiftInput", "si"));
net->addMarSystem(mng.create("AubioYin", "yin"));
net->updctrl("SoundFileSource/src/mrs_string/filename",inAudioFileName);
while (net->getctrl("SoundFileSource/src/mrs_bool/notEmpty")->to<mrs_bool>()) {
net->tick();
realvec r = net->getctrl("mrs_realvec/processedData")->to<mrs_realvec>();
cout << r(0,0) << endl;
}
Этот код сначала создает объект Series, в который мы будем добавлять компоненты. В серии каждый из компонентов последовательно получает выходные данные предыдущей системы MarSystem. Затем мы добавляем SoundFileSource, в который вы можете загружать файлы .wav или .mp3. Затем мы добавляем объект ShiftInput, который выводит перекрывающиеся фрагменты звука, которые затем передаются в объект AubioYin, который оценивает основную частоту этого фрагмента звука.
Затем мы сообщаем SoundFileSource, что хотим прочитать файл в AudioFileName.
Затем оператор while повторяется до тех пор, пока в SoundFileSource не закончатся данные. Внутри цикла while мы берем данные, которые сеть обработала, и выводим элемент (0,0), который является оценкой основной частоты.
Это становится еще проще, если вы используете привязки Python для Marsyas.
person
sness
schedule
06.07.2009