Пометка и удаление музыки из записи прямого эфира

Источник: AudD•

Пометка и удаление музыки из записи прямого эфира

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

Запись прямого эфира — спортивной трансляции, радиошоу, VOD-стрима или конференции — в основном состоит из речи, шума толпы и комментариев, в которые вплетены фрагменты защищенной авторским правом музыки: музыка для выхода, заставки, фоновые композиции, сегменты диджея. Этот рецепт позволяет точно определить, где звучит музыка и что это за композиция, отметить каждый сегмент в отчете, а затем создать очищенную копию записи, в которой эти сегменты заглушены или вырезаны.

Что вы создадите

Два результата за один проход распознавания:

  • Отчет с пометками — по одной строке на каждый музыкальный сегмент, с указанием абсолютного времени начала/окончания в файле и трека, который там звучит (исполнитель, название, лейбл, ISRC, ссылки). Это то, что вы передаете рецензенту, юридическому отделу или в журнал соответствия требованиям.
  • Очищенная запись — тот же файл, в котором каждый помеченный сегмент либо заглушен (аудио обнулено, видео не затронуто), либо полностью вырезан; файл создается с помощью ffmpeg на основе временных меток из отчета.

Корпоративная конечная точка (enterprise endpoint) — подходящий инструмент: она обрабатывает записи произвольной длины и находит все треки, а не только один. И строки отчета, и правки ffmpeg основаны на позициях в файле — где именно в записи находится каждый музыкальный фрагмент. Каждое совпадение содержит параметры start_seconds и end_seconds, то есть позицию песни в вашем файле, а запросы recognize_enterprise по умолчанию запрашивают точные смещения, поэтому они очень точны.

AudD идентифицирует музыку, а политика — за вами. Этот рецепт находит и называет записи, а также редактирует ваш файл. Нужно ли на самом деле заглушать или вырезать конкретный сегмент — из-за лицензирования, добросовестного использования или правил вашей платформы — это решение, которое вы принимаете на основе отчета, а не то, что определяет API.

AudD идентифицирует музыку, а политика — за вами. Этот рецепт находит и называет записи, а также редактирует ваш файл. Нужно ли на самом деле заглушать или вырезать конкретный сегмент — из-за лицензирования, добросовестного использования или правил вашей платформы — это решение, которое вы принимаете на основе отчета, а не то, что определяет API.

Предварительные требования

  • API-токен с dashboard.audd.io. Получите там свой собственный токен; на нем должна быть включена корпоративная конечная точка. Параметры label, isrc и upc возвращаются в корпоративных ответах (для ISRC/UPC требуется план Startup или выше).
  • Python 3.10+ с SDK: pip install audd
  • ffmpeg (и ffprobe) в вашем PATH для этапа очистки.
  • Запись в виде URL или локального файла. https://audd.tech/example.mp3 — это публичный, воспроизводимый файл, который вы можете использовать для сквозного тестирования.

Пошаговое руководство

Шаг 1: Распознавание записи

Отправьте запись в recognize_enterprise в виде URL, байтов файла или пути. Многочасовая трансляция возвращается в виде плоского списка list[EnterpriseMatch] — по одной записи на каждый распознанный фрагмент в хронологическом порядке — и каждая запись имеет точные start_seconds / end_seconds, так как точные смещения запрашиваются по умолчанию.

Каждая напечатанная строка — это один распознанный фрагмент в хронологическом порядке. Музыкальный фон, который длится минуту, отображается как несколько последовательных совпадений с одним и тем же треком (шаг 3 объединяет их в один сегмент). Участки, где звучит только речь или шум толпы, не дают совпадений — это пропуск, а не ошибка, и именно то, что вам нужно: эти участки остаются нетронутыми.

Всегда устанавливайте limit во время разработки. Корпоративная конечная точка тарифицируется за каждые 12 секунд обработанного аудио. Двухчасовая трансляция — это сотни фрагментов; неограниченный вызов учитывает их все. Начните с limit=25, добейтесь правильного отчета и редактирования, а затем увеличьте лимит для полной записи.

Всегда устанавливайте limit во время разработки. Корпоративная конечная точка тарифицируется за каждые 12 секунд обработанного аудио. Двухчасовая трансляция — это сотни фрагментов; неограниченный вызов учитывает их все. Начните с limit=25, добейтесь правильного отчета и редактирования, а затем увеличьте лимит для полной записи.

Шаг 2: Позиции в файле, а не позиции в песне

Фильтр заглушения и математика вырезания используют позиции в файле, и start_seconds / end_seconds — это именно они: где эта песня звучит в вашем файле, в секундах (например, с 64.2 по 71.6). Передавайте их напрямую в плеер или ffmpeg. Они имеют значение None только в том случае, если фрагмент пришел без пригодной позиции.

Не используйте start_offset / end_offset — это необработанные смещения, из которых выводятся секунды, миллисекунды внутри внутреннего 12-секундного фрагмента сканирования AudD (0–~12000), а не секунды файла. И не используйте таймкод как позицию в файле: это позиция внутри записанной песни, которая говорит вам, какая часть песни звучала, а не где в вашем файле она звучит.

Шаг 3: Создание музыкальных сегментов из совпадений

Отчет и редактирование требуют по одному сегменту на каждое непрерывное воспроизведение — «эта музыка звучит с 64.2с по 96.0с» — а не по строке на фрагмент. Сверните последовательные совпадения с одним и тем же (исполнителем, названием) в один сегмент, охватывающий время от start_seconds первого совпадения до end_seconds последнего.

30-секундная заставка становится одним сегментом с реальным началом и концом. Поскольку SDK анализирует ответы гибко, любое поле может отсутствовать или быть None; проверка start_seconds и резервное значение end_seconds покрывают фрагмент, который приходит без позиции.

Шаг 4: Форматирование позиций в ЧЧ:ММ:СС

Отчет требует времени по часам, а не необработанных секунд. Отформатируйте абсолютные позиции файла:

Это всегда дает дополненное нулями значение ЧЧ:ММ:СС, которое легко читается для записи, длящейся более часа.

Шаг 5: Создание отчета с пометками

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

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

Шаг 6: Заглушение помеченных сегментов

Если вы хотите сохранить полную длину и временную шкалу записи (чтобы существующие метки глав, субтитры и ссылки на клипы оставались на своих местах), заглушите аудио на каждом помеченном интервале и оставьте все остальное нетронутым. Фильтр громкости ffmpeg с выражением enable обнуляет аудио только между началом и концом каждого сегмента:

Объединение одного условия volume=...:volume=0 на сегмент создает единый аудиофильтр, который заглушает каждый помеченный интервал и пропускает остальное. -c:v copy оставляет видеопоток без изменений; перекодируется только аудио. Выходной файл имеет ту же длительность и временную шкалу, что и исходный — музыка просто исчезает.

Шаг 7: Или вырезание помеченных сегментов

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

Это обрезает каждый нужный интервал из исходного файла и объединяет их, полностью удаляя музыку. Результат короче исходного файла на общую длительность помеченных сегментов. (Для записи только с аудио удалите части [0:v]/v=1 и оставьте только atrim/audio concat.)

Отключение звука сохраняет временную шкалу; вырезание изменяет её. Используйте отключение звука, когда другие ресурсы (субтитры, главы, клипы с лучшими моментами) ссылаются на временные метки в оригинале — их позиции останутся прежними. Используйте вырезание, если хотите удалить музыку и получить файл меньшего размера, и готовы заново соотнести любые ресурсы с временными метками с новой временной шкалой.

Отключение звука сохраняет временную шкалу; вырезание изменяет её. Используйте отключение звука, когда другие ресурсы (субтитры, главы, клипы с лучшими моментами) ссылаются на временные метки в оригинале — их позиции останутся прежними. Используйте вырезание, если хотите удалить музыку и получить файл меньшего размера, и готовы заново соотнести любые ресурсы с временными метками с новой временной шкалой.

Шаг 8: Запуск от начала до конца

source — это то, что распознает AudD (URL или загруженные байты); input_path — это локальный файл, который вы редактируете. Часто это одна и та же запись — распознайте размещенную копию или загрузите байты, а затем примените полученные диапазоны к вашему локальному мастер-файлу.

Что вы получаете в ответ

Один EnterpriseMatch на каждый распознанный фрагмент в хронологическом порядке. Поля, которые считывает этот рецепт:

Для примера файла совпадение может вернуться со значениями start_seconds = 64.2 и end_seconds = 71.6 — это диапазон, который используется как для фильтра volume=enable='between(t,64.2,71.6)':volume=0, так и для расчетов вырезания/сохранения.

Обработка ошибок

SDK вызывает типизированные исключения; перехватывайте те, на которые можете повлиять.

  • Ошибки аутентификации (AudDAuthenticationError) — неверный или отсутствующий токен. Завершайте работу при запуске.
  • Ошибки квоты / подписки (AudDSubscriptionError) — достигнут лимит запросов или корпоративная конечная точка не включена для вашего токена. Корпоративная конечная точка и ISRC/UPC зависят от тарифного плана; сообщайте об этом владельцу учетной записи, а не повторяйте запрос.
  • Ошибки недействительного аудио — URL или файл не были декодируемым аудио/видео. Рассматривайте это как критический сбой для данного источника, а не как молчаливый пустой отчет.
  • Ошибки соединения (AudDConnectionError) — временные. Повторите попытку с экспоненциальной задержкой.
  • Сбои ffmpeg/ffprobe — ненулевой код выхода вызывает subprocess.CalledProcessError. Неверный путь к файлу или проблема с кодеком проявляются здесь, отдельно от распознавания; не путайте это с пустым отчетом.

Пустой отчет (отсутствие помеченных сегментов) — это допустимый и отдельный результат, отличный от ошибки; в охваченном диапазоне не было распознано музыки, поэтому нечего отключать или вырезать, а шаги очистки не выполняют никаких действий.

Дальнейшие шаги

  • Повторный запуск распознавания снова учитывает каждый фрагмент. Выполняйте сканирование один раз для каждой записи и сохраняйте отчет; восстанавливайте файл с отключенным звуком или вырезанными фрагментами из сохраненных диапазонов, а не путем повторного сканирования.
  • Для многочасовой трансляции, где вам нужна только примерная карта расположения музыки, используйте параметры every/skip, чтобы обменять полноту покрытия на количество учитываемых фрагментов — см. Оптимизация корпоративных затрат.
  • Если ваша цель — подача уведомления об удалении, а не редактирование на месте, те же значения start_seconds/end_seconds используются для формирования пакета доказательств — см. Создание доказательств для удаления по DMCA.
  • Чтобы сканировать файлы по мере их загрузки, а не постфактум, см. Создание сканера авторских прав для пользовательского контента.
  • Создание доказательств для удаления по DMCA
  • Создание сканера авторских прав для пользовательского контента
  • Оптимизация корпоративных затрат
  • Документация Python SDK
  • Справочник API

О чём эта статья