Sunday, July 13, 2025

How to Auto Remove Silent Audio Segments with Python

Robotics Workshop
4 min read · Nov 4, 2024

In this article, I’ll show you how to find silent and non-silent parts in your audio or video files using Python. Let’s get started!

Step 1: Install the Required Libraries

First, open your command prompt and install the necessary library by running this command:

pip install pydub

Step 2: Import the Libraries in Your Python Script

In your .py file, import the following libraries:

import os
from pydub import AudioSegment
from pydub.silence import detect_nonsilent
  • os: Used to create directories, files, and manage file paths.
  • AudioSegment: Responsible for loading audio files.
  • detect_nonsilent: This function from pydub detects the non-silent parts of your audio.

Step 3: Create the AudioProcessor Class

The AudioProcessor class is designed to handle tasks related to audio processing, such as finding silent and non-silent parts in an audio file and saving timeline data.

In the constructor method, we set up the initial state of an AudioProcessor object, which includes loading the audio file and its format for further processing:

class AudioProcessor:
    def __init__(self, input_file_path, format):
        self.input_file_path = input_file_path
        self.audio = AudioSegment.from_file(input_file_path, format=format)

Step 4: The split_audio_by_silence Method

This method detects the non-silent parts of the audio based on the input parameters: min_silence_len (minimum silence length in milliseconds) and threshold (volume level in decibels).

def split_audio_by_silence(self, min_silence_len, threshold):
    return detect_nonsilent(self.audio, min_silence_len=min_silence_len, silence_thresh=threshold)

Step 5: The save_audio Method

This method saves the output audio to a specified path in MP3 format.

def save_audio(self, audio, output_path):
    audio.export(output_path, format="mp3")
    print(f"Saved audio to {output_path}")

Step 6: The save_timeline_to_text Method

This method saves the timeline data of silent or non-silent parts to a text file. The timeline data will be written as a list of start and end times (in milliseconds).

def save_timeline_to_text(self, timeline_data, output_path):
    with open(output_path, 'w') as file:
        file.write("[")
        for start, end in timeline_data:
            file.write(f"({start}, {end}), ")
        file.write("]")
    print(f"Saved timeline data to {output_path}")

Step 7: The process_audio Method

This method processes the audio by detecting silent and non-silent parts, then saves the results. It combines everything we’ve done so far.

def process_audio(self, min_silence_len=100, threshold=-30, output_folder='output'):
    try:
        print("Processing audio...")
        non_silent_parts = self.split_audio_by_silence(min_silence_len, threshold)
        audio_silent = AudioSegment.empty()
        audio_non_silent = AudioSegment.empty()
        silent_parts_times = []
        non_silent_parts_times = []

        for i, (start_time, end_time) in enumerate(non_silent_parts):
            audio_non_silent += self.audio[start_time:end_time]
            non_silent_parts_times.append((start_time, end_time))

            if i == 0:
                silent_start_time = 0
            else:
                silent_start_time = non_silent_parts[i - 1][1]
            silent_end_time = start_time

            audio_silent += self.audio[silent_start_time:silent_end_time]
            silent_parts_times.append((silent_start_time, silent_end_time))

        os.makedirs(output_folder, exist_ok=True)

        output_silent_path = os.path.join(output_folder, 'interview_silent.mp3')
        output_non_silent_path = os.path.join(output_folder, 'interview_non_silent.mp3')
        silent_txt_path = os.path.join(output_folder, 'silent_parts.txt')
        non_silent_txt_path = os.path.join(output_folder, 'non_silent_parts.txt')

        self.save_audio(audio_silent, output_silent_path)
        self.save_audio(audio_non_silent, output_non_silent_path)
        self.save_timeline_to_text(silent_parts_times, silent_txt_path)
        self.save_timeline_to_text(non_silent_parts_times, non_silent_txt_path)

        print("Audio processing completed.")
        print("Audio with silent parts saved to:", output_silent_path)
        print("Audio with non-silent parts saved to:", output_non_silent_path)
        print("Silent parts timeline saved to:", silent_txt_path)
        print("Non-silent parts timeline saved to:", non_silent_txt_path)

    except Exception as e:
        print("An error occurred:", str(e))

Step 8: The main Function

The main function is where we set up our program to execute the audio processing. It creates an instance of the AudioProcessor class and calls the process_audio method to start the operation.

def main():
    input_file = 'path/to/your/audiofile.mp3'
    format = 'mp3'
    audio_processor = AudioProcessor(input_file, format)
    audio_processor.process_audio(min_silence_len=100, threshold=-60, output_folder='output')

if __name__ == "__main__":
    main()

Step 9: Run the Script

Open your command prompt or terminal, navigate to the directory where your Python file is located, and run it using:

python audio_processor.py

Complete Code

import os
from pydub import AudioSegment
from pydub.silence import detect_nonsilent

class AudioProcessor:
    def __init__(self, input_file_path, format):
        self.input_file_path = input_file_path
        self.audio = AudioSegment.from_file(input_file_path, format=format)

    def split_audio_by_silence(self, min_silence_len, threshold):
        return detect_nonsilent(self.audio, min_silence_len=min_silence_len, silence_thresh=threshold)

    def save_audio(self, audio, output_path):
        audio.export(output_path, format="mp3")
        print(f"Saved audio to {output_path}")

    def save_timeline_to_text(self, timeline_data, output_path):
        with open(output_path, 'w') as file:
            file.write("[")
            for start, end in timeline_data:
                file.write(f"({start}, {end}), ")
            file.write("]")
        print(f"Saved timeline data to {output_path}")

    def process_audio(self, min_silence_len=100, threshold=-30, output_folder='output'):
        try:
            print("Processing audio...")
            non_silent_parts = self.split_audio_by_silence(min_silence_len, threshold)
            audio_silent = AudioSegment.empty()
            audio_non_silent = AudioSegment.empty()
            silent_parts_times = []
            non_silent_parts_times = []

            for i, (start_time, end_time) in enumerate(non_silent_parts):
                audio_non_silent += self.audio[start_time:end_time]
                non_silent_parts_times.append((start_time, end_time))

                if i == 0:
                    silent_start_time = 0
                else:
                    silent_start_time = non_silent_parts[i - 1][1]
                silent_end_time = start_time

                audio_silent += self.audio[silent_start_time:silent_end_time]
                silent_parts_times.append((silent_start_time, silent_end_time))

            os.makedirs(output_folder, exist_ok=True)

            output_silent_path = os.path.join(output_folder, 'interview_silent.mp3')
            output_non_silent_path = os.path.join(output_folder, 'interview_non_silent.mp3')
            silent_txt_path = os.path.join(output_folder, 'silent_parts.txt')
            non_silent_txt_path = os.path.join(output_folder, 'non_silent_parts.txt')

            self.save_audio(audio_silent, output_silent_path)
            self.save_audio(audio_non_silent, output_non_silent_path)
            self.save_timeline_to_text(silent_parts_times, silent_txt_path)
            self.save_timeline_to_text(non_silent_parts_times, non_silent_txt_path)

            print("Audio processing completed.")
            print("Audio with silent parts saved to:", output_silent_path)
            print("Audio with non-silent parts saved to:", output_non_silent_path)
            print("Silent parts timeline saved to:", silent_txt_path)
            print("Non-silent parts timeline saved to:", non_silent_txt_path)

        except Exception as e:
            print("An error occurred:", str(e))

def main():
    input_file = 'path/to/your/audiofile.mp3'
    format = 'mp3'
    audio_processor = AudioProcessor(input_file, format)
    audio_processor.process_audio(min_silence_len=100, threshold=-60, output_folder='output')

if __name__ == "__main__":
    main()

Conclusion

If you found this article helpful, please support me by giving claps!
Feel free to leave a comment if you have any questions.

How to Auto Remove Silent Audio Segments with Python

Robotics Workshop 4 min read · Nov 4, 2024 In this article, I’ll show you how to find silent and non-silent parts in your audio or vide...