Определение нот по звучанию

Notes recognition

Описание проекта

Recognition of music sheet and transcribing it into MIDI

Подход к распознаванию нот

После определённого количества безуспешных попыток написания проекта с нуля и проверки разных подходов, наткнулся на следующую статью: В ней описан подход к распознаванию нот с помощью связки Convolutional и Recurrent сетей. Этот подход используется, в частности, для распознавания текста. Поэтому я решил взять одну из реализаций Optical Character Recognition и обучить сеть на базе нот.

Была выбрана эта tensorflow модель. Научная статья, объясняющая принцип её работы.

Датасет

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

Характеристики датасета

94,984 случайных монофонических последовательностей, состоящих из 52 символов: музыкальных нот от С4 до Е5, 4 длительности (половина, четверь, восьмая, шестнадцатая), 4 паузы тех же длительностей, символы размеров (3/4, 4/4, 6/8), знаки альтерации (диез, бемоль, бекар), скрипичный ключ, тактовая черта.

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

Датасет был обработан, чтобы соответстовать требованиям сети для обучения (созданы лейблы, изображения уменьшены и т.д.). 95% — обучающая выборка 5% — тестовая.

Обучение

Сеть обучалась в течение около 8 часов на NVIDIA Tesla K80. 16 эпох.

Сложности

1. Сейчас модель может распознавать небольшие последовательности. Ей нельзя скормить весь лист с нотами. Однако, эта проблема решаема. Я пытался сделать сегментацию листа (вычленение тактов) силами OpenCV и добился определённых результатов. Но код очень по-разному работает для изображений разного качества. Поэтому, в долгосрочной перспективе, тут нужно тренировать отдельный слой сети. Для этого нужны данные с разметкой тактов, систем и прочих высокоуровневых элементов системы нотного листа.

2. Не успел сделать конвертацию в MIDI. К сожалению, вопрос в лоб не решить. Думал просто конвертировать обратно в Lilypond но сделать это оказалось не так легко из-за того, что программа сама проставляет знаки альтерации в зависимости от тональности и ещё пары тонкостей. Возможно, тут лучше подойдёт OpenXML, на изучение формата которого, однако, у меня не хватило времени. Если успею и всё получится, реализую в ближайшие дни. Следите за гитхабом.

3. Также не хватило времени на «выкат в продакшен» версии для удобного тестирования без каких-либо установок. Поэтому, чтобы поиграться с распознаванием, нужно поставить https://github.com/emedvedev/attention-ocr и запустить функцию тестирования, это опишу ниже.

4. Также не успел, как следует протестить и собрать статистику. Единичный прогон по тестовой выборке показал результат в 99,5%.

Как запустить

aocr test —visualize ПУТЬ/К/notesTest.tfrecords —log-path ./log/log.log —max-width 1000 —max-height 61 —max-prediction 36 —full-ascii —model-dir ПУТЬ/К/checkpoints

Небольшое примечание. Распакованные checkpoints.zip содержат папку checkpointsDL — путь нужно указывать к ней.

Наблюдаем за процессом. А потом смотрим на результат в папке log. Там будут находиться папки для каждой картинки, для которой было проведено распознавание. В каждой папке файл word.txt где первая строка — предсказанный результат, вторая — ground-truth Также в папке находится гифка, показывающая процесс работы нейросети.

Для перевода результата в читаемый формат (переименование папок и файлов), кидаем питоновский скрипт в папку out и запускаем.

Быстрая установка и запуск на Линуксе

sudo pip install aocr
pip install tensorflow

git clone https://github.com/Dene33/notes-recognition
cd notes-recognition
unzip checkpoints.zip -d checkpoints

aocr test —visualize notesTest.tfrecords —max-width 1000 —max-height 61 —max-prediction 36 —full-ascii —model-dir ./checkpoints/checkpointsDL

Тест на своём датасете

Чтобы протестировать на своих картинках, создаём папку с картинками. Максимальная высота картинок — 60, ширина — 1000. Создаём текстовый файл (например labels.txt) с лейблами такого формата:

где ./datasets/images/hello.jpg — путь до картинки, hello — её лейбл. Какому символу какая нота соответствует можно посмотреть тут, где 1 столбец — лейблы, 2 — соответствующая нота или знак.

Затем, чтобы создать tfrecord из картинок выполняем:

aocr test —visualize ПУТЬ/К/testing.tfrecords —log-path ./log/log.log —max-width 1000 —max-height 61 —max-prediction 36 —full-ascii —model-dir ПУТЬ/К/checkpoints

Примеры картинок из обучаемой выборки и соответствующих лейблов:

MRRRROT:3+)R*

MRRN;RK+3R»QR Denis Cera, code

Комментарии

А не сравнивали качество с традиционными программами распознавания нот без нейросетей? https://en.wikipedia.org/wiki/Optical_music_recognition

Традиционные подходы работают более-менее, но 1. требовательны к качеству входного изображения — нужны отсканированные листы. 2. Не работают/работают плохо с рукописными нотами. Ну и конечно же, 3. большая часть подобного софта — проприетарные продукты. Нейронные же сети можно обучить распознавать ноты и на обычных фотографиях с телефона (был бы датасет подходящий).

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

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

По поводу символов — было бы круто, если бы проект в будущем научился распознавать ноты для барабанщиков. Прикол в том, что если есть слух, то прослушать и повторить проще, чем разбирать ноты и считать длительности)
А на будущее, можно было бы еще подумать насчет интеграции с каким-нибудь существующим музыкальным ПО, тот же guitar pro, например.
Или вообще уйти в другую сторону и по нотам генерировать какую-нибудь игру, типа tap-tap:)

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

То, что слушать и повторять легче, чем копаться в нотах — это прям то, из-за чего я решил взяться за этот проект. Я пою в хоре и иногда хочется просто прослушать, как звучит партия. 🙂 Надеюсь, со временем получится довести проект до уровня «сфотографировал партию, прослушал».

Гитар про умеет импортировать MIDI файлы. Тут главное найти наиболее удобный способ для работы с выходными данными, да. Сейчас они генерируются в MIDI посредством питоновской библиотеки mido.

Источник

Как читать и считать ноты – подробная инструкция + фото

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

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

Эволюция нотной записи

Чтобы лучше понять, как читать и считать ноты, нам придется обратиться к истокам и узнать, как формировалась нотная запись.

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

Истоками современной системы нотной записи стала работа древнегреческого теоретика музыки Алипия (III или IV в. н. э.). Он составил список символов (в основном это были греческие буквы), и подробно описал их значения. Символ обозначал звук определенной высоты. Эта система получила широкое распространение. В интерпретации римлян, буквы греческого алфавита были заменены на латинские: A, B, C, D, E, F, G. Именно они и по сей день широко применяются в музыкальной практике.

В средние века появилась невменная нотация. С позднелатинского «невма» — знак, намек.

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

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

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

После, для еще большего удобства ввели еще одну параллельную линию сверху для звука do.

Этим нововведением мы обязаны итальянскому монаху, выдающемуся педагогу Гвидо Аретинскому. Именно он, в XI в. предложил ввести параллельные линии для более точного определения высоты звука. В течение своей педагогической деятельности он постоянно совершенствовал свою систему. Ему нужно было найти способ быстро разучивать с певцами незнакомые песнопения. Это привело к настоящей реформе в области нотной записи.

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

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

Не интересно 10

Кому принадлежат названия нот

Создание системы нотной записи – не единственное достижение Гвидо Аретинского. Ему также принадлежат названия нот, которыми мы пользуемся и по сей день: До, Ре, Ми, Фа, Соль, Ля, Си.

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

Итак, звукоряд Гвидо Аретинского состоял из шести нот, последовательно восходящих и отстоящих друг от друга на один тон: Ut, Re, Mi, Fa, Sol, La. Эта система просуществовала достаточно долго и была действительно очень удобной и понятной. Но, время шло и ей предстояло претерпеть еще множество изменений, прежде чем получить современный вид.

Первые изменения коснулись слога «Ut». Он оказался не удобен для пения, поскольку заканчивается на согласную. Поэтому в XVII веке музыковед Джованни Баттиста Дони заменил «Ut» на привычное нам «Do». Мнения относительно создания этого звука разделились: одни считают, что слог «Do» это первые буквы его фамилии, а другие уверяют, что этот слог происходит от слова DOMINUS что означает – Господь.
Название ноты «Si» также принадлежит ему. Он взял первые буквы словосочетания «Sancte Iohanne» (Святой Иоанн) из последней строчки гимна.

Существует также версия, что названия нот имеют другие корни:

Это красивая легенда, и она вполне могла бы иметь право на существование.

Звукоряд, интервал, октавы

Итак, постепенно количество нот дошло до семи: До, Ре, Ми, Фа, Соль, Ля, Си. Названиями этих нот мы и пользуемся до сих пор.

Ноты располагаются в определенной последовательности по возрастанию высоты, то есть каждая следующая нота выше предыдущей.

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

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

Интервал имеет основание и вершину. Расстояние между ними можно посчитать ступенями или количеством тоно́в. Названия интервалов происходят от латинских порядковых числительных. Например, расстояние от основания до вершины в две ступени называется секундой, а в пять ступеней – квинтой. Также, каждый интервал обозначается арабской цифрой:

  • Прима (prima — первая)
  • Секунда (secunda — вторая)
  • Терция (tertia — третья)
  • Кварта (quarta — четвертая)
  • Квинта (quinta — пятая)
  • Секста (sexta — шестая)
  • Септима (septima — седьмая)
  • Октава (octava — восьмая)

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

Секунда — это интервал, где расстояние от основания до вершины включительно, составляет две ступени.

Терция интервал, в котором разница между двумя звуками составляет 3 ступени.

Кварта 4 ступени

Квинта 5 ступеней

Секста 6 ступеней

Септима 7 ступеней

Октава 8 ступеней

Источник

Оцените статью