Я пытаюсь определить воспринимаемую высоту звукового образца (только голос, без фона или музыки), чтобы затем идентифицировать голос как бас, тенор, альт, меццо-сопрано, сопрано.
Для выполненияпоэтому я использую aubio, который возвращает список временных кодов и соответствующую частоту любого данного аудиофайла.
Я изо всех сил пытаюсь найти наилучший способ использования данных для определения высоты тона.Моя первоначальная идея либо просто нехороша, либо плохо выполнена:
- Я беру список частот, возвращаемых aubio, и вычисляю медиану так:
// iterate through the time/frequencies returned by aubio
// $output is a list of number pairs (one pair per line):
// The timecode followed by a whitespace followed by the frequency
// at that timecode in hertz.
foreach($output as $sample) {
// extract frequency information
$freq_sample=substr($sample,strpos($sample,' '));
// add frequency to array
$freqs[]=floor($freq_sample);
}
// to calculate median frequency: sort array with frequencies
// and fetch the element in the middle
sort($freqs);
$median=$freqs[floor(count($freqs)/2)];
Затем я беру медианную найденную частоту и сопоставляю ее с "басами", "баритоном", "тенором", "альтом" и т. Д.
К сожалению, результаты противоречивы.Например, слишком часто средняя частота очень глубокого голоса получается слишком высокой.
Я считаю, что способ, которым я пытаюсь определить основную частоту, имеет недостаток, но я изо всех сил пытаюсь придуматьлучший подход.
Возникают, например, следующие вопросы:
Должен ли я отказаться от любых частот выше, например, 400 Гц, поскольку они, вероятно, из звуков, подобных "s""и т. д .?
Когда люди воспринимают высоту голоса, что мы на самом деле слушаем?Основная частота?Энергия определенных частот?
Общий вопрос, который суммирует это:
«Используя данные aubio, каков правильный программный подход для расчета воспринимаемого шагазаписи голоса (говорить, не петь)? "
РЕДАКТИРОВАТЬ - КАК Я ИСПОЛЬЗУЮ AUBIO
exec('aubiopitch /pathtomp3file/audio.mp3',$output);