Визначте, де починається спів з голосового запису


14

У мене є невеликий додаток у стилі караоке, де користувач співає 4 рядки пісні, з розривом на одну секунду між кожним рядком. Немає музики, що підтримує музику, тому голос є лише голосом, сподіваємось, що проблему легше вирішити.

Я шукаю найбільш надійний спосіб точно визначити, де в моєму записі користувач починає і закінчує співочий рядок 1, починає і закінчує співочий рядок 2 тощо.

Я склав спільно спрощений алгоритм, який працює, коли в записі дуже мало фонового шуму (наприклад, коли це відбувається?), Але він падає на шматки при наявності найменшого шуму.

Чи може хтось вказати мені на щось більш міцне?


Моя відповідь може допомогти вам - dsp.stackexchange.com/a/1543/440
Dipan Mehta

У деяких записах голос - єдиний інструмент, який грається з однаковою амплітудою в обох каналах. Ви можете використовувати цю інформацію для вилучення голосу із стереозапису.
Джадер Діас

Відповіді:


4

Якщо фоновий шум є білим, ви можете виміряти спектральну площину і вважати його голосовим, коли амплітуда вище деякого порогу, а спектральна площинність - нижче деякого порогу.

В основному ви просто берете FFT відрізка сигналу, а потім ділите середнє значення геометричного спектру на середнє арифметичне.

Ви також можете використати смуговий фільтр, щоб підкреслити лише частотні області, де людський голос зазвичай сидить (так само просто, як встановити небажані області FFT на 0 перед вимірюванням спектральної плоскості)


Ендоліт, за вашим досвідом, чи має велике значення, якщо взяти квадрати величини VS лише величину, перш ніж вимірювати спектральну площину?
Спейсі

@Mohammad: Я не маю жодного досвіду з цим. :) Я задав попереднє запитання, тому що не зрозумів специфікацію, і досі не знаю, який спосіб є правильним. Я не думаю, що квадратик не має жодної практичної різниці. Якщо ви просто спрацьовуєте, коли він проходить поріг, він повинен однаково реагувати на квадрат чи ні (припускаючи, що ви налаштовуєте поріг на відповідність), тому лише величина обчислюється дешевше.
ендоліт

@Endolith, це трохи зйомки: чи знаєте ви, як реалізувати такий підхід у матлабі? Я хочу перевірити всі підходи, згадані тут у matlab (насправді октава), щоб побачити, що найкраще?
Майк Хоган

@MikeHogan: Ні, я давно не використовував матлаб. : / Також це вимагало б реальної роботи. :) У мене нічого попередньо не написано. Розбийте сигнал на невеликі шматки, зробіть FFT кожного з них, і для кожного FFT розділіть середнє геометричне значення на середнє арифметичне величини. більші числа - галасливі, нижчі - тональні.
ендоліт

3

Раніше я використовував спектральний потік і, здається, він працює добре. Основна ідея полягає в тому, щоб створити спектрограму свого сигналу в межах смуг, які вам цікаві. Припустимо, що ваша частота знаходиться на осі y, а ваш час - на осі x, як .

Це означає, що ваша спектрограма є матрицею. Кожен стовпець представляє абсолютне значення FFT одного оснащеного часу в часі вашого сигналу, і кожен рядок відображає, як з часом змінюється енергія однієї смуги.

Тепер просто візьміть різницю стовпців. Тобто візьміть стовпчик і відніміть із себе стовпець перед ним, і зробіть для всіх стовпців. (Очевидно, залишаючи стартові стовпці в спокої). Потім підсумовуйте всі смуги. Тобто, просто підсумовуйте всі рядки разом.

Ви будете в кінцевому підсумку з 1-D сигналу , який кодує сигнал вашого началами . Це підкаже, звідки починається ваш голос.

Редагувати:

Тепер, коли ви виявили набори, якщо ви хочете виявити протилежне (тобто, коли сигнал переходить від активності до жодної), спектральний потік фактично дає вам цю інформацію. Де б у вас не було наступу, у вас буде позитивний пік, і де б у вас не було десятки (за відсутністю кращого слова), ви матимете негативний пік.

Я б просто взяв перший позитивний пік і останній негативний пік, щоб позначити загальний час початку та зупинки мого сигналу.


Мохаммеде, що ви маєте на увазі під "рядом"?
Майк Хоган

@MikeHogan Будь ласка, подивіться мої зміни, я повторно написав відповідь.
Спейсі

Невже це не знайде наборів нічого? Також будуть виявлені удари барабану або інший імпульсний шум. Він не розрізняє тональні та галасливі звуки.
ендоліт

@endolith Ви піднімаєте хорошу точку - однак я вважаю, що це все одно може працювати. Моє міркування полягає в тому, що в цьому сценарії ви перебуваєте або в стані голосу + музики, або просто в музичному стані. Отже, обчислюючи спектральний потік, ви насправді просто обчислюєте дельту між голосом + музикою та просто музикою. (Звичайно, мені потрібно було б проаналізувати це набагато більше, але ось, як я зараз про це думаю) :-P
Spacey

1
@endolith Я просто перечитав, і ОП говорить, що є тільки голос (мабуть, це просте додаток), тому в цьому випадку це був би просто голос проти нічого.
Спейсі

2

Зі свого досвіду я б спробував вивчити коефіцієнти Мель-Частота-Шестигранні (MFCC) . MFCC досить легко здійснити, якщо у вас є FFT і використовується досить часто при обробці голосу.

За допомогою MFCC ви зможете відрізнити фактичні голосові дані від шуму.


@endolith, це посилання повністю поза мною! Чи знаєте ви про будь-яку реалізацію з відкритим кодом, яку я можу розглянути, або більш покроковий рецепт того, як це працює?
Майк Хоган

2

" Спектральний потік " (також його називають "спектральною різницею") є загальним методом "виявлення початку". В основному ви берете послідовні FFT сигналу і підсумовуєте величини відмінностей відра FFT від одного зразка до іншого. "Початок", як правило, буде представлений значним "стрибком" у цьому значенні.

Google "виявлення настання" для інших ідей.


2

Використання спектрального потоку поодинці може створювати помилкові позитиви щодо певних шумів, а також виявляти співочий голос.

Спів зазвичай передбачає вміст сигналу, що містить крок, тому ви можете використовувати детектор кроку або оцінювач (cepstrum тощо). Ви можете з розумом перевірити частку енергії, яка виявлена ​​як тактова, порівняно із загальною енергією сигналу, і на те, що орієнтовний крок знаходиться в межах людського голосу. Це знизило б помилково позитивну швидкість для невключеного шуму, а також музичних звуків поза нормальним діапазоном голосу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.