
An advanced architecture for the anonymization and protection of sensitive data (PII) in transcriptions.
WaveRedact leverages a hybrid pipeline combining compact NER models (GLiNER) with strictly local Large Language Models (via llama.cpp). Designed to identify, validate, and redact personal information with surgical precision and auto-correction of hallucinations, ensuring your data never leaves your machine.
_censored suffix.ffmpeg installed and available in your system’s PATH. This is strictly required by the underlying audio processing engine to decode and slice the media files.
winget install ffmpeg
(Note: You must close and reopen your terminal after installation to refresh the PATH).
brew install ffmpeg
sudo apt update && sudo apt install ffmpeg
WaveRedact relies on three main AI components. Below is the breakdown of the models and the hardware requirements needed to run the pipeline smoothly without overheating or crashing your system.
| Component | Model Used | Approximate Size | Hardware Execution |
|---|---|---|---|
| Transcription | faster-whisper (default: large-v3-turbo) |
~1.5 GB | CPU or GPU (CUDA/MPS) |
| PII Extraction | fastino/gliner2-privacy-filter-PII-multi |
~1.2 GB | CPU or GPU |
| Validation LLM (Optional) | Qwen2.5-7B-Instruct-Q4_K_M.gguf (> 8GB RAM) gemma-3-4b-it-UD-Q5_K_XL.gguf (<= 8GB RAM) |
~4.3 GB (Qwen) ~2.64 GB (Gemma) |
CPU or GPU (via llama.cpp auto-offload) |
Total Storage Required: At least ~5.0 GB - 7.0 GB of free disk space for the default models + extra space for your audio processing.
To run the standard pipeline safely without the optional LLM:
Running the entire pipeline including the LLM requires more memory. WaveRedact dynamically adapts the validation model based on your system RAM:
Gemma-3-4b, Q5_K_XL, ~2.64 GB) for stability.Qwen2.5-7B, Q4_K_M, ~4.3 GB) for highest quality.The built-in llama.cpp server will automatically distribute the workload between your GPU and RAM based on available VRAM.
If you want to use the GPU, the project will try to take advantage of it automatically; if it is not available, the CLI can continue in CPU mode.
From a shell in the project folder:
uv (recommended)If you already use uv, the setup is the simplest path: uv sync now installs the project itself, so the waveredact command becomes available after synchronization.
uv sync
Then run the CLI directly from the project environment:
waveredact
If you also want the web interface:
uv sync --extra web
And then:
waveredact-web
If your shell does not pick up the commands directly, use uv run waveredact or activate the generated .venv first.
venv and pippython -m venv .venv
.venv\Scripts\activate
pip install -e .
If you also want the web interface:
pip install -e ".[web]"
The main CLI entry point is waveredact.
waveredact
By default, you must specify the input using either the --file or --folder option. Supported audio formats are:
The censored file is automatically saved in a censored/ directory created right next to your input file/folder, with the original name plus _censored.
waveredact --file path/to/audio.mp3 --auto
waveredact --folder path/to/audios/ --level base
waveredact --folder path/to/audios/ --level medium
waveredact --folder path/to/audios/ --level total
waveredact --file path/to/audio.mp3 --use-llm
--file specifies a single audio file to process.--folder specifies a directory containing audio files to process. (You must provide exactly one between --file and --folder).--auto disables interactive mode and applies the “total” level as default without asking for confirmation.
--level defines how aggressive the redaction should be when using –auto.
base removes secrets and payment data.
password, api_key, secret, access_token, recovery_code, iban, bank_account, account_number, routing_number, payment_card, card_number, card_expiry, card_cvvmedium adds names, email addresses, phone numbers, and documents.
person, full_name, first_name, middle_name, last_name, username, email, phone_number, ip_address, account_id, sensitive_account_id, government_id, national_id_number, passport_number, drivers_license_number, tax_id, tax_number, date_of_birthtotal extends redaction to addresses and time-related references. (default)
address, street_address, city, state_or_region, postal_code, country, sensitive_date, document_date, expiration_date, transaction_date, license_number--use-llm enables the optional LLM component to improve detection.--mode defines how to censor the sensitive data.
mutedreplace sensitive data with silence. (default)beep replace sensitive data with beep sound.--custom-labels specifies a JSON file that contains a list of allowed custom labelsRun the command pointing to your audio file or folder, for example waveredact --file my_recording.wav --auto --level total.
Wait for transcription and redaction.
Retrieve the result from the newly created censored/ folder next to your original file.
The project also includes a FastAPI server with a simple web interface.
Start it with:
waveredact-web
The server runs locally at http://127.0.0.1:8000.
The interface lets you upload an audio file and receive the analysis of the sensitive content it found.
When processing finishes, the CLI prints the path of the generated file. You will usually see a message like:
✅ File saved: path/to/your/audio/censored/file_name_censored.mp3
files/: uploads and temporary data for the web interface.web/: web interface and API.Note: Heavy machine learning models (GLiNER, LLMs) are downloaded automatically on first run and stored in a persistent application data folder (~/.waveredact on Unix or %APPDATA%\WaveRedact on Windows).
FileNotFoundError: [WinError 2] or Couldn't find ffprobe or avprobe: You are missing ffmpeg. Follow the instructions in the Requirements section to install it, then completely close and reopen your terminal.
xattr -cr /path/to/your/waveredact_folder/
Nothing happens: Make sure there are supported audio files inside audio/.
--use-llm and the LLM server fails to initialize (e.g., due to port conflicts or missing files), WaveRedact will safely fallback and continue without that component.I am currently in the process of running extensive benchmarks for the new architecture. Because the pipeline is strictly offline and relies heavily on local AI inference, evaluating the models (especially the 7B LLMs) on local hardware is extremely time-consuming. Thank you for your patience while I gather and validate the final metrics.
WaveRedact is built upon several outstanding open-source projects. We would like to express our deepest gratitude to the creators and maintainers of these technologies:
If you are using WaveRedact in academic research, please consider citing these foundational works as well.
Thank you for your interest in WaveRedact 💙
Currently, this is a personal open-source project developed and maintained independently by a solo developer. Because I am managing all aspects of the architecture, testing, and development on my own, my bandwidth to review and merge large code contributions (Pull Requests) is currently limited.
However, I am completely open to community feedback, ideas, and constructive help! Here is how you can best contribute:
⭐ I deeply appreciate every star, bug report, and piece of feedback from the community!
If you use WaveRedact in your research, thesis, or software pipeline, please cite this repository.
Plain Text:
Andrea-Difino, (2026). WaveRedact: An open-source local AI pipeline for audio PII redaction. GitHub. https://github.com/Andrea-Difino/WaveRedact
BibTeX:
@software{WaveRedact_2026,
author = {Andrea Difino},
title = {WaveRedact: An open-source local AI pipeline for audio PII redaction},
year = {2026},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/Andrea-Difino/WaveRedact}}
}
This project is distributed under the terms of the license included in the repository.