Ниже приведен сигнал, который представляет запись разговора. Я хотел бы создать серию меньших звуковых сигналов на основе этого. Идея состоит в том, чтобы определить, когда «важный» звук начинается и заканчивается, и использовать его для маркеров, чтобы создать новый фрагмент аудио. Другими словами, я хотел бы использовать тишину в качестве индикаторов относительно того, когда аудио-блок запускается или останавливается, и создавать новые звуковые буферы на основе этого.
Так, например, если человек записывает себя, говоря
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, поэтому любые решения, использующие библиотеки, на самом деле не подходят.
источник
Ответы:
Это классическая проблема распознавания речи . Первое, что нужно сделать, это Google концепции. Он широко используется в цифровой связи, и было проведено много исследований на эту тему, и есть хорошие статьи.
Как правило, чем больше фонового шума вы имеете дело с тем более сложным должен быть ваш метод обнаружения речи. Если вы используете записи, сделанные в тихой комнате, вы можете сделать это очень легко (подробнее позже). Если вы слышите всевозможные звуки во время разговора (проезжающие мимо грузовики, лай собак, разбивание тарелок, нападение инопланетян), вам придется использовать что-то более умное.
Глядя на сигнал, который вы подключили, ваш шум минимален, поэтому я предлагаю следующее:
Что все это значит? Огибающей сигнала представляет собой кривую , которая описывает его величину с течением времени, независимо от того, как его содержание частоты делает его колебания (см рисунок ниже).
Из изображения видно, что у вас нет большого шума, огибающая сигнала всегда будет выше определенного порога (уровня громкости), и вы можете рассматривать эти области как области, обнаруженные речью .
источник
То, что вы действительно хотите сделать, по сути, называется распознаванием голосовой активности или обнаружением речи.
В основном любой чистый речевой сигнал (который не содержит музыки) состоит из трех частей.
Характеристика человеческого звука такова, что, хотя в озвученном звуке используется много энергии, реальная информация содержится в согласных. Кроме того, вокализованный звук обычно имеет более низкую частоту, а невокализованные звуки - более высокие частоты. [Чтобы быть точным, все озвученные звуки резонируются более или менее с постоянной частотой для данного человека, который является его / ее высотой тона].
Теперь как и у любой системы есть шум. Озвученный звук обычно достаточно мощный, чтобы его можно было различить видимым. Когда вы применяете низкочастотную фильтрацию, можно собрать хорошую величину вокализованных звуков, однако невокализованный звук (со всей богатой информацией) будет потерян.
Подходя к вопросу, как это решить:
Хитрость заключается в том, что невокализованный звук все еще исходит из резонирующего источника; и изначально ограничено определенной частотой. Где как, шум довольно равномерный. Таким образом, простой мерой, которая различает все три, является «локальная мощность» или, альтернативно, но эквивалентно, это взять оконную автокорреляцию.
Если вы берете за раз, скажем, 100 выборок - и автоматически коррелируете себя, если он содержит только шум, результаты будут в значительной степени равны нулю (это свойство белого шума), а что касается речевого сигнала, эта величина будет наблюдаться, потому что сигнал все еще имеет лучшую структуру. Это работало для меня в прошлом.
VAD активно занимается исследованиями, потому что почти все мобильные телефонные связи хотят обнаружить неречевую часть и удалить их из кодирования. Но если они уберут неречевую речь, это сделает телефонию бесполезной.
Стандарт G.729 вычисляет VAD на основе таких характеристик, как: спектральные частоты линии, энергия в полосе частот, энергия в полосе низких частот (<1 кГц) и скорость пересечения нуля.
Стандарт GSM работает следующим образом: Вариант 1 вычисляет SNR в девяти полосах и применяет пороговое значение к этим значениям. Вариант 2 рассчитывает различные параметры: мощность канала, метрики голоса и мощность шума. Затем он пороговых метрик голоса использует пороговое значение, которое изменяется в соответствии с оцененным SNR. (из википедии)
Для более продвинутых методов я перечисляю некоторые ссылки на эту тему.
Наиболее часто упоминаемая ссылка: Jongseo Sohn; Нам Су Ким; Вононг Сунг; «Обнаружение голосовой активности на основе статистической модели» Письма по обработке сигналов, IEEE, январь 1999 г., том 6 Выпуск: 1 стр: 1-3
Наиболее значимые для вас: Марк Марзинзик и Биргер Коллмайер "Обнаружение речевой паузы для оценки спектра шума с помощью отслеживания динамики огибающей мощности". 10, нет. 2, ФЕВРАЛЬ 2002, стр.109
Рамирес, J .; JM Górriz, JC Segura (2007). «Обнаружение голосовой активности. Основы и надежность системы распознавания речи». В М. Гримм и К. Крошель. Надежное распознавание речи и понимание. С. 1–22. ISBN 978-3-902613-08-0.
Вступительное слово : Джонатан Кола, Кэрол Эспи-Уилсон и Тарун Прути "Обнаружение голосовой активности"
источник
Я бы полностью поддержал Джима Клея в его подходе, но немного изменил бы вкус, используя конверт:
Мы знаем, что речь в основном происходит в диапазоне 1-2 кГц. Ваша выборка данных, вероятно, будет 44 кГц (это зависит от вашего записывающего устройства). Итак, что я бы сделал в первую очередь - это скользящее среднее квадрата сигнала в реальном времени по 10 точкам, чтобы получить огибающую мощности сигнала. Это приведет к задержке в обнаружении, так что вы хотите сохранить это низкое значение.
Затем я добавил бы фазу калибровки в вашей системе: попросите пользователя хранить молчание, нажать кнопку и записать фоновый шум, скажем, на 10 секунд. Возьмите среднюю или среднюю амплитуду огибающей, умножьте на 2 для обеспечения безопасности, и это автоматически даст вам порог, о котором говорил Джим.
Если это не запись в реальном времени, может оказаться полезным использовать 0-фазную скользящую среднюю, чтобы уменьшить раздражение, вызванное задержкой. Скажите нам, если это работает для вас, как есть.
источник
Эрик,
Если вы действительно стремитесь к чему-то быстрому и грязному, первое, что вы должны получить, это конверт, и я бы сделал это просто (в MATLAB):
В этот момент я бы просто порог, и «голос существует», если вы находитесь выше определенного порога.
Между прочим, это очень простое решение, но оно может работать на вас.
источник
Я предполагаю, что вы имеете дело с реальными, а не сложными сигналами - если это не так, дайте мне знать, и я могу изменить ответ.
Мощность определяется как квадрат сигнала (то есть выборки сигнала, умноженные на себя). Вы можете сравнить мощность с некоторым порогом, чтобы определить, присутствует ли речь или нет. Вы, вероятно, должны были бы сделать некоторые измерения на своих записях, чтобы эмпирически найти хороший порог.
Если ваши записи «чистые» (т. Е. Не слишком много шума), я бы, вероятно, пошел как можно проще, сравнив мгновенную мощность (то есть один образец) с порогом. Это означает, что вам даже не нужно возводить его в квадрат, если вы этого не хотите, вам просто нужно абсолютное значение и сравнить его с квадратным корнем порога мощности, который можно предварительно вычислить. Когда вы обнаружите речь, возьмите ее и определенное количество записи перед ней, чтобы убедиться, что вы поняли всю речь (возможно, 1/10 секунды?). Продолжайте, пока не найдете длительный период отсутствия образцов, превышающий пороговое значение. Опять же, продолжительность периода должна быть определена опытным путем.
Промыть и повторить.
источник
Я написал класс детектора активности на Java. Это часть моей коллекции Java DSP с открытым исходным кодом . Вы можете использовать тестовую программу WavSplitter.java, чтобы проверить это с WAV-файлом в качестве входных данных.
источник