Извлечение и анализ звука из mp3 файлов - PullRequest
3 голосов
/ 17 апреля 2011

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

Я ищу библиотеку на C ++ или, предпочтительно, на C #, которая позволила бы мне проверить звуковое содержимое этих файлов на предмет молчания.

РЕДАКТИРОВАТЬ: я должен уточнить, что я пытаюсь достичь. Я записываю комментарии о трансляции спортивных состязаний с помощью VLC и сохраняю их в mp3. Когда игра задерживается или отменяется, потоковый комментарий заменяется повторяющимся сообщением о том, что комментарий недоступен. Просматривая эти периодические паузы (или полное молчание), я могу определить, нет ли комментариев, и остановить потоковую запись

По этой причине я неохотно распаковываю mp3, потому что если бы это означало, что мой тест на эти молчания будет очень медленным. Разве я не могу декодировать последние 5 минут файла?

Спасибо Andrew

1 Ответ

1 голос
/ 17 апреля 2011

Мне не известна библиотека, которая будет обнаруживать тишину непосредственно в данных, закодированных в формате MP3, поскольку ее нетривиальная задача - обнаружить тишину без предварительной распаковки. К счастью, это легко найти библиотеки, которые декодируют файлы MP3 и получают к ним доступ как данные PCM, и это тривиально для обнаружения молчания в данных PCM. Вот одна такая библиотека для C #, которую я нашел, но я уверен, что есть тонны: http://www.robburke.net/mle/mp3sharp/

Как только вы расшифруете данные, у вас будет список образцов PCM. В самой простой форме алгоритм, который вам необходим для обнаружения молчания, заключается в простом анализе небольших фрагментов (может быть от 0,25 до нескольких секунд) и убедитесь, что абсолютное значение каждого сэмпла в блоке равно ниже порога. Используемое вами пороговое значение определяет, насколько «тихий» звук должен считаться тишиной, а размер порции определяет, как долго громкость должна быть ниже этого порога, чтобы считаться тишиной (Если вы используете очень короткие порции, вы будете получить много ложных срабатываний из-за выборок около пересечения нуля, но должно быть в порядке .25 с или выше. У базового подхода есть улучшения, такие как использование гистореза (который в основном использует два порога, один для перехода в тишину и один для перехода из тишины) и фильтрации.

К сожалению, я не знаю библиотеки для C ++ или C #, которая реализует обнаружение уровня из рук в руки, и в Google ничего не возникает, но по крайней мере для простой версии ее довольно легко кодировать.

Редактировать: Кроме того, эта библиотека кажется интересной: http://naudio.codeplex.com/

Также, хотя этот вопрос и не является дублирующим вопросом, ответы здесь будут вам полезны:

Обнаружение звука тишины в файлах WAV с использованием C #

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