обнаружение пауз в аудиофайле произносимого слова с использованием pymad, pcm, vad и т. д. - PullRequest
3 голосов
/ 13 апреля 2010

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


Проблема

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

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


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

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

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

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 июня 2010

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

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

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

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

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

0 голосов
/ 13 апреля 2010

Просто хотел обновить это. Я добился умеренного успеха, используя Silence Finder от Audacity. Тем не менее, я все еще заинтересован в этой проблеме. Спасибо.

0 голосов
/ 13 апреля 2010

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

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

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

...