Самый простой и быстрый метод для аудио обнаружения действия?

Данный массив 320 элементов (int16), которые представляют звуковой сигнал (16-разрядный LPCM) продолжительности на 20 мс. Я ищу самый простой и очень быстрый метод, который должен решить, содержит ли этот массив активное аудио (как речь или музыка), но не шум или тишина. Мне не нужно очень высокое качество решения, но это должно быть очень быстро.

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

8
задан Svante 1 July 2010 в 11:11
поделиться

4 ответа

Вы не добьетесь большего, чем метод суммы квадратов.

Одна оптимизация, которую вы, возможно, пока не проводите, - это использование промежуточной суммы. То есть на каждом временном шаге вместо суммирования квадратов последних n выборок сохраняйте текущую сумму и обновляйте ее квадратом самой последней выборки. Чтобы ваша текущая сумма не росла и не росла с течением времени, добавьте экспоненциальный спад. В псевдокоде:

decay_constant=0.999;  // Some suitable value smaller than 1
total=0;
for t=1,...
    // Exponential decay
    total=total*decay_constant;

    // Add in latest sample
    total+=current_sample;

    if total>threshold
        // do something
    end
end

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

6
ответ дан 5 December 2019 в 18:56
поделиться

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

0
ответ дан 5 December 2019 в 18:56
поделиться

Некоторое время назад я делал что-то подобное. После некоторых экспериментов я пришел к решению, которое достаточно хорошо сработало в моем случае.

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


rate = cur_avg^3 - prev_avg^3

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

1
ответ дан 5 December 2019 в 18:56
поделиться

Вы можете попробовать вычислить две простые «статистики» - первая будет спред (макс-мин). Молчание будет иметь очень низкий разброс. Во-вторых, разнообразие - разделите диапазон возможных значений, скажем, на 16 скобок (= диапазон значений) и, просматривая элементы, определите, в какую скобку входит этот элемент. Шум будет иметь одинаковые числа для всех скобок, тогда как музыка или речь должны отдавать предпочтение одним из них, игнорируя другие.

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

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

2
ответ дан 5 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: