Added a way for aduio correlation
This commit is contained in:
1 parent
afe90c817b
commit
5e7a73d78f
2 files changed
+345
No files matched your search
+76
@@ -0,0 +1,76 @@
|
||||
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)
|
||||
Reference in new issue
Block a user