Как проверить Duration Slider в Suno до пакетной генерации

Ограничитель длительности — Duration Slider — помогает получить трек нужной длины, но не обещает, что песня останется песней. Модель может уложиться в заданные секунды, но при этом ускорить вокал, пропустить бридж или оборвать трек на середине припева. Если сразу запустить пакет из десятков генераций, такие проблемы обнаружатся уже после того, как вы потратите кредиты и время. Поэтому сначала сделайте небольшой контрольный прогон: несколько генераций с жёстко зафиксированными условиями и записью результатов.
В итоге у вас будет таблица из нескольких трековых генераций и правило «годен / не годен». По нему вы выберете длительность, объём текста, BPM и структуру, которые не конфликтуют друг с другом, и только потом запустите пакет.
Что именно мы проверяем
Длительность — только один из четырёх критериев. Трек проходит контрольный прогон, если выполнены все четыре условия:
- Длительность в допуске. Фактическая длина отличается от цели не больше чем на выбранный вами допуск (например, ±10%).
- Естественный темп. Вокал не «тараторит» и не растягивается, а измеренный BPM близок к тому, что вы задали в стиле.
- Все секции на месте. Каждая секция из разметки текста (
[Verse],[Chorus],[Bridge]и т. д.) слышна в треке и идёт в заданном порядке. - Корректный финал. Трек заканчивается аутро, затуханием или явной кадансой, а не обрывом на полуслове.
Слайдер напрямую влияет только на первый пункт. Остальные три зависят от того, совместима ли выбранная длина с объёмом текста, темпом и структурой. Именно эту совместимость мы и проверяем.
Шаг 0. Подготовьте папку и журнал
Нужны любая Unix-подобная оболочка, ffmpeg/ffprobe и, по желанию, Python с библиотекой librosa для оценки темпа. Команды ниже только читают аудиофайлы и пишут в собственную папку проекта, поэтому их безопасно запускать.
mkdir -p suno-canary/audio suno-canary/notes
printf 'id,target_s,bpm_prompt,lyrics_words,structure,actual_s,bpm_est,sections_ok,ending_ok,notes\n' \
> suno-canary/log.csv
cat suno-canary/log.csv
Каждая генерация получает отдельную строку в журнале. Файлы называйте так, чтобы по имени было понятно, какие условия у трека: d150_bpm100_r1.mp3 — цель 150 секунд, 100 BPM, первый повтор.
Шаг 1. Зафиксируйте всё, кроме одной переменной
Сравнение имеет смысл, только если между генерациями меняется один параметр. Перед прогоном запишите в suno-canary/notes/setup.txt:
- версию модели, выбранную в интерфейсе;
- точный текст промпта стиля, включая указание BPM, если вы его задаёте;
- текст песни с разметкой секций — один и тот же файл для всех генераций;
- прочие включённые настройки, которые есть в вашем интерфейсе (инструментал, вариативность и т. п.).
cat > suno-canary/notes/setup.txt <<'EOF'
model: <версия из интерфейса>
style: <промпт стиля дословно>
lyrics_file: lyrics.txt
other: <прочие настройки>
EOF
sha256sum lyrics.txt >> suno-canary/notes/setup.txt
Хеш текста нужен, чтобы позже доказать, что текст между генерациями не менялся. Если вы поправили одну строку, это уже другой эксперимент.
Шаг 2. Посчитайте «естественную» длительность структуры
Прежде чем двигать слайдер, оцените, сколько времени структура займёт при заданном темпе. В размере 4/4 один такт длится 4 × 60 / BPM секунд. При 100 BPM это 2,4 секунды.
| Секция | Тактов | Секунд при 100 BPM |
|---|---|---|
| Intro | 4 | 9,6 |
| Verse 1 | 16 | 38,4 |
| Chorus | 8 | 19,2 |
| Verse 2 | 16 | 38,4 |
| Chorus | 8 | 19,2 |
| Bridge | 8 | 19,2 |
| Chorus | 8 | 19,2 |
| Outro | 4 | 9,6 |
| Итого | 72 | 172,8 |
Количество тактов в секции модель выбирает сама, поэтому таблица — это ваша гипотеза, а не предсказание. Её задача — показать порядок величин. Если слайдер стоит на 120 секундах, а структура «естественно» занимает около 170, модели придётся что-то сократить: ускорить подачу, урезать секции или оборвать финал. Это и есть конфликт, который мы ищем.
Расчёт можно сделать прямо в оболочке:
python3 -c "bpm=100; bars=72; print(round(bars*4*60/bpm, 1), 's')"
Объём текста тоже нужно измерить. Строки разметки в квадратных скобках не считаются:
grep -v '^\[' lyrics.txt | grep -v '^\s*$' | wc -l # строк текста
grep -v '^\[' lyrics.txt | wc -w # слов
Мы сознательно не даём «нормы слов на такт»: они зависят от жанра, языка и манеры подачи. Лучше возьмите референсный трек вашего жанра, который вам нравится по плотности вокала, посчитайте в нём слова и длину куплета и используйте это соотношение как ориентир.
Шаг 3. Составьте небольшую матрицу прогона
Меняем только позицию слайдера. Ниже пример плана, а не рекомендуемые значения. Подставьте свою расчётную длительность D0 из шага 2.
| ID | Цель слайдера | Зачем |
|---|---|---|
| d_low_r1, d_low_r2 | D0 − 20% | Проверить, что модель жертвует при нехватке времени |
| d_mid_r1, d_mid_r2 | D0 | Базовая точка: структура и время совпадают |
| d_high_r1, d_high_r2 | D0 + 20% | Проверить, не появятся ли повторы, затянутые проигрыши или «хвост» тишины |
Повторы обязательны: генерация недетерминирована, и один удачный трек ничего не доказывает. Если бюджет позволяет, сделайте по три повтора на точку. Если в вашем интерфейсе слайдер выставляется только с определённым шагом, округлите цели до ближайших доступных значений и запишите фактически выставленные.
Шаг 4. Сгенерируйте и сохраните файлы
Запустите генерации вручную по матрице. Скачайте каждый трек в suno-canary/audio/ и сразу переименуйте по схеме из шага 0. После каждой генерации допишите в журнал первые столбцы: id, target_s, bpm_prompt, lyrics_words, structure. Остальные заполните после замеров.
Шаг 5. Измерьте длительность, темп и финал
Длительность
for f in suno-canary/audio/*.mp3; do
printf '%s,%s\n' "$(basename "$f" .mp3)" \
"$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$f")"
done
Тишина в конце и внезапные обрывы
Фильтр silencedetect показывает участки тишины. Длинная тишина в конце говорит о том, что трек «добит» до нужной длины. Если тишины на последних секундах нет совсем, а громкость высокая, это повод проверить, нет ли обрыва.
ffmpeg -hide_banner -i suno-canary/audio/d_mid_r1.mp3 \
-af silencedetect=noise=-45dB:d=1.5 -f null - 2>&1 | grep silence_
Порог -45dB и минимальная длина 1.5 секунды — стартовые значения. Подстройте их под громкость своего материала.
Чтобы быстро прослушать финалы подряд, вырежьте последние 15 секунд каждого трека. Исходники при этом не меняются:
mkdir -p suno-canary/tails
for f in suno-canary/audio/*.mp3; do
ffmpeg -hide_banner -loglevel error -sseof -15 -i "$f" \
"suno-canary/tails/$(basename "$f" .mp3)_tail.wav"
done
Оценка темпа (необязательно)
python3 - <<'EOF'
import glob, numpy as np, librosa
for path in sorted(glob.glob("suno-canary/audio/*.mp3")):
y, sr = librosa.load(path, sr=None, mono=True)
tempo, _ = librosa.beat.beat_track(y=y, sr=sr)
print(path.split("/")[-1], round(float(np.atleast_1d(tempo)[0]), 1))
EOF
Автоматическая оценка темпа часто ошибается в два раза: вместо 100 BPM может показать 50 или 200. Это нормально для таких алгоритмов, поэтому сравнивайте результат с заданным темпом с учётом кратности и подтверждайте на слух.
Шаг 6. Прослушайте секции по чек-листу
Цифры не скажут, на месте ли бридж. Для каждого трека выпишите в suno-canary/notes/<id>.txt таймкоды начала каждой секции:
intro 0:00
verse1 0:09
chorus 0:47
verse2 1:06
chorus 1:45
bridge ? <- не найден
chorus 2:04
outro 2:23 (обрыв на 2:28)
Отмечайте три типа отклонений: секция пропущена, строки текста выпали или сжаты, порядок секций нарушен. По этим заметкам заполните в журнале столбцы sections_ok и ending_ok (yes/no), а в notes коротко опишите, что не так.
Шаг 7. Проверьте результат и примите решение
Сведите журнал в одну картину:
column -s, -t < suno-canary/log.csv | less -S
Пример правила принятия решения (допуски выберите сами и запишите заранее, до прослушивания):
- точка годна, если все её повторы прошли четыре критерия;
- если короткая точка ломает секции, а базовая нет — значит, текст «тяжелее», чем позволяет короткая длина. Либо сократите текст, либо поднимите BPM в промпте, либо уберите секцию из структуры;
- если длинная точка даёт тишину или лишние повторы припева, значит, структуре не хватает материала: добавьте секцию или удлините инструментальный проигрыш в разметке;
- если ни одна точка не прошла, то проблема не в слайдере: пересчитайте шаг 2 и проверьте, не противоречат ли друг другу BPM в промпте и плотность текста.
После любой правки текста, BPM или структуры повторите прогон хотя бы для выбранной точки. Это новый эксперимент со своим хешем текста. Только когда комбинация «длительность + объём текста + BPM + структура» стабильно проходит проверку, переносите её в пакетную генерацию без изменений.
Типовые ошибки
- Меняют несколько параметров сразу. Например, двигают слайдер и одновременно правят текст. После этого невозможно понять, что сработало.
- Делают по одному треку на точку. Удачная генерация может оказаться случайностью, поэтому нужны повторы.
- Проверяют только секундомер. Трек нужной длины без бриджа всё равно брак.
- Слушают только начало. Обрывы и «добивка» тишиной находятся в конце, поэтому слушайте финалы отдельно (шаг 5).
- Доверяют автооценке BPM. Ошибки кратности в два раза случаются часто, поэтому всегда проверяйте на слух.
- Задают допуски после прослушивания. Так проще подогнать вывод под желаемый результат. Записывайте критерии до прогона.
- Переносят в пакет «почти ту же» конфигурацию. Даже мелкая правка промпта означает, что проверка устарела.
Ограничения метода
- Контрольный прогон снижает риск, но не гарантирует результат: в большом пакете брак всё равно возможен. Заложите выборочную проверку и в самом пакете.
- Результаты относятся к конкретной версии модели и конкретному промпту. После обновления модели или смены жанра прогон нужно повторить.
- Расчёт по тактам в шаге 2 — это оценка. Модель сама решает, сколько тактов отдать каждой секции.
- Объективные замеры (длительность, тишина, темп) не заменяют прослушивание. Естественность подачи оценивает человек.
- Мы не знаем, как именно слайдер реализован внутри сервиса, и не утверждаем этого. Метод проверяет только наблюдаемый результат.
Что дальше
Другие пошаговые проверки перед масштабированием генераций собраны в разделе гайдов. Термины из этой статьи — контрольный прогон, допуск, структура секций — объясняются в глоссарии.