Самый простой способ определить, где аудио конверты начинаются и останавливаются

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'); я = 1; в то время как abs (x (i)) <0,05% Обнаружение молчания i = i + 1; end x (1: i) = []; х (6000: 10000) = 0;
Zeee

Ответы:

26

Это классическая проблема распознавания речи . Первое, что нужно сделать, это Google концепции. Он широко используется в цифровой связи, и было проведено много исследований на эту тему, и есть хорошие статьи.

Как правило, чем больше фонового шума вы имеете дело с тем более сложным должен быть ваш метод обнаружения речи. Если вы используете записи, сделанные в тихой комнате, вы можете сделать это очень легко (подробнее позже). Если вы слышите всевозможные звуки во время разговора (проезжающие мимо грузовики, лай собак, разбивание тарелок, нападение инопланетян), вам придется использовать что-то более умное.

Глядя на сигнал, который вы подключили, ваш шум минимален, поэтому я предлагаю следующее:

  1. Извлечь огибающую сигнала
  2. Выберите хороший порог
  3. Определите места, где величина огибающей превышает порог

Что все это значит? Огибающей сигнала представляет собой кривую , которая описывает его величину с течением времени, независимо от того, как его содержание частоты делает его колебания (см рисунок ниже).

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

{1,45,6,2,43,2}{1,45,6,2,43,2} может быть найден экспериментально и может зависеть от нескольких вещей, таких как частота дискретизации.

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

Phonon
источник
3
Я реализовал это как один из плагинов в good'ol winamp. То, что вы описываете, хорошо, но недостаточно. Обычно присутствуют звонкие звуки (гласные) и невокализованные звуки (согласные). Если бы был только вокализованный звук, то, что вы описываете, будет работать - но невокализованный звук очень низкоэнергетичен и не очень отличается от общего шума. И условия без шума также очень редки даже в студиях.
Дипан Мехта
как добиться этого в питоне?
kRazzy R
26

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

В основном любой чистый речевой сигнал (который не содержит музыки) состоит из трех частей.

  1. Озвученный звук - который в основном вызван гласными
  2. Звук без голоса - который содержит согласные.

Характеристика человеческого звука такова, что, хотя в озвученном звуке используется много энергии, реальная информация содержится в согласных. Кроме того, вокализованный звук обычно имеет более низкую частоту, а невокализованные звуки - более высокие частоты. [Чтобы быть точным, все озвученные звуки резонируются более или менее с постоянной частотой для данного человека, который является его / ее высотой тона].

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

Подходя к вопросу, как это решить:

Хитрость заключается в том, что невокализованный звук все еще исходит из резонирующего источника; и изначально ограничено определенной частотой. Где как, шум довольно равномерный. Таким образом, простой мерой, которая различает все три, является «локальная мощность» или, альтернативно, но эквивалентно, это взять оконную автокорреляцию.

Если вы берете за раз, скажем, 100 выборок - и автоматически коррелируете себя, если он содержит только шум, результаты будут в значительной степени равны нулю (это свойство белого шума), а что касается речевого сигнала, эта величина будет наблюдаться, потому что сигнал все еще имеет лучшую структуру. Это работало для меня в прошлом.

VAD активно занимается исследованиями, потому что почти все мобильные телефонные связи хотят обнаружить неречевую часть и удалить их из кодирования. Но если они уберут неречевую речь, это сделает телефонию бесполезной.

Стандарт G.729 вычисляет VAD на основе таких характеристик, как: спектральные частоты линии, энергия в полосе частот, энергия в полосе низких частот (<1 кГц) и скорость пересечения нуля.

Стандарт GSM работает следующим образом: Вариант 1 вычисляет SNR в девяти полосах и применяет пороговое значение к этим значениям. Вариант 2 рассчитывает различные параметры: мощность канала, метрики голоса и мощность шума. Затем он пороговых метрик голоса использует пороговое значение, которое изменяется в соответствии с оцененным SNR. (из википедии)

Для более продвинутых методов я перечисляю некоторые ссылки на эту тему.

  1. Наиболее часто упоминаемая ссылка: Jongseo Sohn; Нам Су Ким; Вононг Сунг; «Обнаружение голосовой активности на основе статистической модели» Письма по обработке сигналов, IEEE, январь 1999 г., том 6 Выпуск: 1 стр: 1-3

  2. Наиболее значимые для вас: Марк Марзинзик и Биргер Коллмайер "Обнаружение речевой паузы для оценки спектра шума с помощью отслеживания динамики огибающей мощности". 10, нет. 2, ФЕВРАЛЬ 2002, стр.109

  3. Рамирес, J .; 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));

В этот момент я бы просто порог, и «голос существует», если вы находитесь выше определенного порога.

Между прочим, это очень простое решение, но оно может работать на вас.

ошалевший
источник
1
+1. Возможно, вы могли бы уточнить метод, стоящий за этой строкой кода? Я уверен, что ОП не знаком с извлечением конверта через преобразование Гильберта.
Фонон
@ Мохаммед Спасибо! Но, пожалуйста, посмотрите мой РЕДАКТИРОВАТЬ 1. Я определенно хотел бы быстро и грязно, но также нужно сделать алгоритмы самостоятельно :)
Эрик Бротто
@EricBrotto Ну, хорошо, я могу рассказать вам, как реализовать преобразователь Гильберта, но я предполагаю, что у вас есть возможность сделать БПФ в ваших библиотеках C / Obj-C? Если нет, то это будет проблемой ... :-)
Спейси
как добиться этого в питоне?
kRazzy R
Добрый Сэр / Мэм, не могли бы вы указать мне ресурс о том, как этот гильберт будет реализован в Python?
kRazzy R
6

Я предполагаю, что вы имеете дело с реальными, а не сложными сигналами - если это не так, дайте мне знать, и я могу изменить ответ.

Мощность определяется как квадрат сигнала (то есть выборки сигнала, умноженные на себя). Вы можете сравнить мощность с некоторым порогом, чтобы определить, присутствует ли речь или нет. Вы, вероятно, должны были бы сделать некоторые измерения на своих записях, чтобы эмпирически найти хороший порог.

Если ваши записи «чистые» (т. Е. Не слишком много шума), я бы, вероятно, пошел как можно проще, сравнив мгновенную мощность (то есть один образец) с порогом. Это означает, что вам даже не нужно возводить его в квадрат, если вы этого не хотите, вам просто нужно абсолютное значение и сравнить его с квадратным корнем порога мощности, который можно предварительно вычислить. Когда вы обнаружите речь, возьмите ее и определенное количество записи перед ней, чтобы убедиться, что вы поняли всю речь (возможно, 1/10 секунды?). Продолжайте, пока не найдете длительный период отсутствия образцов, превышающий пороговое значение. Опять же, продолжительность периода должна быть определена опытным путем.

Промыть и повторить.

Джим Клэй
источник
4

Я написал класс детектора активности на Java. Это часть моей коллекции Java DSP с открытым исходным кодом . Вы можете использовать тестовую программу WavSplitter.java, чтобы проверить это с WAV-файлом в качестве входных данных.

Кристиан д'Эрёз
источник
Имейте в виду, что ОП специально говорит, что ему нужно самому написать алгоритмы на C.
Сэм Мэлони,
Очень легко преобразовать такие алгоритмы из Java в C.
Кристиан Д'Эрёз,
Сэр, как добиться этого в Python?
kRazzy R