wavewash 0.1.0a1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. wavewash-0.1.0a1/.github/workflows/tests.yml +21 -0
  2. wavewash-0.1.0a1/LICENSE +29 -0
  3. wavewash-0.1.0a1/MANIFEST.in +9 -0
  4. wavewash-0.1.0a1/PKG-INFO +153 -0
  5. wavewash-0.1.0a1/README.md +109 -0
  6. wavewash-0.1.0a1/docs/STEP_BY_STEP.md +85 -0
  7. wavewash-0.1.0a1/docs/USER_MANUAL.md +311 -0
  8. wavewash-0.1.0a1/docs/screenshot-setup.png +0 -0
  9. wavewash-0.1.0a1/frontend/.gitignore +24 -0
  10. wavewash-0.1.0a1/frontend/.oxlintrc.json +8 -0
  11. wavewash-0.1.0a1/frontend/index.html +16 -0
  12. wavewash-0.1.0a1/frontend/package-lock.json +2894 -0
  13. wavewash-0.1.0a1/frontend/package.json +31 -0
  14. wavewash-0.1.0a1/frontend/public/favicon.svg +1 -0
  15. wavewash-0.1.0a1/frontend/public/icons.svg +24 -0
  16. wavewash-0.1.0a1/frontend/src/App.jsx +208 -0
  17. wavewash-0.1.0a1/frontend/src/api.js +19 -0
  18. wavewash-0.1.0a1/frontend/src/components/AdvancedSettings.jsx +127 -0
  19. wavewash-0.1.0a1/frontend/src/components/FolderBrowser.jsx +109 -0
  20. wavewash-0.1.0a1/frontend/src/components/PathsPanel.jsx +88 -0
  21. wavewash-0.1.0a1/frontend/src/components/PurposeSelector.jsx +39 -0
  22. wavewash-0.1.0a1/frontend/src/components/QualityPresets.jsx +75 -0
  23. wavewash-0.1.0a1/frontend/src/components/ResultsDashboard.jsx +179 -0
  24. wavewash-0.1.0a1/frontend/src/components/RunOptions.jsx +50 -0
  25. wavewash-0.1.0a1/frontend/src/components/RunProgress.jsx +68 -0
  26. wavewash-0.1.0a1/frontend/src/index.css +49 -0
  27. wavewash-0.1.0a1/frontend/src/main.jsx +10 -0
  28. wavewash-0.1.0a1/frontend/src/presets.js +129 -0
  29. wavewash-0.1.0a1/frontend/vite.config.js +14 -0
  30. wavewash-0.1.0a1/pyproject.toml +56 -0
  31. wavewash-0.1.0a1/setup.cfg +4 -0
  32. wavewash-0.1.0a1/src/wavewash/__init__.py +2 -0
  33. wavewash-0.1.0a1/src/wavewash/__main__.py +2 -0
  34. wavewash-0.1.0a1/src/wavewash/alignment_checker.py +87 -0
  35. wavewash-0.1.0a1/src/wavewash/audio_fixer.py +283 -0
  36. wavewash-0.1.0a1/src/wavewash/audio_scanner.py +61 -0
  37. wavewash-0.1.0a1/src/wavewash/cli.py +83 -0
  38. wavewash-0.1.0a1/src/wavewash/config.py +208 -0
  39. wavewash-0.1.0a1/src/wavewash/dedup_detector.py +189 -0
  40. wavewash-0.1.0a1/src/wavewash/diversity_report.py +104 -0
  41. wavewash-0.1.0a1/src/wavewash/logger_setup.py +159 -0
  42. wavewash-0.1.0a1/src/wavewash/metadata_checker.py +172 -0
  43. wavewash-0.1.0a1/src/wavewash/pipeline.py +585 -0
  44. wavewash-0.1.0a1/src/wavewash/quality_checker.py +430 -0
  45. wavewash-0.1.0a1/src/wavewash/review_sampler.py +100 -0
  46. wavewash-0.1.0a1/src/wavewash/server.py +468 -0
  47. wavewash-0.1.0a1/src/wavewash/static/assets/index-CK5HsmPs.css +2 -0
  48. wavewash-0.1.0a1/src/wavewash/static/assets/index-DTvS4S6_.js +68 -0
  49. wavewash-0.1.0a1/src/wavewash/static/favicon.svg +1 -0
  50. wavewash-0.1.0a1/src/wavewash/static/icons.svg +24 -0
  51. wavewash-0.1.0a1/src/wavewash/static/index.html +17 -0
  52. wavewash-0.1.0a1/src/wavewash/transcript_checker.py +158 -0
  53. wavewash-0.1.0a1/src/wavewash/vad_module.py +105 -0
  54. wavewash-0.1.0a1/src/wavewash.egg-info/PKG-INFO +153 -0
  55. wavewash-0.1.0a1/src/wavewash.egg-info/SOURCES.txt +61 -0
  56. wavewash-0.1.0a1/src/wavewash.egg-info/dependency_links.txt +1 -0
  57. wavewash-0.1.0a1/src/wavewash.egg-info/entry_points.txt +2 -0
  58. wavewash-0.1.0a1/src/wavewash.egg-info/requires.txt +30 -0
  59. wavewash-0.1.0a1/src/wavewash.egg-info/top_level.txt +1 -0
  60. wavewash-0.1.0a1/tests/conftest.py +58 -0
  61. wavewash-0.1.0a1/tests/test_calibration.py +17 -0
  62. wavewash-0.1.0a1/tests/test_pipeline.py +138 -0
  63. wavewash-0.1.0a1/tests/test_server_and_cli.py +99 -0
@@ -0,0 +1,21 @@
1
+ name: tests
2
+ on:
3
+ push:
4
+ pull_request:
5
+ jobs:
6
+ test:
7
+ runs-on: ${{ matrix.os }}
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ os: [ubuntu-latest, macos-latest, windows-latest]
12
+ python: ["3.10", "3.12", "3.13"]
13
+ steps:
14
+ - uses: actions/checkout@v4
15
+ - uses: actions/setup-python@v5
16
+ with:
17
+ python-version: ${{ matrix.python }}
18
+ - run: python -m pip install --upgrade pip
19
+ - run: python -m pip install -e ".[dev]"
20
+ - run: wavewash doctor
21
+ - run: python -m pytest -q
@@ -0,0 +1,29 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Boobalan Arjunan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+ This project depends on third-party libraries (numpy, scipy, soundfile,
25
+ librosa, pyloudnorm, scikit-learn, tqdm, langdetect, matplotlib, and
26
+ optionally openai-whisper, torch/torchaudio). Each carries its own license
27
+ (mostly BSD/MIT/Apache-2.0) -- check requirements.txt and each package's own
28
+ license before redistributing, especially if your GTV program has its own
29
+ licensing rules.
@@ -0,0 +1,9 @@
1
+ include README.md LICENSE
2
+ recursive-include src/wavewash/static *
3
+ recursive-include frontend *
4
+ prune frontend/node_modules
5
+ prune frontend/dist
6
+ global-exclude __pycache__ *.pyc .DS_Store
7
+ recursive-include tests *.py
8
+ recursive-include docs *.md *.png
9
+ include .github/workflows/tests.yml
@@ -0,0 +1,153 @@
1
+ Metadata-Version: 2.4
2
+ Name: wavewash
3
+ Version: 0.1.0a1
4
+ Summary: WaveWash: audio QC & data prep - check, repair, dedupe and audit audio datasets for ML training (ASR, TTS, speaker ID, music generation), with a local web UI.
5
+ Author-email: Boobalan Arjunan <boobalan.it@gmail.com>
6
+ Maintainer-email: Boobalan Arjunan <boobalan.it@gmail.com>
7
+ License: MIT
8
+ Project-URL: Homepage, https://github.com/BoobalanArjunan/wavewash
9
+ Project-URL: Source, https://github.com/BoobalanArjunan/wavewash
10
+ Project-URL: Issues, https://github.com/BoobalanArjunan/wavewash/issues
11
+ Keywords: audio,dataset,quality-control,asr,tts,machine-learning,data-preparation
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Topic :: Multimedia :: Sound/Audio :: Analysis
15
+ Classifier: Intended Audience :: Science/Research
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: numpy>=1.23
20
+ Requires-Dist: scipy>=1.9
21
+ Requires-Dist: soundfile>=0.12
22
+ Requires-Dist: librosa>=0.10
23
+ Requires-Dist: pyloudnorm>=0.1.1
24
+ Requires-Dist: scikit-learn>=1.2
25
+ Requires-Dist: tqdm>=4.65
26
+ Requires-Dist: fastapi>=0.110
27
+ Requires-Dist: uvicorn>=0.29
28
+ Provides-Extra: lang
29
+ Requires-Dist: langdetect>=1.0.9; extra == "lang"
30
+ Provides-Extra: plots
31
+ Requires-Dist: matplotlib>=3.5; extra == "plots"
32
+ Provides-Extra: vad
33
+ Requires-Dist: torch>=2.0; extra == "vad"
34
+ Requires-Dist: torchaudio>=2.0; extra == "vad"
35
+ Provides-Extra: whisper
36
+ Requires-Dist: openai-whisper; extra == "whisper"
37
+ Provides-Extra: dev
38
+ Requires-Dist: pytest>=7; extra == "dev"
39
+ Requires-Dist: httpx>=0.25; extra == "dev"
40
+ Provides-Extra: all
41
+ Requires-Dist: langdetect>=1.0.9; extra == "all"
42
+ Requires-Dist: matplotlib>=3.5; extra == "all"
43
+ Dynamic: license-file
44
+
45
+ # WaveWash
46
+
47
+ [![tests](https://github.com/BoobalanArjunan/wavewash/actions/workflows/tests.yml/badge.svg)](https://github.com/BoobalanArjunan/wavewash/actions/workflows/tests.yml)
48
+ ![status](https://img.shields.io/badge/status-alpha-orange)
49
+ ![license](https://img.shields.io/badge/license-MIT-blue)
50
+
51
+ **Check, repair and clean audio datasets before you train on them.**
52
+
53
+ Point WaveWash at a folder of audio and tell it what you are training (speech recognition, voice synthesis, speaker ID, music generation). It checks every file, repairs what it can *verify* is fixed, moves the rest to an error folder with a labeled reason, sets duplicates aside, and writes a full audit log. Your original files are never modified.
54
+
55
+ > **Status: alpha (0.1.0a1).** It works on the cases in its test suite, but it has not yet been validated on large real-world speech corpora. Treat its verdicts as a first pass and listen to a sample of what it keeps and rejects. See [Limitations](#limitations).
56
+
57
+ ![WaveWash app](https://raw.githubusercontent.com/BoobalanArjunan/wavewash/main/docs/screenshot-setup.png)
58
+
59
+ ## Why
60
+
61
+ Models inherit the flaws of their audio: clipped or distorted takes, DC offset, background noise, low-quality copies of better recordings, duplicates that quietly inflate test scores, empty or broken files. These are usually found by hand (listening to thousands of files) or not at all. WaveWash puts the common checks in one tool and tells you *why* each file was kept, repaired or rejected.
62
+
63
+ ## Install
64
+
65
+ ```bash
66
+ python3 -m venv ~/wavewash-env
67
+ source ~/wavewash-env/bin/activate # Windows: wavewash-env\Scripts\activate
68
+ pip install wavewash
69
+ wavewash doctor # confirms the install works
70
+ ```
71
+
72
+ Python 3.10 or newer. No Node.js needed: the web app ships inside the package.
73
+
74
+ Optional extras: `pip install "wavewash[lang]"` (transcript language check), `[plots]` (spectrograms in review samples), `[vad]` (Silero VAD, pulls in PyTorch), `[whisper]` (WER check).
75
+
76
+ ## Use it
77
+
78
+ **Web app** (runs only on your machine, at `http://127.0.0.1:8420`):
79
+
80
+ ```bash
81
+ wavewash app
82
+ ```
83
+
84
+ Pick a purpose, choose an input folder (subfolders are included) and an output folder, click run.
85
+
86
+ **Command line:**
87
+
88
+ ```bash
89
+ wavewash run --input ./raw_audio --output ./out/clean --purpose asr
90
+ wavewash run --help
91
+ ```
92
+
93
+ Purposes: `asr`, `tts`, `speaker_id`, `music_gen`, `custom`.
94
+
95
+ ## What you get
96
+
97
+ ```
98
+ out/
99
+ clean/ audio that passed, or was repaired and re-checked
100
+ _error/ rejected files, in folders named by reason (low_snr/, clipping/, corrupt_or_unreadable/ ...)
101
+ _duplicates/ duplicates, copied here (nothing is deleted)
102
+ _logs/ audit_log_*.csv and .json (one row per file: what was found, what was fixed, why rejected), summary_*.md
103
+ ```
104
+
105
+ ## What it checks and repairs
106
+
107
+ | Checks | Repairs (only kept if a re-check shows they helped) |
108
+ |---|---|
109
+ | Unreadable, empty or truncated files | DC offset removal |
110
+ | Too short / too long for the purpose | De-clipping of short clipped runs (up to 8 ms, spline interpolation) |
111
+ | Signal-to-noise ratio (estimate) | Noise reduction (spectral subtraction, kept only if the SNR estimate improves) |
112
+ | Clipping, DC offset, loudness | Loudness normalisation, resampling, channel conversion to the purpose's targets |
113
+ | Silence: mostly-silent files, long gaps | Trimming silence at the edges |
114
+ | Lossy or low-pass sources (sharp spectral cliff) | |
115
+ | Exact duplicates, same-samples duplicates, near-duplicates (same take, different level or format) | |
116
+ | Multiple speakers (heuristic) | |
117
+ | Optional: transcript language, WER against Whisper, speaker/session train-validation split | |
118
+
119
+ Repair is classical signal processing, **not** machine learning.
120
+
121
+ ## Limitations
122
+
123
+ Please read these before trusting a result.
124
+
125
+ - **Alpha, tested on synthetic data.** The test suite plants known defects (DC offset, clipping, duplicates, broken, empty and stereo files, other sample rates) and checks the routing, that originals are never modified, the local server's safety rules and the command line. It has *not* been validated on large real speech corpora; thresholds are reasoned defaults.
126
+ - **"Repaired" means "passed the re-check", not "restored".** De-clipping interpolates over saturated samples. On heavily clipped audio the re-check can pass even though the result is far from the original recording. Listen to repaired files.
127
+ - **Reverb (RT60) is a warning only.** Measured against synthetic rooms of known reverb time, the blind estimate could not tell dry from reverberant audio, so it never rejects a file.
128
+ - **Heuristics, not trained models:** the SNR estimate, the multi-speaker check and the near-duplicate threshold. Check their verdicts on your own data.
129
+ - **Music:** mid-track silence is not flagged, and moderate noise can go unnoticed.
130
+ - **Not yet measured:** whether cleaned data improves a trained model; speed and memory on very large datasets; real Whisper and Silero runs.
131
+ - The web app has **no login** and binds to `127.0.0.1` only. Do not expose it to a network.
132
+
133
+ ## Development
134
+
135
+ ```bash
136
+ git clone https://github.com/BoobalanArjunan/wavewash.git
137
+ cd wavewash
138
+ python3 -m venv .venv && source .venv/bin/activate
139
+ pip install -e ".[dev]"
140
+ python -m pytest -q
141
+ ```
142
+
143
+ The front-end source is in `frontend/` (React + Vite). The built app is committed in `src/wavewash/static/`; to rebuild it: `cd frontend && npm ci && npm run build`, then copy `dist/` over `src/wavewash/static/`.
144
+
145
+ Documentation: [step-by-step guide](docs/STEP_BY_STEP.md) · [user manual](docs/USER_MANUAL.md)
146
+
147
+ ## Contributing
148
+
149
+ Bug reports with a small example file are the most useful contribution. If WaveWash rejects a good file or passes a bad one, please open an issue with the log row for that file (from `_logs/audit_log_*.csv`).
150
+
151
+ ## License
152
+
153
+ MIT
@@ -0,0 +1,109 @@
1
+ # WaveWash
2
+
3
+ [![tests](https://github.com/BoobalanArjunan/wavewash/actions/workflows/tests.yml/badge.svg)](https://github.com/BoobalanArjunan/wavewash/actions/workflows/tests.yml)
4
+ ![status](https://img.shields.io/badge/status-alpha-orange)
5
+ ![license](https://img.shields.io/badge/license-MIT-blue)
6
+
7
+ **Check, repair and clean audio datasets before you train on them.**
8
+
9
+ Point WaveWash at a folder of audio and tell it what you are training (speech recognition, voice synthesis, speaker ID, music generation). It checks every file, repairs what it can *verify* is fixed, moves the rest to an error folder with a labeled reason, sets duplicates aside, and writes a full audit log. Your original files are never modified.
10
+
11
+ > **Status: alpha (0.1.0a1).** It works on the cases in its test suite, but it has not yet been validated on large real-world speech corpora. Treat its verdicts as a first pass and listen to a sample of what it keeps and rejects. See [Limitations](#limitations).
12
+
13
+ ![WaveWash app](https://raw.githubusercontent.com/BoobalanArjunan/wavewash/main/docs/screenshot-setup.png)
14
+
15
+ ## Why
16
+
17
+ Models inherit the flaws of their audio: clipped or distorted takes, DC offset, background noise, low-quality copies of better recordings, duplicates that quietly inflate test scores, empty or broken files. These are usually found by hand (listening to thousands of files) or not at all. WaveWash puts the common checks in one tool and tells you *why* each file was kept, repaired or rejected.
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ python3 -m venv ~/wavewash-env
23
+ source ~/wavewash-env/bin/activate # Windows: wavewash-env\Scripts\activate
24
+ pip install wavewash
25
+ wavewash doctor # confirms the install works
26
+ ```
27
+
28
+ Python 3.10 or newer. No Node.js needed: the web app ships inside the package.
29
+
30
+ Optional extras: `pip install "wavewash[lang]"` (transcript language check), `[plots]` (spectrograms in review samples), `[vad]` (Silero VAD, pulls in PyTorch), `[whisper]` (WER check).
31
+
32
+ ## Use it
33
+
34
+ **Web app** (runs only on your machine, at `http://127.0.0.1:8420`):
35
+
36
+ ```bash
37
+ wavewash app
38
+ ```
39
+
40
+ Pick a purpose, choose an input folder (subfolders are included) and an output folder, click run.
41
+
42
+ **Command line:**
43
+
44
+ ```bash
45
+ wavewash run --input ./raw_audio --output ./out/clean --purpose asr
46
+ wavewash run --help
47
+ ```
48
+
49
+ Purposes: `asr`, `tts`, `speaker_id`, `music_gen`, `custom`.
50
+
51
+ ## What you get
52
+
53
+ ```
54
+ out/
55
+ clean/ audio that passed, or was repaired and re-checked
56
+ _error/ rejected files, in folders named by reason (low_snr/, clipping/, corrupt_or_unreadable/ ...)
57
+ _duplicates/ duplicates, copied here (nothing is deleted)
58
+ _logs/ audit_log_*.csv and .json (one row per file: what was found, what was fixed, why rejected), summary_*.md
59
+ ```
60
+
61
+ ## What it checks and repairs
62
+
63
+ | Checks | Repairs (only kept if a re-check shows they helped) |
64
+ |---|---|
65
+ | Unreadable, empty or truncated files | DC offset removal |
66
+ | Too short / too long for the purpose | De-clipping of short clipped runs (up to 8 ms, spline interpolation) |
67
+ | Signal-to-noise ratio (estimate) | Noise reduction (spectral subtraction, kept only if the SNR estimate improves) |
68
+ | Clipping, DC offset, loudness | Loudness normalisation, resampling, channel conversion to the purpose's targets |
69
+ | Silence: mostly-silent files, long gaps | Trimming silence at the edges |
70
+ | Lossy or low-pass sources (sharp spectral cliff) | |
71
+ | Exact duplicates, same-samples duplicates, near-duplicates (same take, different level or format) | |
72
+ | Multiple speakers (heuristic) | |
73
+ | Optional: transcript language, WER against Whisper, speaker/session train-validation split | |
74
+
75
+ Repair is classical signal processing, **not** machine learning.
76
+
77
+ ## Limitations
78
+
79
+ Please read these before trusting a result.
80
+
81
+ - **Alpha, tested on synthetic data.** The test suite plants known defects (DC offset, clipping, duplicates, broken, empty and stereo files, other sample rates) and checks the routing, that originals are never modified, the local server's safety rules and the command line. It has *not* been validated on large real speech corpora; thresholds are reasoned defaults.
82
+ - **"Repaired" means "passed the re-check", not "restored".** De-clipping interpolates over saturated samples. On heavily clipped audio the re-check can pass even though the result is far from the original recording. Listen to repaired files.
83
+ - **Reverb (RT60) is a warning only.** Measured against synthetic rooms of known reverb time, the blind estimate could not tell dry from reverberant audio, so it never rejects a file.
84
+ - **Heuristics, not trained models:** the SNR estimate, the multi-speaker check and the near-duplicate threshold. Check their verdicts on your own data.
85
+ - **Music:** mid-track silence is not flagged, and moderate noise can go unnoticed.
86
+ - **Not yet measured:** whether cleaned data improves a trained model; speed and memory on very large datasets; real Whisper and Silero runs.
87
+ - The web app has **no login** and binds to `127.0.0.1` only. Do not expose it to a network.
88
+
89
+ ## Development
90
+
91
+ ```bash
92
+ git clone https://github.com/BoobalanArjunan/wavewash.git
93
+ cd wavewash
94
+ python3 -m venv .venv && source .venv/bin/activate
95
+ pip install -e ".[dev]"
96
+ python -m pytest -q
97
+ ```
98
+
99
+ The front-end source is in `frontend/` (React + Vite). The built app is committed in `src/wavewash/static/`; to rebuild it: `cd frontend && npm ci && npm run build`, then copy `dist/` over `src/wavewash/static/`.
100
+
101
+ Documentation: [step-by-step guide](docs/STEP_BY_STEP.md) · [user manual](docs/USER_MANUAL.md)
102
+
103
+ ## Contributing
104
+
105
+ Bug reports with a small example file are the most useful contribution. If WaveWash rejects a good file or passes a bad one, please open an issue with the log row for that file (from `_logs/audit_log_*.csv`).
106
+
107
+ ## License
108
+
109
+ MIT
@@ -0,0 +1,85 @@
1
+ # WaveWash: step by step, from download to published
2
+
3
+ Everything below is for a Mac. Replace `BoobalanArjunan` with your own.
4
+
5
+ ## Part A. Put it on your computer and try it
6
+
7
+ 1. **Find the download.** Files you downloaded are in your `Downloads` folder.
8
+ You need `wavewash-source.zip`.
9
+ 2. **Unzip it.** Double-click the zip. You get a folder called `wavewash-tool`.
10
+ 3. **Move the folder** somewhere permanent, for example `Documents`.
11
+ 4. **Open Terminal** (press Cmd+Space, type Terminal, press Enter).
12
+ 5. **Go into the folder:**
13
+ `cd ~/Documents/wavewash-tool`
14
+ 6. **Make a private Python space** (done once):
15
+ `python3 -m venv .venv`
16
+ then switch it on (every time you open a new Terminal):
17
+ `source .venv/bin/activate`
18
+ 7. **Install WaveWash and the test tools:**
19
+ `pip install -e ".[dev]"`
20
+ 8. **Run the tests.** This is the "does it work on my Mac?" check:
21
+ `python -m pytest -q`
22
+ You want to see `23 passed`. If something fails, copy the message and send it to me.
23
+ 9. **Try the app:** `wavewash app`. Your browser opens. Choose an input folder with .wav files and
24
+ an output folder that is NOT inside the input folder, then click Run.
25
+ 10. **Or use the command line:**
26
+ `wavewash run --input ~/Desktop/my_wavs --output ~/Desktop/my_wavs_clean/clean --purpose asr`
27
+
28
+ ## Part B. Test it on real speech (the most important step)
29
+
30
+ 11. Download a free sample of real speech, for example LibriSpeech **dev-clean** from openslr.org/12.
31
+ 12. Run WaveWash on a few hundred files (step 10 with that folder).
32
+ 13. Open the results. Look at the first 50 files it rejected and ask: *was it really bad?*
33
+ Write down: files checked, files rejected, how many of the rejects were really bad.
34
+ These real numbers go in the README. If many good files were rejected, tell me and we fix the settings.
35
+
36
+ ## Part C. Put the code on GitHub
37
+
38
+ 14. Make a free account at github.com.
39
+ 15. Click **New repository**. Name it `wavewash`. Choose Public. Do not tick any extra files.
40
+ 16. In Terminal, inside `wavewash-tool`:
41
+ ```
42
+ git init
43
+ git add .
44
+ git commit -m "WaveWash 0.1.0a1"
45
+ git branch -M main
46
+ git remote add origin https://github.com/BoobalanArjunan/wavewash.git
47
+ git push -u origin main
48
+ ```
49
+ 17. In the README, replace `BoobalanArjunan` in the badge line.
50
+ 18. On GitHub open the **Actions** tab. The tests now run by themselves on Mac, Windows and Linux.
51
+ Green tick means good. Red means something broke on that system, and we fix it.
52
+
53
+ ## Part D. Publish to PyPI (so anyone can `pip install wavewash`)
54
+
55
+ 18b. **Put your name on it.** Run this once, with your own details (the email is optional and becomes PUBLIC):
56
+ `python scripts/set_owner.py --name "Your Full Name" --github your-github-name`
57
+ It sets you as author and maintainer, fixes the project links and the licence holder, and replaces every
58
+ `BoobalanArjunan`. On PyPI you are the *owner* of the project because you upload it from your PyPI account.
59
+
60
+ 19. Check the name is free: open pypi.org/project/wavewash. If the page says "not found", it is free.
61
+ 20. Make accounts at **test.pypi.org** and **pypi.org** (turn on two-factor login on both).
62
+ On each, create an **API token** (Account settings, API tokens).
63
+ 21. Build the files (inside `wavewash-tool`, with the venv switched on):
64
+ ```
65
+ pip install build twine
66
+ python -m build
67
+ ```
68
+ The files appear in the `dist` folder.
69
+ 22. **Practice upload first** (uses the test site; username is `__token__`, password is your token):
70
+ `python -m twine upload --repository testpypi dist/*`
71
+ 23. **Check it installs** in a fresh space:
72
+ ```
73
+ python3 -m venv ~/try-wavewash && source ~/try-wavewash/bin/activate
74
+ pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple wavewash
75
+ wavewash doctor
76
+ ```
77
+ 24. **Real upload.** You can't undo it, so only after step 23 works:
78
+ `python -m twine upload dist/*`
79
+ 25. Anyone can now run `pip install wavewash`.
80
+
81
+ ## What each part is for
82
+ - **Tests** protect users. A change that breaks something shows up before it reaches them.
83
+ - **Real-speech numbers** show it works on real data.
84
+ - **GitHub and the green tick** give people a reason to trust it.
85
+ - **TestPyPI first** because a mistake on real PyPI can't be erased.