Размер шрифта:
python - Как преобразовать тональную дорожку из алгоритма извлечения мелодии в гудящий звуковой сигнал
Play

python - Как преобразовать тональную дорожку из алгоритма извлечения мелодии в гудящий звуковой сигнал

Если я правильно понимаю, у вас, кажется, уже есть точное представление о поле, но ваша проблема в том, что то, что вы генерируете, просто не «хорошо звучит».

Начиная с вашего второго подхода: отфильтровывать что угодно, кроме тангажа, не приведет ни к чему хорошему. Удаляя все, кроме нескольких частотных бункеров, соответствующих вашим местным оценкам высоты, вы потеряете текстуру входного сигнала, что делает его хорошим. На самом деле, если вы приняли это до крайности и удалили все, кроме одного образца, соответствующего шагу, и взяли ifft, вы получите ровно синусоиду, что вы делаете в настоящее время. Если вы все равно хотите сделать это, я рекомендую вам выполнить все это, просто применяя фильтр к вашему временному сигналу, а не входить и выходить из частотной области, что является более дорогостоящим и громоздким. Фильтр будет иметь небольшую обрезку вокруг частоты, которую вы хотите сохранить, и это позволит использовать звук с лучшей текстурой.

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

Использование банка реальных образцов будет иметь большое значение в качестве того, что вы делаете. Это также позволит вам реалистично атаковать каждую новую ноту, которую вы играете.

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

Наконец, я также буду играть с оценками продолжительности, которые у вас есть, чтобы у вас были более плавные переходы от одного звука к другому. Угадав из-за вашей производительности вашего аудиофайла, который мне очень понравился (звуковой сигнал beee be beeep beeep beeeeeeeep) и график, который вы показываете, похоже, что у вас много перерывов, вставленных в рендеринг вашей песни. Вы могли бы избежать этого, расширив оценки продолжительности, чтобы избавиться от любой тишины, которая короче, скажем, 1 секунду. Таким образом, вы могли бы сохранить настоящие молчания из оригинальной песни, но не прерывать каждую ноту своей песни.

В рамках проекта «fun-at-home-research-project» я пытаюсь найти способ уменьшить / преобразовать песню в гудение, как аудиосигнал (основная мелодия, которую мы, люди, воспринимаем, когда слушаем песню). Прежде чем приступить к дальнейшему описанию моей попытки решить эту проблему, я хотел бы упомянуть, что я совершенно не знаком с аудиоанализом, хотя у меня есть большой опыт анализа изображений и видео.

Немного поработав с поиском, я нашел кучу алгоритмов извлечения мелодии. Учитывая полифонический аудиосигнал песни (например: .wav-файл), они выводят трек основного тона --- в каждый момент времени они оценивают доминирующий шаг (исходящий от голоса певца или какой-то инструмент для создания мелодии) и отслеживают доминирующую шаг с течением времени.

Я прочитал несколько работ, и они, похоже, вычислили короткое преобразование Фурье из песни, а затем сделают некоторый анализ на спектрограмме, чтобы получить и отследить доминирующую подачу. Извлечение мелодии - это всего лишь компонент в системе, которую я пытаюсь разработать, поэтому я не возражаю против использования какого-либо алгоритма, который доступен, насколько это достойная работа в моих аудиофайлах, и код доступен. Поскольку я новичок в этом, я был бы рад услышать любые предложения, по которым известно, что алгоритмы работают хорошо, и где я могу найти его код.

Я нашел два алгоритма:

  1. Отслеживание шага Yaapt
  2. Melodia

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

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

Алгоритм (доступен как плагин vamp) выводит тональную дорожку --- [time_stamp, pitch / frequency] --- матрицу Nx2, где в первом столбце находится метка времени (в секундах), а вторая колонка является доминирующим шагом обнаружено на соответствующей отметке времени. Ниже приведена визуализация тональной дорожки, полученной из алгоритма, наложенного фиолетовым цветом, с сигналом во временной области (см. Выше) и его спектрограммой / кратковременным увеличением. Отрицательные значения шага / частоты представляют собой алгоритмы доминантной оценки шага для незвуковых / не-мелодических сегментов. Поэтому все оценки тона> = 0 соответствуют мелодии, остальные для меня не важны.

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

Ниже приведена функция MATLAB, которую я написал для этого:

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

Затем я беру аудиосигнал, который я получаю от этой функции, и воспроизвожу его с оригинальной песней (мелодия на левом канале и оригинальная песня на правом канале). Хотя сгенерированный аудиосигнал, похоже, довольно хорошо сегментирует источники генерации мелодии (голос / ведущий-intstrument) - его активность, когда голос и нуль повсюду - сам сигнал далеко не гудит (я получаю что-то вроде beep beep beeeeep beep beeep beeeeeeeep), которые авторы показывают на своем веб-сайте. В частности, ниже представлена ​​визуализация, показывающая сигнал временной области входной композиции в нижней части и сигнал временной области мелодии, сгенерированной с использованием моей функции.

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

У кого-нибудь есть предложения по этому поводу? Я приветствую предложения на любом языке программирования (желательно MATLAB, python, C ++), но, я думаю, мой вопрос здесь более общий. Как генерировать волну на каждом временном штампе?

Несколько идей / исправлений в моем сознании:

  1. Установите амплитуду, получив усредненную / максимальную оценку амплитуды от сигнала временной области исходной песни.
  2. Полностью измените мой подход --- вычислите спектрограмму / кратковременное преобразование Фурье звукового сигнала песни. отсекают с трудом / нулевой или мягко все остальные частоты, кроме тех, что у меня на тангаже (или близки к моему тангажу). А затем вычислите обратное кратковременное преобразование Фурье, чтобы получить сигнал во временной области.

У вас есть как минимум 2 проблемы.

Во-первых, как вы догадались, ваш анализ отбросил всю амплитудную информацию части мелодии исходного спектра. Вам понадобится алгоритм, который фиксирует эту информацию (а не только амплитуду всего сигнала для полифонического ввода, или только бит БПФ для любых естественных музыкальных звуков). Это нетривиальная проблема, где-то между извлечением мелодического шага и разделением слепых источников.

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

📎📎📎📎📎📎📎📎📎📎