From e69490f6bfa8476c0826204690ea36f3e2af371c Mon Sep 17 00:00:00 2001 From: ryanontheinstide Date: Tue, 19 Nov 2024 11:08:24 -0500 Subject: [PATCH] audio info --- __init__.py | 2 ++ nodes/audio/audio_nodes_utility.py | 40 ++++++++++++++++++++++++++++++ pyproject.toml | 2 +- readme.md | 2 ++ 4 files changed, 45 insertions(+), 1 deletion(-) diff --git a/__init__.py b/__init__.py index 695e398..a552b3d 100644 --- a/__init__.py +++ b/__init__.py @@ -87,6 +87,7 @@ from .nodes.audio.audio_nodes_utility import ( AudioSubtract, AudioConcatenate, AudioDither, + AudioInfo, ) from .nodes.flex.feature_extractors import( @@ -372,6 +373,7 @@ NODE_CLASS_MAPPINGS = { "AudioPitchShift": AudioPitchShift, "AudioTimeStretch": AudioTimeStretch, "AudioDither": AudioDither, + "AudioInfo": AudioInfo, "AudioGain": AudioGain, "AudioFade": AudioFade, "AudioPad": AudioPad, diff --git a/nodes/audio/audio_nodes_utility.py b/nodes/audio/audio_nodes_utility.py index 675a45b..00fe057 100644 --- a/nodes/audio/audio_nodes_utility.py +++ b/nodes/audio/audio_nodes_utility.py @@ -189,6 +189,46 @@ class AudioSubtract(AudioUtility): subtracted_waveform = waveform1 - waveform2 return ({"waveform": subtracted_waveform, "sample_rate": sample_rate},) +class AudioInfo(AudioUtility): + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "audio": ("AUDIO",), + } + } + + RETURN_TYPES = ("FLOAT", "INT", "INT", "INT", "FLOAT", "FLOAT", "FLOAT", "STRING") + RETURN_NAMES = ("duration_seconds", "sample_rate", "num_channels", "num_samples", + "max_amplitude", "mean_amplitude", "rms_amplitude", "bit_depth") + FUNCTION = "get_audio_info" + + def get_audio_info(self, audio): + waveform, sample_rate = audio['waveform'], audio['sample_rate'] + + # Calculate basic properties + num_channels = waveform.shape[1] + num_samples = waveform.shape[2] + duration_seconds = num_samples / sample_rate + + # Calculate amplitude statistics + max_amplitude = float(torch.max(torch.abs(waveform))) + mean_amplitude = float(torch.mean(torch.abs(waveform))) + rms_amplitude = float(torch.sqrt(torch.mean(waveform ** 2))) + + # Get bit depth from dtype + bit_depth = str(waveform.dtype) + + return ( + duration_seconds, + sample_rate, + num_channels, + num_samples, + max_amplitude, + mean_amplitude, + rms_amplitude, + bit_depth + ) class AudioDither(AudioUtility): @classmethod diff --git a/pyproject.toml b/pyproject.toml index 482cca6..06c4e06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "comfyui_ryanonyheinside" description = "Custom nodes introducing particle simulations, optical flow, audio manipulation & reactivity, and temporal masks" -version = "1.11.0" +version = "1.12.0" license = {file = "LICENSE"} dependencies = ["pygame","opencv-python==4.10.0","scipy","torchaudio", "pillow","librosa==0.10.2","pymunk==6.8.1","matplotlib","openunmix","mido"] diff --git a/readme.md b/readme.md index 690dfa8..b83ceeb 100644 --- a/readme.md +++ b/readme.md @@ -40,6 +40,8 @@

🆕 Recent Updates:

+ +- 11/19/24 - **AudioInfo**: Added a node that returns audio information, including duration, sample rate, number of channels, number of samples, max amplitude, mean amplitude, and RMS amplitude. - 11/8/24 - **DOOM**: Will it run DOOM? Yes. Yes it will. - 11/6/24 - **Some cleanup in prep for v2**: Control CogVideo by converting features to spline data - 11/1/24 - **Feature to Spline Data**: Control CogVideo by convert features to spline data