Spaces:
Build error
Build error
Commit
·
2c57374
1
Parent(s):
f218c29
improved type handling
Browse files- __pycache__/utils.cpython-312.pyc +0 -0
- app.py +12 -3
- utils.py +25 -12
__pycache__/utils.cpython-312.pyc
ADDED
|
Binary file (23.2 kB). View file
|
|
|
app.py
CHANGED
|
@@ -216,11 +216,10 @@ def get_visualizations(beattimes_table: str, cleanedaudio: gr.Audio):
|
|
| 216 |
|
| 217 |
sr, audiodata = cleanedaudio
|
| 218 |
|
| 219 |
-
segment_metrics = u.compute_segment_metrics(df, sr, audiodata)
|
| 220 |
|
|
|
|
| 221 |
|
| 222 |
|
| 223 |
-
# Normalize audio data from int16 to float in range [-1, 1]
|
| 224 |
audiodata = audiodata.astype(np.float32) / 32768.0
|
| 225 |
|
| 226 |
# Create figure with secondary y-axes
|
|
@@ -438,11 +437,21 @@ def updateBeatsv2(audio:gr.Audio, uploadeddf:gr.File=None)-> go.Figure:
|
|
| 438 |
encoding="utf-8-sig")
|
| 439 |
|
| 440 |
# Drop rows where all columns are NaN (empty)
|
| 441 |
-
beattimes_table = beattimes_table.dropna(
|
|
|
|
| 442 |
|
| 443 |
# Reset the index after dropping rows
|
| 444 |
beattimes_table = beattimes_table.reset_index(drop=True)
|
| 445 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 446 |
# Check if the column "Label (S1=0/S2=1)" exists and rename it
|
| 447 |
if "Label (S1=0/S2=1)" in beattimes_table.columns:
|
| 448 |
beattimes_table = beattimes_table.rename(columns={"Label (S1=0/S2=1)": "Label (S1=1/S2=0)"})
|
|
|
|
| 216 |
|
| 217 |
sr, audiodata = cleanedaudio
|
| 218 |
|
|
|
|
| 219 |
|
| 220 |
+
segment_metrics = u.compute_segment_metrics(df, sr, audiodata)
|
| 221 |
|
| 222 |
|
|
|
|
| 223 |
audiodata = audiodata.astype(np.float32) / 32768.0
|
| 224 |
|
| 225 |
# Create figure with secondary y-axes
|
|
|
|
| 437 |
encoding="utf-8-sig")
|
| 438 |
|
| 439 |
# Drop rows where all columns are NaN (empty)
|
| 440 |
+
beattimes_table = beattimes_table.dropna()
|
| 441 |
+
|
| 442 |
|
| 443 |
# Reset the index after dropping rows
|
| 444 |
beattimes_table = beattimes_table.reset_index(drop=True)
|
| 445 |
|
| 446 |
+
# Convert the 'Beattimes' column to float
|
| 447 |
+
# Handle both string and numeric values in the Beattimes column
|
| 448 |
+
if beattimes_table['Beattimes'].dtype == 'object':
|
| 449 |
+
# If strings, replace commas with dots
|
| 450 |
+
beattimes_table['Beattimes'] = beattimes_table['Beattimes'].str.replace(',', '.').astype(float)
|
| 451 |
+
else:
|
| 452 |
+
# If already numeric, just ensure float type
|
| 453 |
+
beattimes_table['Beattimes'] = beattimes_table['Beattimes'].astype(float)
|
| 454 |
+
|
| 455 |
# Check if the column "Label (S1=0/S2=1)" exists and rename it
|
| 456 |
if "Label (S1=0/S2=1)" in beattimes_table.columns:
|
| 457 |
beattimes_table = beattimes_table.rename(columns={"Label (S1=0/S2=1)": "Label (S1=1/S2=0)"})
|
utils.py
CHANGED
|
@@ -1,13 +1,14 @@
|
|
| 1 |
-
import librosa
|
| 2 |
-
import numpy as np
|
| 3 |
-
import plotly.graph_objects as go
|
| 4 |
-
from scipy.signal import savgol_filter, find_peaks
|
| 5 |
from scipy.signal import butter, filtfilt, find_peaks
|
| 6 |
-
from
|
| 7 |
from sklearn.preprocessing import StandardScaler
|
| 8 |
-
import
|
|
|
|
| 9 |
import pandas as pd
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
|
| 12 |
|
| 13 |
|
|
@@ -183,6 +184,8 @@ def getBeats(audiodata: np.ndarray, sr: int, method='envelope') -> tuple[float,
|
|
| 183 |
"""
|
| 184 |
# Denoise and normalize
|
| 185 |
audiodata, sr = denoise_audio(audiodata, sr)
|
|
|
|
|
|
|
| 186 |
cleaned_audio = audiodata / np.max(np.abs(audiodata))
|
| 187 |
|
| 188 |
def get_envelope_peaks():
|
|
@@ -364,9 +367,11 @@ def plotBeattimes(beattimes: np.ndarray,
|
|
| 364 |
|
| 365 |
# Process and plot primary beat times
|
| 366 |
if isinstance(beattimes[0], str):
|
| 367 |
-
beat_indices = np.round(np.array(
|
| 368 |
else:
|
| 369 |
beat_indices = np.round(beattimes * sr).astype(int)
|
|
|
|
|
|
|
| 370 |
beat_indices = beat_indices[beat_indices < len(audiodata)]
|
| 371 |
beat_amplitudes = audiodata[beat_indices]
|
| 372 |
|
|
@@ -399,7 +404,11 @@ def plotBeattimes(beattimes: np.ndarray,
|
|
| 399 |
|
| 400 |
# Process and plot secondary beat times if provided
|
| 401 |
if beattimes2 is not None:
|
| 402 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 403 |
beat_indices2 = beat_indices2[beat_indices2 < len(audiodata)]
|
| 404 |
beat_amplitudes2 = audiodata[beat_indices2]
|
| 405 |
|
|
@@ -482,8 +491,9 @@ def iterate_beat_segments(beat_times, sr, audio):
|
|
| 482 |
# Extract audio segment
|
| 483 |
segment = audio[start_sample:end_sample]
|
| 484 |
|
| 485 |
-
# Analyze segment with beat information
|
| 486 |
-
|
|
|
|
| 487 |
|
| 488 |
return segment_metrics
|
| 489 |
|
|
@@ -498,6 +508,7 @@ def segment_analysis(segment, sr, s1s2:list):
|
|
| 498 |
Returns:
|
| 499 |
- List of computed metrics
|
| 500 |
"""
|
|
|
|
| 501 |
# Duration
|
| 502 |
duration = len(segment) / sr
|
| 503 |
|
|
@@ -576,9 +587,11 @@ def compute_segment_metrics(beattimes: pd.DataFrame, sr: int, audio: np.ndarray)
|
|
| 576 |
|
| 577 |
segment_metrics = iterate_beat_segments(beattimes, sr, audio)
|
| 578 |
|
|
|
|
|
|
|
| 579 |
return segment_metrics
|
| 580 |
|
| 581 |
-
def compute_hrv(s1_to_s2, s2_to_s1, sampling_rate
|
| 582 |
"""
|
| 583 |
Compute Heart Rate Variability with debug statements
|
| 584 |
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
from scipy.signal import butter, filtfilt, find_peaks
|
| 2 |
+
from scipy.signal import savgol_filter, find_peaks
|
| 3 |
from sklearn.preprocessing import StandardScaler
|
| 4 |
+
from sklearn.cluster import KMeans
|
| 5 |
+
import plotly.graph_objects as go
|
| 6 |
import pandas as pd
|
| 7 |
+
import numpy as np
|
| 8 |
+
import librosa
|
| 9 |
+
import pywt
|
| 10 |
+
|
| 11 |
+
|
| 12 |
|
| 13 |
|
| 14 |
|
|
|
|
| 184 |
"""
|
| 185 |
# Denoise and normalize
|
| 186 |
audiodata, sr = denoise_audio(audiodata, sr)
|
| 187 |
+
|
| 188 |
+
# Normalize to prevent clipping while maintaining relative amplitudes
|
| 189 |
cleaned_audio = audiodata / np.max(np.abs(audiodata))
|
| 190 |
|
| 191 |
def get_envelope_peaks():
|
|
|
|
| 367 |
|
| 368 |
# Process and plot primary beat times
|
| 369 |
if isinstance(beattimes[0], str):
|
| 370 |
+
beat_indices = np.round(np.array([float(bt.replace(',', '.')) for bt in beattimes]) * sr).astype(int)
|
| 371 |
else:
|
| 372 |
beat_indices = np.round(beattimes * sr).astype(int)
|
| 373 |
+
|
| 374 |
+
|
| 375 |
beat_indices = beat_indices[beat_indices < len(audiodata)]
|
| 376 |
beat_amplitudes = audiodata[beat_indices]
|
| 377 |
|
|
|
|
| 404 |
|
| 405 |
# Process and plot secondary beat times if provided
|
| 406 |
if beattimes2 is not None:
|
| 407 |
+
if isinstance(beattimes2[0], str):
|
| 408 |
+
beat_indices2 = np.round(np.array([float(bt.replace(',', '.')) for bt in beattimes2]) * sr).astype(int)
|
| 409 |
+
else:
|
| 410 |
+
beat_indices2 = np.round(beattimes2 * sr).astype(int)
|
| 411 |
+
|
| 412 |
beat_indices2 = beat_indices2[beat_indices2 < len(audiodata)]
|
| 413 |
beat_amplitudes2 = audiodata[beat_indices2]
|
| 414 |
|
|
|
|
| 491 |
# Extract audio segment
|
| 492 |
segment = audio[start_sample:end_sample]
|
| 493 |
|
| 494 |
+
# Analyze segment with beat information if not empty
|
| 495 |
+
if len(segment) > 0:
|
| 496 |
+
segment_metrics.append(segment_analysis(segment, sr, beat_info))
|
| 497 |
|
| 498 |
return segment_metrics
|
| 499 |
|
|
|
|
| 508 |
Returns:
|
| 509 |
- List of computed metrics
|
| 510 |
"""
|
| 511 |
+
|
| 512 |
# Duration
|
| 513 |
duration = len(segment) / sr
|
| 514 |
|
|
|
|
| 587 |
|
| 588 |
segment_metrics = iterate_beat_segments(beattimes, sr, audio)
|
| 589 |
|
| 590 |
+
print("segment_metrics", segment_metrics)
|
| 591 |
+
|
| 592 |
return segment_metrics
|
| 593 |
|
| 594 |
+
def compute_hrv(s1_to_s2, s2_to_s1, sampling_rate):
|
| 595 |
"""
|
| 596 |
Compute Heart Rate Variability with debug statements
|
| 597 |
"""
|