🎸 Video Music Cutter — Automatische Musiksegment-Extraktion

Python-basierte Audio-Analyse mit libROSA/FFmpeg zur intelligenten Erkennung und Extraktion von Musik- und Gesangssegmenten aus Videos

PythonlibROSAFFmpegmoviepyAudio DSP

🚀 Bereit für Ihre digitale Transformation?

Vereinbaren Sie ein unverbindliches Strategiegespräch

📞 02406 803 7603 ✉️ info@computerkumpel.de

📊 Business Value

Extrahiert automatisch Musik- und Gesangssegmente aus Videos, in denen zwischen gesprochenem Text und Musikperformance gewechselt wird. Spart Stunden manueller Videobearbeitung – perfekt für Content Creator, die ihre Musik-Highlights isolieren wollen.

⏱️
Zeitersparnis
Vollautomatische Extraktion – kein manuelles Schneiden, kein Durchhören. Ein Befehl, fertig.
🧠
Intelligente Erkennung
4 Audio-Features gleichzeitig: Spectral Centroid, Zero-Crossing-Rate, Chroma, MFCC – gewichtet zu einem Music-Score.
🎯
Präzision
Feinabstimmbare Parameter: --spectral-threshold, --silence-thresh, --min-duration für perfekte Ergebnisse.
📦
Batch-fähig
Verarbeitet beliebig viele Videos per PowerShell/Loop – Skalierung ohne Mehraufwand.

⚙️ Technische Architektur

1
🎵

Audio-Extraktion

moviepy extrahiert die Audio-Spur aus dem Video und speichert sie als temporäre WAV-Datei.

2
📊

Feature-Analyse

libROSA berechnet spectral_centroids, zero_crossing_rate, chroma_stft und 13 MFCC-Koeffizienten.

3
🔇

Silence-Detection

pydub detect_nonsilent() findet aktive Audio-Segmente als Kandidaten für die Musik-Klassifikation.

4
✂️

Video-Schnitt

moviepy subclip() + concatenate_videoclips() schneidet Musik-Clips aus und rendert das Ergebnis mit H.264/AAC.

💻 Echter Code aus dem Projekt

Direkt aus D:\arbeit\git\videocut\ — produktiv eingesetzter Python-Code.

🎵 Musiksegment-Detektor: Feature-Extraktion mit libROSA

class MusicSegmentDetector:
    """Erkennt Musik- und Gesangssegmente in Audiodateien"""
    
    def __init__(self, min_music_duration=10, min_silence_len=1000, 
                 silence_thresh=-40, spectral_threshold=0.6):
        self.min_music_duration = min_music_duration
        self.min_silence_len = min_silence_len
        self.silence_thresh = silence_thresh
        self.spectral_threshold = spectral_threshold
    
    def analyze_audio_features(self, audio_path):
        """Analysiert Audio-Features um Musik von Sprache zu unterscheiden"""
        y, sr = librosa.load(audio_path, sr=22050)
        
        # Spektrale Centroid (Helligkeit des Sounds)
        spectral_centroids = librosa.feature.spectral_centroid(
            y=y, sr=sr)[0]
        # Zero Crossing Rate (Sprachsignale haben höhere ZCR)
        zcr = librosa.feature.zero_crossing_rate(y)[0]
        # Chroma Features (musikalische Tonhöhen)
        chroma = librosa.feature.chroma_stft(y=y, sr=sr)
        chroma_mean = np.mean(chroma, axis=0)
        # Spectral Rolloff
        spectral_rolloff = librosa.feature.spectral_rolloff(
            y=y, sr=sr)[0]
        # MFCC (Mel-frequency cepstral coefficients)
        mfcc = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)
        
        return {
            'spectral_centroids': spectral_centroids,
            'zcr': zcr, 'chroma_mean': chroma_mean,
            'spectral_rolloff': spectral_rolloff,
            'mfcc': mfcc, 'sr': sr, 'y': y
        }

🧮 Musik-Score-Berechnung: Gewichtete Feature-Kombination

def _calculate_music_score(self, features, start_sec, end_sec):
    """Berechnet einen Score, wie wahrscheinlich das Segment Musik ist"""
    time_frames = features['time_frames']
    start_idx = np.searchsorted(time_frames, start_sec)
    end_idx = np.searchsorted(time_frames, end_sec)
    
    segment_zcr = features['zcr'][start_idx:end_idx]
    segment_spectral = features['spectral_centroids'][start_idx:end_idx]
    segment_chroma = features['chroma_mean'][start_idx:end_idx]
    
    # Musik hat: niedrigere ZCR, höhere spektrale Varianz,
    # stärkere harmonische Struktur (Chroma)
    zcr_score = 1.0 - min(np.mean(segment_zcr), 0.3) / 0.3
    spectral_var = np.std(segment_spectral)
    spectral_score = min(spectral_var / 1000.0, 1.0)
    chroma_score = min(np.mean(segment_chroma), 1.0)
    
    # Gewichteter Durchschnitt: 30% ZCR + 30% Spectral + 40% Chroma
    music_score = (zcr_score * 0.3 + spectral_score * 0.3 +
                   chroma_score * 0.4)
    return music_score

✂️ Video-Schnitt mit moviepy: Segment-Extraktion & Rendering

def cut_video_segments(video_path, segments, output_path):
    """Schneidet Video-Segmente aus und erstellt eine neue Datei"""
    video = VideoFileClip(video_path)
    clips = []
    
    for i, (start, end) in enumerate(segments):
        print(f"  Extrahiere Segment {i+1}: {start:.1f}s - {end:.1f}s")
        clip = video.subclip(start, end)
        clips.append(clip)
    
    if not clips:
        print("⚠ Keine Segmente gefunden!")
        video.close()
        return False
    
    final_clip = concatenate_videoclips(clips)
    final_clip.write_videofile(
        output_path,
        codec='libx264', audio_codec='aac',
        temp_audiofile=tempfile.mktemp(suffix='.m4a'),
        remove_temp=True
    )
    
    video.close(); final_clip.close()
    for clip in clips: clip.close()
    return True

🛠️ Technologie-Stack

🐍
Python 3
Hauptsprache mit argparse für CLI, OOP-Architektur mit MusicSegmentDetector-Klasse.
🎼
libROSA
Audio-Feature-Extraktion: Spectral Centroid, ZCR, Chroma STFT, MFCC (13 Koeffizienten), Spectral Rolloff.
🎬
moviepy
Video-I/O, Subclip-Extraktion, Concatenation. Rendering mit H.264/AAC-Codecs.
🔊
pydub
Silence-Detection via detect_nonsilent() mit konfigurierbaren dB-Schwellenwerten.
🎞️
FFmpeg
Backend für Audio/Video-Encoding. Plattformunabhängig via PATH-Integration.
📐
NumPy
Array-Operationen für Feature-Berechnung, searchsorted für Frame-Mapping, statistische Aggregation.

🚀 In Tagen zum MVP — nicht in Monaten

📞 02406 803 7603 ✉️ info@computerkumpel.de

Bereit für Ihren Wettbewerbsvorteil?

Von Audio-DSP bis Video-Automation — ich entwickle Lösungen, die echte Arbeit sparen.

📞 Jetzt anrufen ✉️ E-Mail senden