Python: файлы волн растяжения во времени - сравнение трех методов - PullRequest
0 голосов
/ 22 января 2020

Я выполняю некоторое увеличение данных в наборе речевых данных и хочу растянуть / сжать каждый аудиофайл во временной области.

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

dimension = int(len(signal) * speed)
res = librosa.effects.time_stretch(signal, speed)
res = cv2.resize(signal, (1, dimension)).squeeze()
res = skimage.transform.resize(signal, (dimension, 1)).squeeze()

Однако я обнаружил, что librosa.effects.time_stretch добавляет к сигналу нежелательное эхо (или что-то подобное).

Итак, мой вопрос: каковы основные различия между этими тремя способами? И есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 23 января 2020

librosa.effects.time_stretch (сигнал, скорость) ( документы )

По сути, этот подход преобразует сигнал с использованием stft ( кратковременного преобразования Фурье ), растягивает его, используя фазовый вокодер , и использует обратный stft для восстановления сигнала во временной области. Как правило, когда вы делаете это таким образом, вы вводите небольшую «фазу», то есть металлический c лязг, потому что фаза не может быть восстановлена ​​на 100%. Это, вероятно, то, что вы определили как «эхо».

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

cv2.resize (signal, (1, size)). squeeze () ( docs )

Все, что делает этот подход, это интерполировать данный сигнал, используя билинейную интерполяцию . Этот подход подходит для изображений, но мне кажется непригодным для аудиосигналов. Вы слушали результат? Звучит ли он как оригинальный сигнал только быстрее / медленнее? Я бы предположил, что меняются не только темп, но также частота и, возможно, другие эффекты.

skimage.transform.resize (signal, (dimension, 1)). Squeeze () ( docs )

Опять же, это для изображений, а не для звука. В дополнение к интерполяции ( сплайн-интерполяция с порядком 1 по умолчанию) эта функция также выполняет сглаживание для изображений. Обратите внимание, что это не имеет ничего общего с 1031 *, чтобы избежать эффектов наложения звука ( Nyqist / Aliasing ), поэтому вам, вероятно, следует отключить это, передав anti_aliasing=False. Опять же, я бы предположил, что результаты могут быть не совсем такими, как вы хотите (изменение частоты, другие артефакты).

Что делать?

ИМО, у вас есть несколько вариантов.

  1. Если то, что вы вводите в свои алгоритмы ML, оказывается чем-то вроде спектрограммы Мела, вы можете просто обработать его как изображение и растянуть, используя подход скиджа или opencv. Частотные диапазоны будут сохранены. Я успешно использовал этот подход в этой музыке c бумаге для оценки темпа .

  2. Используйте лучшую библиотеку time_stretch, например rubberband, librosa великолепна, но ее алгоритм изменения масштаба времени (TSM) не является современным. Для обзора алгоритмов TSM см., Например, эту статью .

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

  4. Повторная выборка сигнала на другую частоту дискретизации, например, 44100 Hz -> 43000 Hz или 44100 Hz -> 46000 Hz с использованием библиотеки как resampy и затем делают вид, что , что это все еще 44100 Гц. Это по-прежнему меняет частоты, но, по крайней мере, вы получаете то преимущество, что resampy выполняет правильную фильтрацию результата, чтобы избежать вышеупомянутого aliasing , который в противном случае происходит.

...