Rhythm Lab
Для кого: Для тех, кто создаёт локальные профили классификаторов. Задача: Размечать, обучать, проверять и публиковать модели, не нарушая границы исходного аудио. Тип: Руководство
Rhythm Lab — отдельный локальный инструмент разметки и обучения. Его метки, предсказания, контрольные точки и артефакты остаются в tools/rhythm-lab/; основную фонотеку v7 он читает преимущественно без записи. Явное переключение отметки «нравится» — узкий путь записи в основную базу. Rhythm Lab не изменяет исходное аудио.
python tools\rhythm-lab\rhythm_lab_cli.py serve --source .\data\library.sqlite --labels tools\rhythm-lab\data\rhythm_lab.sqliteСоздайте и разметьте профиль, обучите его по объявленным входам, проверьте предсказания и опубликуйте выбранный артефакт. Публикация делает артефакт доступным для расчёта только по базе данных в основном приложении. Расчёт не декодирует аудио и записывает строки только своего classifier_key.
Для расчёта совместим только манифест классификатора версии 2. Добавленные в репозиторий артефакты версии 1 или без версии блокируются до переобучения и публикации. Профили, зависящие от SONARA, должны совпадать с текущими контрактами SONARA и ревизией признаков 6; отсутствующие входы считаются несовместимостью, а не заполняются нулями.
При изменении релиза SONARA сначала выполните упорядоченный и продолжаемый после сбоя сценарий prepare-sonara-release для пары Core + Artifacts, затем повторно проанализируйте, переобучите, опубликуйте и пересчитайте затронутые профили. Это не распределённая атомарная транзакция. Порт frontend v7 отложен, поэтому не полагайтесь на текущие браузерные инструкции запуска или CLASS tab. Эти инструкции не описывают работу v7.
Восстановление меток из сохранённой старой базы
Инструмент переноса принимает запечатанные комплекты формата версии 3. Сохраните исходную побайтовую резервную копию старой базы Lab вместе с соответствующими файлами -wal и -shm. Именно этот комплект SQLite остаётся исходным артефактом восстановления. Экспортированные комплекты JSON и отчёты — производные рабочие файлы, а не замена сохранённому комплекту базы.
Запускайте команды из tools/rhythm-lab/. Экспорт использует один зафиксированный снимок SQLite только для чтения, включая зафиксированные страницы WAL. Значения SQL NULL остаются null, а метки с одинаковым путём сохраняются как отдельные записи:
python -m rhythm_lab.label_transfer export --lab-db <legacy-lab.sqlite> --output <export.json>
python -m rhythm_lab.label_transfer preview --bundle <export.json> --core-db <current-v7-core.sqlite> --output <preview.json>
python -m rhythm_lab.label_transfer rebound --bundle <export.json> --preview <preview.json> --output <rebound.json>Форма команды восстановления:
python -m rhythm_lab.label_transfer restore --bundle <rebound.json> --core-db <current-v7-core.sqlite> --lab-db <target-lab.sqlite> --report <report.json> [--accept-record-id sha256:...] [--apply] [--force]Квадратные скобки обозначают необязательные параметры и не входят в команду буквально. Сначала запустите её без --apply. По умолчанию команда записывает только отчёт и не создаёт и не изменяет целевую базу Lab. Сильные совпадения подходят автоматически. Слабое совпадение остаётся строкой восстановления, пока вы не проверите его и не передадите устойчивый ID через --accept-record-id; для нескольких записей повторите параметр.
Непосредственно перед планированием предварительного просмотра или применения команда снова открывает актуальную базу Core v7 только для чтения. Цель из rebound должна по-прежнему точно совпадать по catalog_uuid, track_uuid, content_generation, выбранному пути, размеру файла и mtime. Изменившаяся привязка становится неразрешённой записью восстановления, а не меткой.
При применении неразрешённые строки записываются в classifier_label_recovery. Сюда входят непринятые слабые совпадения, отсутствующие или неоднозначные пути, изменившиеся сведения о файле, устаревшие привязки и проигравшие конфликты. Конфликт разрешается детерминированно: побеждает самая поздняя исходная запись по updated_at, а при равенстве — лексикографически наименьший record_id. Ни одна исходная запись метки не отбрасывается незаметно.
Перед изменением существующей цели команда применения копирует целевую базу Lab и имеющиеся соседние файлы -wal и -shm в каталог резервной копии с временной меткой. Повторное применение того же rebound-комплекта идемпотентно по данным: связанные метки и строки восстановления обновляются без дублирования. --force разрешает только заменить существующий файл отчёта JSON и не отключает проверку совпадений, конфликтов или Core.
Экспорт, предварительная проверка, rebound и восстановление не записывают данные в Core v7, исходные аудиофайлы или опубликованные модели. Только --apply записывает целевую базу Lab; команды также создают запрошенные файлы JSON и резервную копию цели перед применением.