from pathlib import Path import subprocess import numpy as np from scipy.signal import correlate import tempfile import soundfile as sf import matplotlib.pyplot as plt def extract_audio(file: Path, duration: float): tmp = tempfile.NamedTemporaryFile(suffix=".wav", delete=False) subprocess.run([ "ffmpeg", "-y", "-i", str(file), "-map", "0:a:0", # first audio stream "-ac", "1", # mono "-ar", "44100", # fixed sample rate "-t", str(duration), # limit duration tmp.name ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) data, sr = sf.read(tmp.name) return data, sr def get_audio_offset(file1: Path, file2: Path, important_time: float): sig1, sr1 = extract_audio(file1, important_time) sig2, sr2 = extract_audio(file2, important_time) if sr1 != sr2: raise ValueError("Sample rates do not match") # normalize signals sig1 = sig1 - np.mean(sig1) sig2 = sig2 - np.mean(sig2) corr = correlate(sig1, sig2, mode="full") lag = np.argmax(corr) - (len(sig2) - 1) offset_seconds = lag / sr1 return offset_seconds def view_audio_correlation(file1: Path, file2: Path, important_time: float): sig1, sr1 = extract_audio(file1, important_time) sig2, sr2 = extract_audio(file2, important_time) if sr1 != sr2: raise ValueError("Sample rates differ") sig1 = sig1 - np.mean(sig1) sig2 = sig2 - np.mean(sig2) corr = correlate(sig1, sig2, mode="full") lags = np.arange(-len(sig2)+1, len(sig1)) lag_seconds = lags / sr1 offset_index = np.argmax(corr) offset_seconds = lag_seconds[offset_index] plt.figure(figsize=(10,5)) plt.plot(lag_seconds, corr) plt.axvline(offset_seconds, linestyle="--") plt.title(f"Audio Cross-Correlation (offset ≈ {offset_seconds:.3f}s)") plt.xlabel("Lag (seconds)") plt.ylabel("Correlation") plt.show() return offset_seconds ger = "/home/honney/mount/Media/tmp/serien/Maid Sama All/Maid Sama/S01/07.mkv" jap = "/home/honney/mount/Media/tmp/serien/Maid Sama All/Kaichou wa Maid-sama!/S01/07.mkv" offset = view_audio_correlation(Path(ger), Path(jap), 90) print(offset)