У меня загружается 3-часовой MP3-файл, и каждые ~ 15 минут воспроизводится отдельный 1-секундный звуковой эффект, который сигнализирует о начале новой главы.
Можно ли каждый раз идентифицировать этотзвуковой эффект воспроизводится, поэтому я могу отметить смещения по времени?
Звуковой эффект всегда одинаков, но, поскольку он был закодирован в формате с потерями, будет небольшое отклонение.
Смещения времени будут сохранены в метаданных фрейма главы ID3 .
Пример источника , где звуковой эффект воспроизводится дважды.
ffmpeg -ss 0.9 -i source.mp3 -t 0.95 sample1.mp3 -acodec copy -y
ffmpeg -ss 4.5 -i source.mp3 -t 0.95 sample2.mp3 -acodec copy -y
Я очень новичок в обработке звука, но моей первоначальной мыслью было извлечь образец1 секунды звукового эффекта, затем используйте librosa
в python для извлечения временных рядов с плавающей запятой для обоих файлов, округлитечисла с плавающей запятой и попытайтесь найти совпадение.
import numpy
import librosa
print("Load files")
source_series, source_rate = librosa.load('source.mp3') # 3 hour file
sample_series, sample_rate = librosa.load('sample.mp3') # 1 second file
print("Round series")
source_series = numpy.around(source_series, decimals=5);
sample_series = numpy.around(sample_series, decimals=5);
print("Process series")
source_start = 0
sample_matching = 0
sample_length = len(sample_series)
for source_id, source_sample in enumerate(source_series):
if source_sample == sample_series[sample_matching]:
sample_matching += 1
if sample_matching >= sample_length:
print(float(source_start) / source_rate)
sample_matching = 0
elif sample_matching == 1:
source_start = source_id;
else:
sample_matching = 0
Это не работает с файлами MP3, описанными выше, но работает с версией MP4 - где он смог найти образец, который я извлек, ноэто был только один образец (не все 12).
Я также должен отметить, что этот сценарий занимает чуть более 1 минуты для обработки 3-часового файла (который включает 237 426 624 образца).Поэтому я могу себе представить, что какое-то усреднение в каждом цикле может привести к тому, что это займет значительно больше времени.