← все системы
04 · своё приложение · 2026

Sep

звук и видео разбираются на самом устройстве

Убрать шум, развести голоса, вырезать одного говорящего, свести музыку с видео, положить поверх надписи с ключевыми кадрами и смонтировать результат — без сервера и без интернета. Не веб и не панель: свой движок на Rust и приложение для Mac и Android.

21день от первого коммита106выпусков за эти дни0серверов для обработки
обработка на устройствесвой движок на Rustнейросети без облакаключевые кадры и кривыеMac и Android
Sep на телефоне: медиатека с обложками проектов и рядом тегов
Sep на телефоне: видео, кнопки проигрывания и таймлайн с двумя отрывками
01 Задача

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

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

02 Звук: у каждого отрывка свой

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

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

Запись разрезана на три отрывка: в первом убран шум, второй как записан, в третьем убран один голос
Запись разрезана на три отрывка: в первом убран шум, второй как записан, в третьем убран один голос

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

03 Монтаж и живое сведение

Ролики и звук ложатся на общий таймлайн: их режут, склеивают и кладут друг под друга. Файл можно просто бросить в окно — он встанет от указателя. Обрезанное не теряется: исходник хранится, и отрезанную часть можно вернуть.

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

Монтаж «Старт» — четыре ролика подряд на общем таймлайне: играют сразу, без сборки
Монтаж «Старт» — четыре ролика подряд на общем таймлайне: играют сразу, без сборки

На вкладке «Видео» — картинка: поворот, цвет, слежение за объектом. Отмечаешь объект на одном кадре — приложение ведёт его через весь ролик и держит на нём окно, даже когда объект ненадолго скрывается.

Вкладка «Видео»: картинка, слежение и стоп-кадры
Вкладка «Видео»: картинка, слежение и стоп-кадры
04 Слои и ключевые кадры

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

Место, масштаб, поворот и прозрачность движутся по ключевым кадрам — как в After Effects. У каждого свойства свой секундомер, ключи видны на таймлайне отдельной полоской на свойство: ромбик тянется по времени, выделенный удаляется.

Надпись въезжает сверху: ключи места и масштаба — полосками под слоем
Надпись въезжает сверху: ключи места и масштаба — полосками под слоем

Между ключами — кривая. Есть заготовки («ровно», «плавно», «разгон», «тормоз», «скачок»), а можно взять две ручки и потянуть пальцем, как cubic-bezier в CSS. Вытянутая за рамку кривая даёт перелёт: надпись проскакивает место и возвращается. Правка видна на картинке сразу.

Кривая перелёта: ручка выше рамки — надпись проскакивает и возвращается
Кривая перелёта: ручка выше рамки — надпись проскакивает и возвращается

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

Те же слои и ключи на телефоне
Те же слои и ключи на телефоне
05 Скорость

Любой отрывок можно ускорить или замедлить — от ×0,1 до ×8, ровно или разгоном по ключам с теми же кривыми, что у слоёв. Ключи стоят на секундах самого ролика: обрезка и перенос отрывка разгон не сдвигают.

Отрывок разгоняется по ключам: панель «Скорость», на таймлайне — значок «×~»
Отрывок разгоняется по ключам: панель «Скорость», на таймлайне — значок «×~»

Звук идёт с той же скоростью, но голос не превращается в бурундука: движок растягивает его во времени без смены высоты. Алгоритм свой, на Rust, — встроенного в FFmpeg на устройстве нет. И он держит громкость: на шуме обычное растяжение проседает на несколько децибел, наше — укладывается в полдецибела.

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

06 Телефон — главный экран

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

Медиатека: проекты и отбор по тегам
Медиатека: проекты и отбор по тегам
Тот же редактор — на телефоне
Тот же редактор — на телефоне
Теги по папкам: открыл папку, нажал тег
Теги по папкам: открыл папку, нажал тег
07 Когда тегов сотни

Теги вложенные и лежат по папкам. Вся система видна деревом: под каждым тегом — проекты, дерево можно приближать, пока обложка не займёт экран.

Все теги деревом, под каждым — проекты
Все теги деревом, под каждым — проекты

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

То же дерево — на телефоне
То же дерево — на телефоне
08 Отмена всего

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

09 Свой файл и своё облако

Проект — один файл: исходник, результаты, разметка и теги. Его можно сохранить, переслать и открыть на другом устройстве.

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

На телефоне видно всё, что есть на компьютере: проект, которого на устройстве нет, лежит карточкой с весом в облаке и докачивается, когда понадобится. Удалить его можно только с этого устройства или отовсюду — тогда он месяц лежит в корзине облака.

10 На чём это держится

Вся обработка — в движке на Rust. Он собран как библиотека, и одно и то же ядро работает в приложении на Mac, в приложении на Android и в командной строке. Нейросети исполняются на самом устройстве; их веса скачиваются один раз.

У проекта 382 автопроверки — движка и интерфейса, включая экраны в размере телефона. Каждая сборка уходит в хранилище с контрольной суммой, и выложенную сборку нельзя подменить.

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

Материалы в ней — видео и звук NASA и «Лунный свет» Дебюсси в исполнении Laurens Goedhart, в общественном достоянии. Использование материалов NASA не означает, что агентство одобряет продукт.

11 Результат

На 23 октября — 21 день от первого коммита: 106 выпусков, 15,3 тысячи строк движка на Rust и 42,6 тысячи строк приложения. Приложение работает на Mac и Android. Публичный релиз готовится — пока приложение проходит обкатку на настоящей медиатеке.