Найпростіший спосіб виявити, де починаються та зупиняються звукові конверти


43

Нижче - сигнал, який представляє запис того, хто говорить. Я б хотів створити на основі цього ряд менших аудіосигналів. Ідея полягає в тому, щоб визначити, коли починається і закінчується важливий звук, і використовувати їх для маркерів для створення нового фрагмента звуку. Іншими словами, я хотів би використовувати тишу в якості індикаторів, коли аудіо "шматок" починається або зупиняється, і створювати нові звукові буфери на основі цього.

Так, наприклад, якщо людина записує себе, що говорить

Hi [some silence] My name is Bob [some silence] How are you?

то я хотів би зробити з цього три аудіокліпи. Той, що каже Hi, той, що говорить, My name is Bobі той, що говорить How are you?.

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

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

Я не фахівець в DSP, але розумію деякі основні поняття. Також я б це робив програмно, тому було б найкраще поговорити про алгоритми та цифрові зразки.

Дякую за всю допомогу!

введіть тут опис зображення


ЗРІД 1

Чудові відгуки поки що! Просто хотів уточнити, що це не в прямому ефірі, і я сам буду писати алгоритми на C або Objective-C, тому будь-які рішення, які використовують бібліотеки, насправді не є варіантом.


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

@JimClay Так, саме це я намагаюся зробити. Я ніколи не чув про обмеження потужності, але це звучить як щось, що я міг би використати. Це складно? Чи можете ви трохи розширити це?
Ерік Бротто

@EricBrotto Можливо, ви повинні трохи розповісти про те, якими можливостями володієте у ваших бібліотеках. Це дозволить нам краще змалювати фактичну методологію для вас.
Спейсі

цей підхід для виявлення тиші є кращим ?? яким повинен бути рівень власності, крім 0,05 x = wavread ('s1.wav'); i = 1; тоді як abs (x (i)) <0,05% виявлення тиші i = i + 1; кінець x (1: i) = []; x (6000: 10000) = 0;
zeee

Відповіді:


26

Це класична проблема виявлення мовлення . Перше, що потрібно зробити - це концепція Google. Він широко використовується в цифровій комунікації, і там було проведено багато досліджень з цього питання, і там є хороші документи.

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

Дивлячись на приєднану форму хвилі, ваш шум мінімальний, тому я пропоную наступне:

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

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

введіть тут опис зображення

Вилучення конвертів можна здійснити, створивши новий сигнал, який містить абсолютні значення початкового сигналу, наприклад стає , а потім фільтрувати результат з низькою прохідністю . Найпростіший фільтр низьких частот можна реалізувати, замінивши кожне значення вибірки середнім числом його N сусідів з обох сторін. Найкраще значення N може бути знайдено експериментально і може залежати від кількох речей, таких як ваша частота вибірки.{1,45,6,2,43,2}{1,45,6,2,43,2}

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


3
Я реально реалізував це як один із плагінів у good'ol winamp. Те, що ви описуєте, добре, але недостатньо. Зазвичай є голосний звук (голосні) і незвукові звуки (приголосні). Якщо був лише озвучений звук, то, що ви описуєте, буде спрацьовувати, але незвуковий звук має дуже низьку енергію, і він не зовсім відрізняється від загального шуму. І безшумні умови також дуже рідкісні навіть у студіях.
Діпан Мехта

як цього досягти в пітоні?
kRazzy R

26

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

В основному будь-який чистий мовленнєвий сигнал (який не містить музики) має три частини.

  1. Озвучений звук - який в основному викликається голосними
  2. Незвуковий звук - який містить приголосні.

Характеристика людського звуку така, що хоча багато енергії використовується на озвучений звук, реальна інформація міститься в приголосних. Крім того, озвучений звук, як правило, є нижчою частотою, коли як невиразні звуки мають більш високі частоти. [Якщо бути точним, всі озвучені звуки резонують більш-менш постійною частотою для даної людини, яка є її тоном].

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

До питання, як її вирішити:

Хитрість полягає в тому, що невимушений звук все ще надходить із резонансного джерела; і по суті обмежена певною частотою. Де ж, шум досить рівномірний. Тож проста міра, яка розрізняє всі три, - це "локальна влада" або альтернативно, але еквівалентна, це прийняти віконну автокореляцію.

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

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

Стандарт G.729 обчислює VAD на основі таких функцій, як: лінійні спектральні частоти, повнодіапазонна енергія, низькочастотна енергія (<1 кГц) та нульова швидкість перетину.

Стандарт GSM працює наступним чином: Варіант 1 обчислює SNR у дев'яти діапазонах і застосовує поріг до цих значень. Варіант 2 обчислює різні параметри: потужність каналу, голосові показники та шум. Потім він порожує голосові показники, використовуючи поріг, який змінюється залежно від оціночного SNR. (з Вікіпедії)

Для більш досконалих методик я перелічу деякі посилання на цю тему.

  1. Найпопулярніші посилання: Jongseo Sohn; Нам Су Кім; Wonyong Sung; Листи обробки сигналів на основі статистичної моделі на основі статистичної моделі, IEEE, січень 1999, Том: 6 Випуск: 1 pp: 1-3

  2. Найбільш актуальні для вас: Марк Марзінзік та Біргер Колмайєр "Виявлення мовленнєвої паузи для оцінки спектра шуму за допомогою відстеження динаміки конвертів потужності". 10, НІ. 2, ЛЕВЕНЬ 2002, стор.109

  3. Рамірес, Дж .; JM Górriz, JC Segura (2007). "Виявлення голосової активності. Основи та стійкість системи розпізнавання мови". У М. Грімма та К. Крошеля. Міцне розпізнавання і розуміння мовлення. С. 1–22. ISBN 978-3-902613-08-0.

  4. Вступне слово: Джонатан Кола, Керол Еспі-Вілсон та Тарун Пруті "Виявлення голосової активності"


як цього досягти в пітоні?
kRazzy R

9

Я б зовсім другий Джим Клей на його підході, але трохи змінити смак, використовуючи конверт:

Ми знаємо, що мова в основному відбувається близько 1-2 кГц. Ваш вибірки даних, ймовірно, становлять 44 кГц (це залежить від вашого записуючого пристрою). Тому я б спершу зробив ковзну середню квадратичного сигналу в реальному часі через 10 балів, щоб мати огинаючу потужність сигналу. Це призведе до затримки виявлення, тому ви хочете, щоб це було низьким.

Потім я додав би фазу калібрування у вашій системі: попросіть користувача мовчати, натисніть кнопку та запишіть фоновий шум, скажімо, 10 секунд. Візьміть середню або середню амплітуду конверта, помножте на 2, щоб забезпечити безпеку, і це дасть вам порог, про який Джим говорив, автоматично.

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


9

Еріку,

Якщо ви справді шукаєте щось швидке і брудне, перше, що вам потрібно отримати, - це конверт, і я зробив би це просто (в MATLAB):

 envelope = abs(hilbert(yourSignal));

У цей момент я б просто порог, і "голос існує", якщо ви вище певного порогу.

Це дуже просте рішення btw, але воно може працювати для вас.


1
+1. Можливо, ви могли б детальніше розглянути метод, що стоїть за цим рядком коду? Я впевнений, що ОП не знайоме з вилученням конвертів за допомогою трансформації Гільберта.
Phonon

@Mohammad Дякую! Але будь ласка, дивіться мою редакцію 1. Я, безумовно, хотів би швидко і брудно, але також мені потрібно робити алгоритми :)
Ерік Бротто,

@EricBrotto Ну добре, я можу сказати вам, як реалізувати трансформатор Гільберта, але я припускаю, що у вас є можливість робити FFT у ваших бібліотеках C / Obj-C? Якщо ні, це стане проблемою ... :-)
Spacey

як цього досягти в пітоні?
kRazzy R

Добрий сер / пані, чи не могли б ви вказати мені на те, як реалізувати цей гільберт у Python?
kRazzy R

6

Я припускаю, що ви маєте справу з реальними, а не складними сигналами - якщо це не так, дайте мені знати, і я можу змінити відповідь.

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

Якщо ваші записи "чисті" (тобто не надто багато шуму), я, мабуть, пішов би максимально просто, порівнявши миттєву потужність (тобто один зразок) з порогом. Це означає, що вам навіть не потрібно його квадратизувати, якщо ви цього не хочете, вам просто потрібно абсолютне значення і порівняти його з квадратним коренем порогу потужності, який можна попередньо обчислити. Виявивши мовлення, захопіть її та деяку кількість запису перед нею, щоб переконатися, що ви отримаєте всю промову (можливо, 1/10 секунди?). Продовжуйте продовжувати, поки не знайдете тривалий період відсутності зразків, що перевищують поріг. Знову ж, тривалість періоду потрібно визначити емпірично.

Промийте і повторіть.


4

Я написав клас детектора активності на Java. Це частина моєї колекції з відкритим кодом Java DSP . Ви можете скористатися тестовою програмою WavSplitter.java, щоб перевірити її як WAV-файл як вхідний.


Майте на увазі, що ОП спеціально каже, що йому потрібно написати алгоритми в C.
Сем Малоні

Перетворити такі алгоритми з Java на C. дуже просто
Christian d'Heureuse

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