обнаружение пауз в звуковом файле с речевым словом с помощью pymad, pcm, vad и т. д.

Сначала я собираюсь в общих чертах изложить, что я пытаюсь сделать, и попросить совета. Затем я объясню свой нынешний подход и попрошу ответы на свои текущие проблемы.


Проблема

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

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


Текущий подход

Я подумал, что проще всего будет сканировать MP3 через определенные промежутки времени и определять места, где средняя громкость ниже определенного порога. Затем я использовал бы существующую утилиту, чтобы разрезать mp3 в этих местах.

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

Совет о том, как сопоставить группу образцов pcm с относительным объемом, будет ключевым.

Спасибо!


person james    schedule 13.04.2010    source источник
comment
Я в похожей лодке. Вы нашли решение своей проблемы?   -  person Abhi    schedule 03.11.2015


Ответы (3)


PCM - это кодирование звука по временным рамкам. Для каждого временного интервала вы получаете пиковый уровень. (Если вам нужна физическая ссылка для этого: пиковый уровень соответствует расстоянию, на которое мембрана микрофона была перемещена из своего положения покоя в данный момент времени.) Давайте забудем, что PCM может использовать беззнаковые значения для 8-битных выборок и сосредоточиться на подписанных ценности. Если значение> 0, мембрана находилась с одной стороны от своего положения покоя, если <0, то с другой стороны. Чем больше вывих от покоя (независимо от того, в какую сторону), тем громче звук.

Большинство методов классификации голоса начинаются с одного очень простого шага: они сравнивают пиковый уровень с пороговым уровнем. Если пиковый уровень ниже порогового значения, звук считается фоновым шумом. Глядя на параметры в Audacity Silence Finder, silence level должен быть этим порогом. Следующий параметр Minimum silence duration - это, очевидно, продолжительность периода молчания, необходимого для обозначения перерыва (или, в вашем случае, конца предложения).

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

  1. Разделите звуковой образец на отдельные наборы определенной продолжительности. Я бы начал с 1/10, 1/20 или 1/100 секунды.
  2. Для каждого из этих наборов вычислите максимальный пиковый уровень
  3. Сравните этот максимальный пик с порогом (silence level в Audacity). Порог - это то, что вы должны определить самостоятельно, исходя из специфики вашего звукового образца (громкость, фоновый шум и т. Д.). Если максимальный пик ниже вашего порога, этот набор молчание.
  4. Теперь проанализируйте серию засекреченных наборов: вычислите продолжительность тишины в вашей записи. (длина = количество тихих наборов * длина набора). Если он находится над вашим Minimum silence duration, предположим, что у вас здесь есть конец предложения.

Главный момент в написании кода вместо того, чтобы продолжать использовать Audacity, заключается в том, что вы можете улучшить свою классификацию, используя расширенные методы анализа. Один очень простой показатель, который вы можете применить, называется частота пересечения нуля, он просто подсчитывает, как часто знак переключается в вашем заданном наборе пиковых уровней (т. Е. Ваши значения пересекают линию 0). Их гораздо больше, все они более сложные, но, возможно, это того стоит. Взгляните, например, на дискретные косинусные преобразования ...

person Treb    schedule 24.06.2010

Просто хотел обновить это. У меня умеренный успех с помощью Audacity Silence Finder. Однако меня все еще интересует эта проблема. Спасибо.

person james    schedule 13.04.2010

PCM - это способ кодирования синусоидальной волны. Он будет закодирован как последовательность битов, где один из битов (я полагаю, 1) указывает на увеличение функции, а 0 указывает на уменьшение. Функция может оставаться примерно постоянной, если чередовать 1 и 0.

Чтобы оценить амплитуду, нарисуйте синусоидальную волну, а затем нормализуйте ее по оси x. Затем вы сможете оценить амплитуду синусоидальной волны в разных точках. Как только вы это сделаете, вы сможете выбрать места, где амплитуда ниже.

Вы также можете попробовать использовать преобразование Фурье, чтобы оценить, где сигналы наиболее различимы.

person WhirlWind    schedule 13.04.2010
comment
Ваше объяснение кодирования PCM неверно, оно просто дает амплитуду для временного интервала. Синусиодальное кодирование вообще не используется. - person Treb; 25.06.2010