Между тем мгновением, когда вы допели мелодию, и появлением нот на экране проходит несколько секунд. За это время звук успевает пройти довольно длинный путь, и путь этот устроен любопытнее, чем можно предположить. Рассказываем, что именно происходит внутри.
Почему всё считается прямо в браузере
Обычно распознавание звука отправляют на сервер: там стоят видеокарты, там крутится модель, оттуда возвращается результат. Мы пошли иным путём — вычисления целиком происходят на вашем компьютере, в самой вкладке браузера.
Причин тому три. Запись голоса никуда не уходит и нигде не хранится, что снимает добрую половину вопросов о приватности. Сервис не платит за вычислительные мощности, а значит, бесплатный тариф остаётся бесплатным по-настоящему, а не до первой тысячи пользователей. И, наконец, нет очереди: сколько бы человек ни занималось одновременно, каждый считает своё у себя.
Плата за это — первая загрузка. Модель приходится скачать (несколько мегабайт), после чего она остаётся в кеше браузера и больше не требует внимания.
Что отдаёт нейросеть
Распознаванием занимается Basic Pitch — открытая модель, разработанная в Spotify и выложенная в свободный доступ. Она принимает звук и возвращает список событий: для каждой найденной ноты указаны момент начала, длительность, высота в MIDI-номерах и громкость.
Настроена модель у нас довольно строго. Ноты короче примерно ста тридцати миллисекунд отбрасываются на месте — ни один реальный звук в диктанте столько не длится, а вот дребезг вибрато укладывается в этот срок отлично. Диапазон ограничен полосой от 75 до 1100 герц: снизу отсекается гул и рокот помещения, сверху — свистящие призвуки.
И вот здесь начинается самое интересное. Сырой список, который выдаёт модель, показывать пользователю нельзя.
Почему сырой ответ никуда не годится
Дело не в качестве модели, а в природе живого голоса. Инструмент отдаёт ровный звук, голос — нет, и модель честно сообщает обо всём, что слышит.
Вибрато — естественное колебание высоты на выдержанном звуке — превращает одну ноту в гроздь соседних: модель видит не «ля», а «ля, ля-бемоль, ля, ля-диез». Портаменто, то есть скольжение между звуками, оставляет след из промежуточных высот, которых петь никто не собирался. Обертоны заставляют модель фиксировать вторую ноту октавой выше основной — и формально она права, эта частота действительно звучит.
Наконец, одноголосная мелодия по определению не может звучать двумя нотами разом, а в сыром списке такие наложения встречаются постоянно.
Три фильтра
Приведением списка в порядок занимается цепочка из трёх последовательных фильтров.
Первый отсеивает шум. Отбрасываются события, которые одновременно и короткие, и тихие, — почти наверняка это случайный призвук. Условие именно двойное: короткий, но громкий звук вполне может оказаться настоящим стаккато, а долгий и тихий — выдержанной нотой на пиано, и терять ни то ни другое нельзя.
Второй убирает обертоны. Если два события заметно перекрываются во времени, а верхнее лежит на четыре полутона и более выше нижнего, верхнее признаётся призвуком и удаляется. Порог в четыре полутона выбран не случайно: плавный переход между соседними ступенями тоже даёт перекрытие, но никогда не превышает двух полутонов, так что связная мелодическая линия остаётся невредимой.
Третий сводит всё в одноголосие. Обрывки, которые короче двух десятых секунды и отстоят от соседа не более чем на полутон, приклеиваются к нему — это и есть распавшееся вибрато. Повторные срабатывания на одной высоте объединяются. Если новая нота вступает раньше, чем закончилась предыдущая, у предыдущей подрезается хвост.
Тонкость, которая стоила отдельной отладки: настоящий полутоновый шаг между двумя полноценными нотами склеивать нельзя, иначе ход фа — ми превратится в одну ноту. Поэтому объединение срабатывает лишь тогда, когда одна из сторон слишком коротка, чтобы быть самостоятельным звуком.
Из секунд в длительности
К этому моменту известно, какие ноты прозвучали и когда, — но нотная запись оперирует не секундами, а четвертями и восьмыми. Нужен темп.
Определяется он по промежуткам между началами нот: берётся медиана всех интервалов и принимается за долю. Медиана здесь надёжнее среднего — одна случайно затянутая нота не сдвинет результат. Полученное значение сворачивается в разумные пределы от 50 до 200 ударов в минуту, чтобы частая россыпь шестнадцатых не была принята за бешеный темп.
Есть и вторая тонкость. Длительность ноты отсчитывается не от её собственного начала до конца, а от начала одной ноты до начала следующей — именно это ухо воспринимает как «сколько она длилась». Певец, снявший звук чуть раньше времени, не должен получать четверть вместо половинной.
Дальше значения примеряются к сетке — целая, половинная, четверть, восьмая, шестнадцатая — и выбирается ближайшее. Пунктирных ритмов и триолей в распознавании с микрофона нет намеренно: на живом материале они угадываются слишком ненадёжно, и лучше честно показать четверть, чем предложить сомнительный пунктир.
Как выставляется оценка
Записанное сравнивается с эталоном по двум независимым осям.
По высоте нота может совпасть точно, разойтись на один-два полутона, промахнуться ровно на октаву или уйти совсем в сторону. Октавная ошибка выделена особо не из педантизма: для поющих это самый частый промах, и человеку полезно видеть, что ноту он услышал верно, а вот регистр взял не тот. Точное попадание приносит балл целиком, соседний полутон — половину, октава — четверть.
По ритму допуск составляет пятнадцать процентов от эталонной длительности: попал в этот коридор — засчитано. Итоговый процент складывается из двух осей поровну, потому что диктант, записанный верными нотами в неверном ритме, сделан ровно наполовину.
Сопоставление идёт простым последовательным проходом, без хитроумных алгоритмов выравнивания. Для одноголосной мелодии в несколько тактов этого достаточно, а всякое усложнение здесь скорее вредит: пользователю важно понять, где именно он ошибся, а не получить наиболее выгодную для себя трактовку своей записи.
Чего мы пока не умеем
Честный перечень ограничений выглядит так. С микрофона распознаётся только одноголосие — аккорды в этот конвейер не помещаются, для них нужна другая логика. Пунктирные ритмы и триоли из живого звука не восстанавливаются. Размер такта не определяется автоматически: он задаётся вручную, поскольку надёжно угадать его по короткому фрагменту не выходит.
Всё перечисленное — сознательные упрощения, а не недосмотр. Диктант в несколько тактов они не портят, зато позволяют сервису работать быстро и предсказуемо. Посмотреть, как этот конвейер справляется с вашим голосом или инструментом, можно в лаборатории — там показывается результат каждого шага.