diff --git a/process b/process index ea335aa..484df53 100755 --- a/process +++ b/process @@ -19,7 +19,8 @@ DETECT_FREQUENCY_FROM = DETECT_FREQUENCY - DETECT_FREQUENCY_TOLERANCE # Hz DETECT_FREQUENCY_TO = DETECT_FREQUENCY + DETECT_FREQUENCY_TOLERANCE # Hz ADJACENCY_FACTOR = 2 # area to look for the frequency (e.g. 2 means 100Hz to 400Hz for 200Hz detection) BLOCK_SECONDS = 3 # seconds (longer means more frequency resolution, but less time resolution) -DETECTION_DISTANCE = 30 # seconds (minimum time between detections) +DETECTION_DISTANCE_SECONDS = 30 # seconds (minimum time between detections) +DETECTION_DISTANCE_BLOCKS = DETECTION_DISTANCE_SECONDS // BLOCK_SECONDS # number of blocks to skip after a detection BLOCK_OVERLAP_FACTOR = 0.9 # overlap between blocks (0.2 means 20% overlap) MIN_SIGNAL_QUALITY = 1000.0 # maximum noise level (relative DB) to consider a detection valid @@ -32,7 +33,7 @@ def process_recording(filename): # get data and metadata from recording path = os.path.join(RECORDINGS_DIR, filename) - samplerate = soundfile.info(path).samplerate + sound, samplerate = soundfile.read(path) samples_per_block = int(BLOCK_SECONDS * samplerate) overlapping_samples = int(samples_per_block * BLOCK_OVERLAP_FACTOR) @@ -41,8 +42,11 @@ def process_recording(filename): # read blocks of audio data with overlap from sound variable sample_num = 0 - for block in soundfile.blocks(path, blocksize=samples_per_block, overlap=overlapping_samples): - sample_num += samples_per_block - overlapping_samples + while sample_num < len(sound): + # get block of audio data + block_start = sample_num + block_end = min(sample_num + samples_per_block, len(sound)) + block = sound[block_start:block_end] # calculate FFT labels = rfftfreq(len(block), d=1/samplerate) @@ -95,9 +99,10 @@ def process_recording(filename): write_plot() current_event = None - #block_num += (DETECTION_DISTANCE // BLOCK_SECONDS) * samples_per_block + sample_num += DETECTION_DISTANCE_BLOCKS * samples_per_block + + sample_num += samples_per_block - overlapping_samples - #block_num += 1 def write_clip(): @@ -118,6 +123,9 @@ def main(): process_recording(filename) except Exception as e: print(f"Error processing {filename}: {e}") + # print stacktrace + import traceback + traceback.print_exc() if __name__ == "__main__":