Все кейсы

Свой продуктAndroid

FartGuard

неловкий звукDJ-сет

Слышит один звук — и либо маскирует его, либо превращает в живой DJ-сет.

Коротко

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

  • Шуточная идея как полигон для трудного: ML на устройстве, звук в реальном времени, генеративная музыка и вирусная механика шеринга.
  • Два детектора: быстрый по энергии полос (Goertzel) и дообученный YAMNet на TensorFlow Lite — 2 272 положительных клипа из AudioSet.
  • Ремикс: тональность подстраивается под высоту звука, сет пишется партитурой от первого такта, «пересвести» даёт новый дубль.
  • 15 записанных решений, включая честные: «8 реальных жанров, а не 20 обещанных» и три смены релизного трека.
  • 208

    жанров, которые движок действительно умеет

  • 2 272

    положительных клипов для дообучения YAMNet

  • 15

    записанных решений

Зачем

Всё началось как «мем-приложение для маскировки звуков в туалете» — с персонами «Мемер Миша», «Стеснительная Света» и «Офисный Олег». Шутка оказалась отличным полигоном: распознавание звука на устройстве, аудио с задержкой меньше 200 мс и музыка, которую нужно сочинить за секунды.

Решение

  1. 01

    Слушать

    Кнопка GO, живое спектральное кольцо, фоновое прослушивание по желанию. Звук с микрофона на 16 кГц не покидает телефон.

  2. 02

    Замаскировать

    50 звуков в пяти категориях: мемы, музыка, природа, маскировка, озвучка.

  3. 03

    Или ремикс

    Сет в одном из 8 жанров, где пойманный звук — ведущий инструмент. Экспорт вертикального видео с визуализатором.

  4. 04

    Похвастаться

    9 рангов от «Ninja 🥷» до «Extinction Level Event ☄️», пиковые децибелы, серии дней и карточка «Beat this».

Попробуйте

Решения

  • 0006

    Восемь реальных жанров, а не двадцать обещанных

    Почему. Дизайн называл 20 жанров, а движок умел 8 — и молча подменял выбор трэпом. Теперь меню предлагает только то, что существует, а остальные 12 названий — дорожная карта, которую нельзя описывать как готовую фичу.

    Что отвергли: Оставить 20 в меню: тот же баг, только меню длиннее.

  • 0014

    Сэмпл ведёт: тональность следует за ним, сет — это партитура

    Почему. Пришла жалоба: «сэмпл не попадает в ремикс». Причин оказалось четыре — от 16-битного PCM, который движок читал как float, до тональности, выбранной случайно на октаву от звука. Решение: тональность выбирается от высоты сэмпла, композитор пишет весь сет партитурой, а сэмпл становится ведущим инструментом.

  • 0010–0012

    Релизный трек менялся трижды — и каждое решение записано

    Почему. Сначала пуш уходил тестировщикам, потом в продакшн, потом снова во внутреннее тестирование, пока не готова страница в сторе. Отменённые решения не удалены: по ним видно, почему текущее такое.

  • 0003

    Один движок, два хоста

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

Как устроено

Expo и React Native на TypeScript, состояние в Zustand с MMKV. Детектор по умолчанию — фильтр Goertzel по энергии полос; второй — YAMNet, дообученный в ноутбуках Colab и Kaggle на клипах AudioSet и упакованный в TensorFlow Lite на 7,8 МБ. Музыка — генеративный движок на Tone.js в скрытом WebView. Телеметрия уходит в PostHog напрямую, без SDK. Каждый пуш в main собирается в EAS и GitHub Actions.

Статус

Сборки уходят во внутреннее тестирование Google Play; на физических устройствах приложение ещё не гоняли, скриншотов для стора пока нет. Музыкальный движок можно послушать прямо здесь.

Хотите подробнее? Переключите глубину на 30 мин.

ДальшеFINLEADGENтрафик → продажи