micforge 1.3.0__tar.gz → 1.3.1__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.
- {micforge-1.3.0/src/micforge.egg-info → micforge-1.3.1}/PKG-INFO +54 -7
- {micforge-1.3.0 → micforge-1.3.1}/README.md +337 -290
- {micforge-1.3.0 → micforge-1.3.1}/pyproject.toml +2 -2
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/__init__.py +1 -1
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/backend.py +14 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/engine.py +5 -2
- micforge-1.3.1/src/micforge/audio/isolated_engine.py +765 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/cli.py +2 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/live.py +16 -14
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/config.py +1 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/aec.py +78 -2
- micforge-1.3.1/src/micforge/dsp/chain.py +283 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/cofilite.py +114 -49
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/denoise.py +71 -7
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/deverb.py +52 -37
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/gate.py +11 -2
- micforge-1.3.1/src/micforge/dsp/spectral_rack.py +258 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/dashboard.py +36 -8
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/tray.py +4 -3
- {micforge-1.3.0 → micforge-1.3.1/src/micforge.egg-info}/PKG-INFO +54 -7
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/SOURCES.txt +6 -1
- micforge-1.3.1/tests/test_audio_pipeline.py +114 -0
- micforge-1.3.1/tests/test_isolated_engine.py +176 -0
- micforge-1.3.1/tests/test_v131_features.py +49 -0
- micforge-1.3.0/src/micforge/dsp/chain.py +0 -153
- {micforge-1.3.0 → micforge-1.3.1}/LICENSE +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/setup.cfg +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/__main__.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/analysis/__init__.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/analysis/stats.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/__init__.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/cues.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/device_watch.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/devices.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/fileio.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/latency.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/loopback.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/metrics.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/noise_profile.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/recorder.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/ring.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/__init__.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/calibrate.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/common.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/devices_cmd.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/diagnostics_cmd.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/doctor.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/files.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/help_cmd.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/latency_test.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/preset_cmd.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/test_mic.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/wizard.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/diagnostics.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/__init__.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/base.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/biquad.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/compressor.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/deesser.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/export_cofilite.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/leveler.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/proximity.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/util.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/errors.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/logging_setup.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/models/cofilite.onnx +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/presets.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/profile_store.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/__init__.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/hotkeys.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/keys.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/report.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/settings_gui.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/theme.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/tuning.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/widgets.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge/util/autostart.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/dependency_links.txt +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/entry_points.txt +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/requires.txt +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/top_level.txt +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_aec.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_click_fixes.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_cofilite.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_cues.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_deverb.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_dsp.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_engine.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_hotkeys.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_misc.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_presets.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_proximity.py +0 -0
- {micforge-1.3.0 → micforge-1.3.1}/tests/test_v130_features.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: micforge
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.1
|
|
4
4
|
Summary: Real-time microphone clean-up for Discord and voice chat: de-muffle, denoise, level, route.
|
|
5
5
|
Author: Parth Sadaria
|
|
6
6
|
License-Expression: MIT
|
|
@@ -44,10 +44,10 @@ Dynamic: license-file
|
|
|
44
44
|
|
|
45
45
|
# Micforge
|
|
46
46
|
|
|
47
|
-
[](verison%20notes/v1.3.1.md)
|
|
48
48
|
[](LICENSE)
|
|
49
49
|
[](https://www.python.org/)
|
|
50
|
-
[](tests/)
|
|
51
51
|
[]()
|
|
52
52
|
|
|
53
53
|
> **Real-time, local-first microphone clean-up for Discord, gaming, and streaming.**
|
|
@@ -65,6 +65,10 @@ It pairs an **11-stage modular audio processing rack** with an ultra-lightweight
|
|
|
65
65
|
|
|
66
66
|
### What makes it different?
|
|
67
67
|
- **Ultra-lean footprint:** Consumes only **~70–85 MB of RAM** and **<5–8% CPU** on a single core during gaming. Zero cloud calls, zero telemetry, 100% offline.
|
|
68
|
+
- **Dedicated Process GIL Isolation (v1.3.1):** Moves real-time audio and DSP into an isolated OS process via shared memory and high-priority queues, shielding the audio thread from UI rendering spikes.
|
|
69
|
+
- **Single Shared STFT Rack (v1.3.1):** Unifies AEC, neural denoising, and dereverberation into one frequency-domain pass on a 512-point grid, slashing redundant FFTs and minimizing latency to ~1.1 ms compute time.
|
|
70
|
+
- **Voice-Targeted Naturalness (v1.3.1):** In-domain frequency mixing (`naturalness: 0.08`) modulates dry blend strictly on voiced speech harmonics, banishing underwater phase artifacts while achieving **58.8 dB suppression** on loud stationary hiss and pressure cookers.
|
|
71
|
+
- **Free Neural Mask VAD (v1.3.1):** Derives high-resolution speech probability directly from CoFi-Lite's neural mask ($300-4,000\text{ Hz}$) with hysteresis smoothing to drive gating without chattering.
|
|
68
72
|
- **Continuous Adaptive Noise Profiling (v1.3.0):** Voice-aware background noise learner that adapts to spinning fans and AC drift without ever learning on speech. Includes environment profiles (`quiet_room`, `fan_on`, `mechanical_keyboard`).
|
|
69
73
|
- **Hot-Plug & Auto-Recovery (v1.3.0):** Seamless reconnects with exponential backoff on USB disconnects, with safe bypass fallback so you are never left silently muted.
|
|
70
74
|
- **End-to-End Latency Benchmark (v1.3.0):** Measures actual loopback roundtrip latency and itemizes hardware vs. DSP delays with actionable guidance (`micforge latency`).
|
|
@@ -98,6 +102,42 @@ Microphone Input ─┼─▶ High-Pass Filter (Rumble removal, 90 Hz default)
|
|
|
98
102
|
|
|
99
103
|
---
|
|
100
104
|
|
|
105
|
+
## Real-Time Audio Proof & Side-by-Side Comparison
|
|
106
|
+
|
|
107
|
+
Don't just take our word for it—listen and visually compare how a real budget microphone recording is transformed in real time through the Micforge DSP rack:
|
|
108
|
+
|
|
109
|
+
| 🔈 Raw Microphone (Default / Unprocessed) | 🎧 Micforge Enhanced (Live 11-Stage Rack) |
|
|
110
|
+
|:---:|:---:|
|
|
111
|
+
| **[▶️ Click to Listen: Raw Audio (`docs/audio/1_raw.wav`)](docs/audio/1_raw.wav)** | **[▶️ Click to Listen: Processed Audio (`docs/audio/1_processed.wav`)](docs/audio/1_processed.wav)** |
|
|
112
|
+
| [](docs/audio/1_raw.wav) | [](docs/audio/1_processed.wav) |
|
|
113
|
+
| **❌ Loud background noise & hiss**<br>Constant pressure cooker steam & fan drone audible between words ($-35.3\text{ dBFS}$) | **✅ Pure digital black in pauses**<br>Noise floor dropped by **$+38.7\text{ dB}$** ($-74.0\text{ dBFS}$)—zero audible hiss or background hum |
|
|
114
|
+
| **❌ Hollow "empty bathroom" flutter**<br>Untreated hard-wall reflections ring around the speech | **✅ Studio-dry vocal acoustics**<br>Late room reverberation flutter cleanly stripped out |
|
|
115
|
+
| **❌ Thin, tinny, weak headset tone**<br>Sounds like a cheap laptop or budget gaming headset mic | **✅ Warm broadcast radio presence**<br>Rich $120\text{ Hz}$ vocal chest resonance (SM7B/RE20 proximity effect) |
|
|
116
|
+
| **❌ Volume jumps & harsh spikes**<br>Quiet whispers get lost, loud talking clips into distortion | **✅ Consistent, broadcast-leveled volume**<br>Smooth RMS leveling with a hard $-1.5\text{ dBFS}$ peak limiter (zero clipping) |
|
|
117
|
+
|
|
118
|
+
<br>
|
|
119
|
+
|
|
120
|
+
<details>
|
|
121
|
+
<summary><b>🔍 Click to view Full Stacked Waveform & High-Resolution Spectrogram Analysis</b></summary>
|
|
122
|
+
<br>
|
|
123
|
+
|
|
124
|
+

|
|
125
|
+
|
|
126
|
+
</details>
|
|
127
|
+
|
|
128
|
+
### 📊 Objective Quality & Latency Benchmark
|
|
129
|
+
| Benchmark Metric | Raw Input (`1_raw.wav`) | Micforge Output (`1_processed.wav`) | Delta / Improvement |
|
|
130
|
+
|:---|:---:|:---:|:---:|
|
|
131
|
+
| **Inter-Word Silence Pause Noise Floor** | -35.29 dBFS | **-73.96 dBFS** | **+38.67 dB quieter** (digital black) |
|
|
132
|
+
| **Broadband Steam / Cooker Hiss** | -30.00 dBFS | **-89.24 dBFS** | **+58.79 dB suppression** |
|
|
133
|
+
| **DNSMOS Overall Quality (OVRL)** | 1.75 | **1.99** | **+0.24 MOS points** |
|
|
134
|
+
| **DNSMOS Speech Quality (SIG)** | 1.00 | **1.45** | **+0.45 MOS points** |
|
|
135
|
+
| **STFT Refactor Null-Test (SI-SDR)**| — | **149.11 dB (CoFi-Lite)** | Bit-exact mathematical null (>40 dB target) |
|
|
136
|
+
| **Per-Block DSP Execution Time** | — | **~1.12 ms** ($N=160$ @ 16 kHz) | Real-time budget headroom > 85% |
|
|
137
|
+
| **Audio-Thread Heap Allocations** | — | **0 allocations** | Zero garbage-collection jitter |
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
101
141
|
## Realistic Expectations
|
|
102
142
|
|
|
103
143
|
Let's be engineer-honest:
|
|
@@ -264,6 +304,7 @@ micforge/
|
|
|
264
304
|
├── src/micforge/
|
|
265
305
|
│ ├── audio/
|
|
266
306
|
│ │ ├── engine.py # Stream lifecycle, phase centering, cushion re-arming
|
|
307
|
+
│ │ ├── isolated_engine.py # Dedicated process isolation, shared memory & watchdog
|
|
267
308
|
│ │ ├── loopback.py # WASAPI loopback speaker capture for AEC
|
|
268
309
|
│ │ ├── cues.py # Procedural sine-sweep feedback chimes
|
|
269
310
|
│ │ ├── devices.py # Device discovery & virtual-cable detection
|
|
@@ -281,13 +322,15 @@ micforge/
|
|
|
281
322
|
│ │ ├── doctor.py # Audio driver diagnostics & zip export
|
|
282
323
|
│ │ └── files.py # Offline WAV processing
|
|
283
324
|
│ ├── dsp/
|
|
325
|
+
│ │ ├── chain.py # 11-stage processing rack & per-stage p50/p99 timing
|
|
326
|
+
│ │ ├── spectral_rack.py # Single unified STFT rack (AEC + Denoise + Deverb)
|
|
284
327
|
│ │ ├── aec.py # Acoustic Echo Cancellation (PBFDAF + DTD)
|
|
285
328
|
│ │ ├── deverb.py # Room Dereverberation (Spectral decay envelope)
|
|
286
329
|
│ │ ├── proximity.py # Voice Proximity (F0 chest resonance & warmth)
|
|
287
|
-
│ │ ├── cofilite.py # CoFi-Lite neural speech enhancement
|
|
330
|
+
│ │ ├── cofilite.py # CoFi-Lite neural speech enhancement & mask VAD
|
|
288
331
|
│ │ ├── denoise.py # Classical Spectral Wiener fallback
|
|
289
332
|
│ │ ├── biquad.py # Pure NumPy Second-Order Sections (SOS) engine
|
|
290
|
-
│ │ ├── gate.py # Soft downward expander
|
|
333
|
+
│ │ ├── gate.py # Soft downward expander driven by neural mask VAD
|
|
291
334
|
│ │ ├── compressor.py # Fast feed-forward compressor & peak limiter
|
|
292
335
|
│ │ ├── deesser.py # Split-band de-esser
|
|
293
336
|
│ │ └── leveler.py # Slow RMS speech leveler
|
|
@@ -301,17 +344,21 @@ micforge/
|
|
|
301
344
|
│ ├── presets.py # Preset CRUD, validation & built-in definitions
|
|
302
345
|
│ └── cli.py # Command-line entry point
|
|
303
346
|
├── docs/
|
|
347
|
+
│ ├── audio/ # Real-time raw vs. processed WAV samples
|
|
348
|
+
│ ├── images/ # High-resolution spectrogram and waveform analyses
|
|
304
349
|
│ └── TROUBLESHOOTING.md # Centralized diagnostic & OS troubleshooting guide
|
|
305
350
|
├── scripts/
|
|
351
|
+
│ ├── generate_spectrogram_assets.py # Automated waveform & spectrogram generator
|
|
306
352
|
│ ├── compare_two.py # Dual-file comparison, metrics & A/B listening
|
|
307
353
|
│ └── compare_audio.py # Automated WAV processing evaluation
|
|
308
|
-
├── tests/ #
|
|
354
|
+
├── tests/ # 139 automated tests (mocked PortAudio backend)
|
|
309
355
|
├── verison notes/
|
|
310
356
|
│ ├── v1.1.0.md
|
|
311
357
|
│ ├── v1.1.1.md
|
|
312
358
|
│ ├── v1.2.0.md # AEC, De-Verb, Proximity, Gamer HUD
|
|
313
359
|
│ ├── v1.2.1.md # RAM reduction (~85 MB) & clock drift fixes
|
|
314
|
-
│
|
|
360
|
+
│ ├── v1.3.0.md # Adaptive profiles, hot-plug recovery, diagnostics & latency
|
|
361
|
+
│ └── v1.3.1.md # Shared STFT rack, process GIL isolation, mask VAD, voice naturalness
|
|
315
362
|
├── pyproject.toml
|
|
316
363
|
└── README.md
|
|
317
364
|
```
|