Skip to content

(Windows) sf.write runs into LibsndfileError: System error #472

Description

@simonriou

sf.read(filepath) works as intended, it successfully finds the file. However, when trying to write to the file (replace its content), this error triggers

File "C:\Users\User\Documents\someFolder\src\util\files.py", line 92, in set_fixed_duration
    sf.write(file_path, audio_trunc, SAMPLE_RATE, format='FLAC')
  File "C:\Users\User\miniforge3\envs\speech\lib\site-packages\soundfile.py", line 363, in write
    with SoundFile(file, 'w', samplerate, channels,
  File "C:\Users\User\miniforge3\envs\speech\lib\site-packages\soundfile.py", line 690, in __init__
    self._file = self._open(file, mode_int, closefd)
  File "C:\Users\User\miniforge3\envs\speech\lib\site-packages\soundfile.py", line 1265, in _open
    raise LibsndfileError(err, prefix="Error opening {0!r}: ".format(self.name))
soundfile.LibsndfileError: Error opening 'data/train/speech/103-1240-0000.flac': System error.

This is my code

def set_fixed_duration(directory):
    """
    Set all audio files in the specified directory to a fixed duration by truncating or padding with silence.
    Replace the original files with the adjusted ones.
    """

    target_len = int(SAMPLE_RATE * DURATION)

    for filename in tqdm(os.listdir(directory)):
        if filename.endswith('.flac'):
            file_path = os.path.join(directory, filename)

            # Load the audio file
            audio, sr = sf.read(file_path)
            if sr != SAMPLE_RATE:
                raise ValueError(f"When setting duration | Expected sample rate {SAMPLE_RATE}, but got {sr}")
            
            # Convert to mono if needed
            if audio.ndim > 1:
                print(f"Converting stereo to mono for file: {filename}")
                audio = np.mean(audio, axis=1)

            # Print first 10 samples for debugging
            # print(f"Original audio samples (first 10) for {filename}: {audio[:10]}")
            
            L = len(audio)

            # Adjust duration
            if L > target_len:
                # Truncate
                audio_trunc = audio[:target_len]
            else:
                # Pad with silence (zeros)
                pad_width = target_len - L
                audio_trunc = np.pad(audio, (0, pad_width), mode='constant', constant_values=EPSILON)

            # Replace the original file with the adjusted one
            sf.write(file_path, audio_trunc, SAMPLE_RATE, format='FLAC')

I have soundfile v0.13.1 and libsndfile v.1.2.2
I am on windows 11

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions