ИСПОЛЬЗОВАНИЕ МАШИННОГО ОБУЧЕНИЯ И ЦЕПИ МАРКОВА В СОЗДАНИИ МУЗЫКИ

МЕНЮ


Новости искусственного интеллекта
Поиск

ТЕМЫ


Big data
Беспилотный автомобили
БПЛА
генетические алгоритмы
Головной мозг
дополнительная реальность
ИИ проекты
искусственный интеллект
квантовые компьютеры
Кластеризация
Машинное обучение
нейронные процессоры
нейронные сети
Нейронные сети: искусственные
Нейронные сети: реализация
облачные вычисления
Поведение животных
Психология
распознавание образов
робототехника и БПЛА
Семинары
суперкомпьютеры
Теория эволюции
Трансгуманизм

АРХИВ


Апрель 2016
Март 2016
Февраль 2016
Январь 2016
Декабрь 2015
Ноябрь 2015
Октябрь 2015
Сентябрь 2015
Август 2015
Июль 2015
Июнь 2015
Май 2015
Апрель 2015
Март 2015
Февраль 2015
Январь 2015
Декабрь 2014
Ноябрь 2014
Октябрь 2014
Сентябрь 2014
Август 2014
Июль 2014
Июнь 2014
Май 2014
Апрель 2014
Март 2014
Февраль 2014
Январь 2014
Декабрь 2013
Ноябрь 2013
Октябрь 2013
Сентябрь 2013
Август 2013
Июль 2013
Июнь 2013
Май 2013
Апрель 2013
Март 2013
Февраль 2013
Январь 2013
Декабрь 2012
Ноябрь 2012
Октябрь 2012
Сентябрь 2012
Июль 2012
Июнь 2012
Май 2012
Апрель 2012
Март 2012
Февраль 2012
Январь 2012
Декабрь 2011
Ноябрь 2011
Октябрь 2011
Сентябрь 2011
Август 2011
Май 2011

RSS


RSS новости
свиной грипп
new balance кроссовки

Новостная лента форума ailab.ru

2016-04-25 17:55

, Машинное обучение





Сегодня мы поговорим об исследовании (vk.cc), рассматривающем звук и музыку с точки зрения математики и программирования. Такой подход позволяет оценить многогранную природу всего того, что мы привыкли слушать по дороге на работу или дома. Постараемся изложить основные моменты простыми словами.

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

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

1. Основная идея

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

Ноты (128 из них) - это вероятностные состояния. Для реализации всего процесса я буду использовать цепь Маркова второго порядка, а это означает, что следующее состояние системы будет строиться на основании двух предыдущих (нот). Все вероятности хранятся в матрице размерностью 2^14x2^7. На входе синтезатор получает два целых числа (0 <= n, m <= 127), выступающих в качестве начальных нот.

На их основании алгоритм вычисляет/генерирует следующую ноту и продолжает процесс вычисления до бесконечности (до тех пор, пока вы его не остановите). Для упрощения задачи, громкость звучания всех нот будет одинаковой (127), как и временной интервал между ними (300 мс).

Для корректной работы такого подхода необходима матрица весов, которую получают с использованием трех нот. Для каждой комбинации из трех нот первые две всегда являются «начальным» состоянием, а третья «конечным»; результатом всегда является инкрементация соответствующего поля в матрице весов [первая нота*127+вторая нота][третья нота].

Далее матрица весов «нормализуется» (или конвертируется) в матрицу переходов путем замены целых чисел на их процентное отношение к сумме всех значений в строке.

2. Процесс обучения

Алгоритм, описываемый в статье, использует для обучения MIDI-файлы (с расширением .mid), он обрабатывает аудиофайл нота за нотой, параллельно обновляя матрицу весов с помощью инструмента Java под названием Sequencer. Пример кода:

public Learn(String midiName) {

try {

Sequence sequence = MidiSystem.getSequence(new File(midiName));

int id[] = {0, 0, 0};

int nArr[][] = new int[2][2];

for(Track track : sequence.getTracks()) {

for(int i = 0; i < track.size(); i++) {

MidiEvent event = track.get(i);

MidiMessage message = event.getMessage();

if(message instanceof ShortMessage) {

ShortMessage sm = (ShortMessage) message;

if(sm.getCommand() == NOTE_ON) {

int key = sm.getData1();

for(int j = 0; j < 2; j++) {

if(id[j] == 2) {

id[j] = 0;

Score.updateWeight(nArr[j][0], nArr[j][1], key);

} else {

nArr[j][id[j]++] = key;

}

}

}

}

}

}

cnt++;

} catch(InvalidMidiDataException|IOException e) {

e.printStackTrace();

}

}

3. Выбор правильной ноты

Данный процесс основан на случайных величинах: текущем состоянии (последние две ноты последовательности) и матрице переходов, полученной ранее. Вероятность генерируется случайно, с помощью функции Java Math.random(). Затем алгоритм просматривает матрицу переходов и возвращает ту вероятность, которая совпала (или оказалась наиболее близка) с вероятностью, сгенерированной функцией Math.random().

Результат воспроизводится с помощью инструмента Synthesizer - результат определяется двумя начальными нотами, сгенерированными случайным образом или выбранными пользователем.

Вот пример композиции, созданной программой Markov composer: zx.rs

github.com

Создать тему для обсуждения на форуме ailab.ru


кроссовки нью баланс