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
. Опять же, я бы предположил, что результаты могут быть не совсем такими, как вы хотите (изменение частоты, другие артефакты).
Что делать?
ИМО, у вас есть несколько вариантов.
Если то, что вы вводите в свои алгоритмы ML, оказывается чем-то вроде спектрограммы Мела, вы можете просто обработать его как изображение и растянуть, используя подход скиджа или opencv. Частотные диапазоны будут сохранены. Я успешно использовал этот подход в этой музыке c бумаге для оценки темпа .
Используйте лучшую библиотеку time_stretch, например rubberband, librosa великолепна, но ее алгоритм изменения масштаба времени (TSM) не является современным. Для обзора алгоритмов TSM см., Например, эту статью .
Не обращайте внимания на тот факт, что частота изменяется, и просто регулярно добавляйте 0 сигналов к сигналу или отбрасывайте сэмплы на регулярной основе из сигнала (так же, как интерполяция изображения). Если вы не растянетесь слишком далеко, он все равно может работать в целях увеличения данных. После того, как содержание всех слов не изменилось, если аудиоконтент имеет более высокие или более низкие частоты.
Повторная выборка сигнала на другую частоту дискретизации, например, 44100 Hz -> 43000 Hz
или 44100 Hz -> 46000 Hz
с использованием библиотеки как resampy и затем делают вид, что , что это все еще 44100 Гц. Это по-прежнему меняет частоты, но, по крайней мере, вы получаете то преимущество, что resampy выполняет правильную фильтрацию результата, чтобы избежать вышеупомянутого aliasing , который в противном случае происходит.