Skip to main content

MalevolentSlice

PyPI Version Python Versions License: MIT RAM Footprint

DESIGN AND IMPLEMENTATION OF A VOICE ACTIVITY DETECTION-BASED AUDIO DATASET SEGMENTATION SYSTEM FOR MEMORY-EFFICIENT TEXT-TO-SPEECH

RANCANG BANGUN SISTEM SEGMENTASI DATASET AUDIO BERBASIS VOICE ACTIVITY DETECTION UNTUK PENGEMBANGAN TEXT-TO-SPEECH EFISIEN MEMORI RAM


🌐 English Quick Overview

MalevolentSlice (CLI alias: malevolentslice) is a lightweight, high-performance Python library and CLI tool designed to slice continuous, raw audio recordings (such as podcasts, audiobooks, and long interviews) into clean, high-quality audio segments formatted for training state-of-the-art Text-to-Speech (TTS) models (e.g., LJSpeech format for VITS, FastSpeech, or Tacotron).

Quick Installation:

pip install malevolentslice

Quick Run:

# Auto-detect audio in current directory and subfolders (up to 3 levels deep)
malevolentslice run

# Or specify custom input and output
malevolentslice run -i ./raw_audio/ -o ./tts_dataset/

📖 Dokumentasi Bahasa Indonesia

malevolentslice adalah pustaka (library) Python mandiri sekaligus perkakas baris perintah (Command Line Interface / CLI) berkinerja tinggi yang dirancang khusus untuk memotong rekaman audio panjang (seperti siniar/podcast, buku audio/audiobook, dan rekaman wawancara) menjadi segmen-segmen audio pendek, bersih, dan terstandarisasi yang siap digunakan untuk melatih model AI Text-to-Speech (TTS).

🌟 Fitur Utama

  • Efisiensi Memori Konstan $O(1)$ (RAM $\le 100\text{ MB}$): Menggunakan generator aliran audio (streaming generator via soundfile.blocks()) yang membaca data per blok dari penyimpanan sekunder langsung ke penyangga memori, mencegah risiko Out-of-Memory (OOM) meskipun memproses audio berdurasi puluhan jam.
  • Pencarian Audio Otomatis & Terbatas (--max-depth): Cukup jalankan malevolentslice run tanpa argumen, sistem akan otomatis mendeteksi berkas audio di direktori kerja hingga batas kedalaman bawaan 3 level subfolder (max_depth = 3), sambil mengecualikan folder sistem/virtual environment (.venv, .git, dataset, dsb.).
  • Hierarki Folder Fleksibel (--preserve-structure / -p): Mendukung format standar korpus LJSpeech (semua segmen di wavs/), mode datar (--flat), maupun pencerminan hierarki subfolder masukan (mirrored hierarchy) ke folder luaran.
  • NumPy Vectorized Noise Gate: Penapisan awal derau latar (background noise) secara instan menggunakan komputasi vektor NumPy tanpa overhead komputasi tinggi.
  • Mesin Deteksi Suara Silero-VAD ONNX: Inferensi keberadaan wicara presisi tingkat bingkai (frame-level) berbasis model Silero-VAD teroptimasi via ONNX Runtime CPU (ringan dan tanpa ketergantungan PyTorch yang berat).
  • Proteksi Hang-over & Pemotongan Cerdas: Mencegah pemotongan konsonan akhir kata (word clipping) dengan penyangga jeda wicara (hangover buffer), serta membatasi durasi segmen ideal TTS ($1.0\text{s} \le t \le 12.0\text{s}$).
  • Antarmuka Terminal Modern & Pythonic API: Tampilan CLI interaktif berbasis Rich dengan visualisasi progres real-time, pemantau alokasi RAM aktif dengan ambang batas kestabilan $\le 100\text{ MB}$ (STABLE), serta API Python yang elegan.

💻 Instalasi

Pastikan Anda menggunakan Python versi 3.8 atau lebih baru:

Pengguna Akhir (via PyPI)

pip install malevolentslice

Mode Pengembangan (Development)

Jika Anda mengkloning repositori ini secara lokal:

git clone https://github.com/drrri-py/malevolentslice.git
cd malevolentslice

# Pasang dalam mode editable beserta dependensi dev (pengujian & profiler)
pip install -e ".[dev]"

🚀 Panduan Penggunaan Cepat

1. Antarmuka Baris Perintah (CLI)

A. Eksekusi Otomatis (Zero-Configuration)

Jika Anda memiliki berkas audio di direktori kerja atau di dalam subfolder (misalnya di folder raw/, folder proyek, atau subfolder sesi), cukup jalankan:

malevolentslice run

Catatan: Perintah di atas akan secara otomatis memindai seluruh berkas audio hingga 3 tingkat subfolder, memprosesnya dengan alokasi RAM yang terjaga stabil, dan menyimpannya ke direktori ./dataset/.

B. Menentukan Sumber Masukan & Folder Luaran

# Memproses folder sumber tertentu ke folder tujuan tertentu
malevolentslice run -i ./rekaman_mentah/ -o ./dataset_tts/

# Memproses satu berkas audio tunggal
malevolentslice run -i ./rekaman_mentah/audio_wawancara.wav -o ./dataset/

C. Mempertahankan Struktur Hierarki Subfolder (-p / --preserve-structure)

Jika audio masukan Anda dikelompokkan ke dalam subfolder (misal: pembicara_1/, pembicara_2/) dan Anda ingin hasil potongannya terpisah dalam subfolder yang sama:

malevolentslice run -p
# atau:
malevolentslice run --preserve-structure

D. Mode Luaran Datar (--flat)

Mengekspor seluruh berkas .wav langsung ke dalam folder luaran utama tanpa membuat subfolder wavs/:

malevolentslice run --flat

E. Mengatur Batas Kedalaman Pencarian Folder (--max-depth)

# Menelusuri subfolder hingga kedalaman maksimal 5 tingkat
malevolentslice run --max-depth 5

Daftar Lengkap Opsi CLI (malevolentslice run --help)

Opsi Pilihan Singkat Nilai Baku (Default) Deskripsi
--input -i None (Otomatis) Berkas audio atau direktori sumber masukan.
--output -o ./dataset/ Direktori luaran untuk dataset standar LJSpeech.
--threshold -t -40.0 Ambang batas Noise Gate dalam satuan desibel (dB).
--speech-threshold - 0.5 Ambang batas probabilitas wicara model VAD ($0.0 - 1.0$).
--silence -s 400.0 Batas jeda hening minimum pemisah segmen (milidetik).
--buffer -b 10.0 Ukuran penyangga blok streaming data audio (MB).
--min-speech - 1000.0 Durasi segmen wicara minimum yang diekspor (milidetik).
--max-speech - 12000.0 Durasi segmen wicara maksimum yang diekspor (milidetik).
--sr - 16000 Frekuensi sampel target audio luaran (Hz).
--wav-dir - wavs Nama subfolder audio WAV (kosongkan '' jika --flat).
--flat - False Simpan berkas WAV langsung di root folder tanpa subfolder wavs/.
--preserve-structure -p False Cerminkan susunan hierarki subfolder masukan ke folder luaran.
--max-depth - 3 Batas kedalaman penelusuran subfolder audio.
--quiet -q False Jalankan proses secara senyap tanpa animasi terminal/banner.

2. Antarmuka Pemrograman Python (Pythonic API)

Pustaka malevolentslice dapat diintegrasikan dengan mudah ke dalam skrip Python atau alur kerja (pipeline) pemrosesan data AI:

import malevolentslice

# 1. Inisialisasi Pipeline dengan konfigurasi yang diinginkan
pipeline = malevolentslice.Pipeline(
    noise_threshold_db=-40.0,
    speech_threshold=0.5,
    min_silence_duration_ms=400.0,
    min_speech_duration_ms=1000.0,
    max_speech_duration_ms=12000.0,
    chunk_buffer_mb=10.0,
    target_sr=16000,
    max_depth=3,                  # Batas kedalaman pencarian subfolder
    preserve_structure=False,     # Ubah ke True jika ingin memisahkan per subfolder
    wav_subfolder="wavs"
)

# 2. Jalankan segmentasi pada direktori atau berkas
summary = pipeline.process(
    source="./rekaman_mentah/",
    output_dir="./dataset_tts/"
)

# 3. Akses rekapitulasi hasil eksekusi
print(f"Total berkas diproses : {summary.total_files}")
print(f"Segmen dihasilkan     : {summary.total_segments}")
print(f"Total durasi wicara   : {summary.total_processed_duration:.2f} detik")
print(f"Waktu eksekusi        : {summary.elapsed_time:.2f} detik")
print(f"Konsumsi Puncak RAM   : {summary.peak_memory_mb:.2f} MB")

Fitur Pencarian Mandiri (Standalone Audio Search)

Anda juga dapat memanfaatkan fungsi pencarian audio bawaan untuk keperluan skrip kustom:

from malevolentslice import find_audio_files

# Mencari seluruh file audio hingga kedalaman 3 tingkat
berkas_audio = find_audio_files("./proyek_audio", max_depth=3)
print(f"Ditemukan {len(berkas_audio)} berkas audio.")

📁 Struktur Direktori Luaran Dataset

1. Struktur Standar LJSpeech (Bawaan)

dataset/
├── wavs/
│   ├── segment_000001.wav
│   ├── segment_000002.wav
│   └── ...
├── metadata.csv
└── processing_audit.log

Format berkas metadata.csv (pemisah | standar korpus LJSpeech):

segment_000001|audio segment 000001|audio segment 000001
segment_000002|audio segment 000002|audio segment 000002

⚠️ Catatan Mengenai Transkripsi Teks:
malevolentslice berfokus pada tahap segmentasi akustik dan pemotongan audio presisi VAD. Kolom teks pada metadata.csv yang dihasilkan adalah kerangka penampung (placeholder template) agar struktur dataset langsung kompatibel dengan format LJSpeech. Sebelum dimasukkan ke tahap pelatihan (training) model TTS, teks tersebut perlu diisi transkrip wicara aslinya (lihat panduan langkah selanjutnya di bawah).

2. Struktur Hierarki Bercermin (--preserve-structure / -p)

dataset/
├── wavs/
│   ├── sesi_01/
│   │   ├── segment_000001.wav
│   │   └── segment_000002.wav
│   └── sesi_02/
│       └── segment_000003.wav
├── metadata.csv
└── processing_audit.log

🔄 Alur Kerja Lengkap Pembuatan Dataset TTS (Next Steps)

Untuk melatih model Text-to-Speech (seperti VITS, FastSpeech 2, atau Piper TTS), alur kerja standar kurasi dataset audio adalah sebagai berikut:

[ Rekaman Audio Mentah ]
         │
         ▼
[ 1. Segmentasi via MalevolentSlice ]  ──▶ Menghasilkan folder wavs/ (16kHz PCM) & template metadata.csv
         │
         ▼
[ 2. Transkripsi Otomatis (ASR) ]      ──▶ Mengisi teks asli (menggunakan Whisper / anotasi manual)
         │
         ▼
[ 3. Pelatihan Model TTS ]             ──▶ Siap dilatih pada VITS, FastSpeech, Coqui TTS, Tacotron

Contoh Mengisi Transkripsi Otomatis Menggunakan OpenAI Whisper:

Setelah malevolentslice selesai memotong audio, Anda dapat memperbarui metadata.csv dengan teks ucapan asli secara otomatis:

import csv, os
import whisper

model = whisper.load_model("base")
metadata_file = "dataset/metadata.csv"
updated_rows = []

with open(metadata_file, "r", encoding="utf-8") as f:
    reader = csv.reader(f, delimiter="|")
    for row in reader:
        seg_id = row[0]
        audio_path = os.path.join("dataset", "wavs", f"{seg_id}.wav")
        if os.path.exists(audio_path):
            result = model.transcribe(audio_path, language="id")
            text = result["text"].strip()
            updated_rows.append([seg_id, text, text])

with open(metadata_file, "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f, delimiter="|")
    writer.writerows(updated_rows)

print("metadata.csv berhasil diperbarui dengan transkrip wicara asli!")

📊 Indikator Pemantau Memori RAM

Sistem secara aktif memantau konsumsi Resident Set Size (RSS) memori fisik komputer melalui pustaka psutil:

  • STABLE ($\le 100\text{ MB}$): Alokasi memori fisik berada dalam batas amplop ideal sistem. Memori dibersihkan secara agresif oleh gc.collect() setelah tiap blok selesai diproses, membuktikan alokasi memori konstan $O(1)$.
  • ELEVATED ($> 100\text{ MB}$): Penggunaan RAM meningkat melebihi ambang batas 100 MB (misal saat parameter buffer diperbesar).

🧪 Pengujian Unit & Validasi

Jalankan pengujian menggunakan pytest untuk memverifikasi fungsionalitas:

pytest -v

📄 Lisensi

Proyek ini dilisensikan di bawah lisensi MIT.

Release files for malevolentslice 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for malevolentslice 0.1.1
File Size Uploaded
malevolentslice-0.1.1.tar.gz 1.5 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for malevolentslice 0.1.1
File Interpreter ABI Platform
malevolentslice-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 3.1 MB

Release files / malevolentslice-0.1.1.tar.gz

Download URL malevolentslice-0.1.1.tar.gz
Size 1.5 MB
Tags Source
SHA-256 checksum
How to use checksums
da5d5f4ccdd919db85bd8fbdca9efc8f3f9493fa5c98e4dcae1bee99b536f60d
BLAKE2b-256 checksum
How to use checksums
31ff7c140da549dac125a022f98313b8997fba182453d812ecdc3d01f80bf0a2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.0

Release files / malevolentslice-0.1.1-py3-none-any.whl

Download URL malevolentslice-0.1.1-py3-none-any.whl
Size 1.6 MB
Tags Python 3
SHA-256 checksum
How to use checksums
fe9599ae2036dca7e1997c415f59e5fcf1a8e6c950d1785197f6d92337950cea
BLAKE2b-256 checksum
How to use checksums
49286ead135301bfbfc463f6080e917b5745b3575d8ca6e25a4e000386f1d7c6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.0

Release history Release notifications | RSS feed

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page