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.
Files changed (93) hide show
  1. {micforge-1.3.0/src/micforge.egg-info → micforge-1.3.1}/PKG-INFO +54 -7
  2. {micforge-1.3.0 → micforge-1.3.1}/README.md +337 -290
  3. {micforge-1.3.0 → micforge-1.3.1}/pyproject.toml +2 -2
  4. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/__init__.py +1 -1
  5. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/backend.py +14 -0
  6. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/engine.py +5 -2
  7. micforge-1.3.1/src/micforge/audio/isolated_engine.py +765 -0
  8. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/cli.py +2 -0
  9. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/live.py +16 -14
  10. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/config.py +1 -0
  11. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/aec.py +78 -2
  12. micforge-1.3.1/src/micforge/dsp/chain.py +283 -0
  13. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/cofilite.py +114 -49
  14. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/denoise.py +71 -7
  15. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/deverb.py +52 -37
  16. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/gate.py +11 -2
  17. micforge-1.3.1/src/micforge/dsp/spectral_rack.py +258 -0
  18. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/dashboard.py +36 -8
  19. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/tray.py +4 -3
  20. {micforge-1.3.0 → micforge-1.3.1/src/micforge.egg-info}/PKG-INFO +54 -7
  21. {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/SOURCES.txt +6 -1
  22. micforge-1.3.1/tests/test_audio_pipeline.py +114 -0
  23. micforge-1.3.1/tests/test_isolated_engine.py +176 -0
  24. micforge-1.3.1/tests/test_v131_features.py +49 -0
  25. micforge-1.3.0/src/micforge/dsp/chain.py +0 -153
  26. {micforge-1.3.0 → micforge-1.3.1}/LICENSE +0 -0
  27. {micforge-1.3.0 → micforge-1.3.1}/setup.cfg +0 -0
  28. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/__main__.py +0 -0
  29. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/analysis/__init__.py +0 -0
  30. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/analysis/stats.py +0 -0
  31. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/__init__.py +0 -0
  32. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/cues.py +0 -0
  33. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/device_watch.py +0 -0
  34. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/devices.py +0 -0
  35. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/fileio.py +0 -0
  36. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/latency.py +0 -0
  37. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/loopback.py +0 -0
  38. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/metrics.py +0 -0
  39. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/noise_profile.py +0 -0
  40. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/recorder.py +0 -0
  41. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/audio/ring.py +0 -0
  42. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/__init__.py +0 -0
  43. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/calibrate.py +0 -0
  44. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/common.py +0 -0
  45. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/devices_cmd.py +0 -0
  46. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/diagnostics_cmd.py +0 -0
  47. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/doctor.py +0 -0
  48. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/files.py +0 -0
  49. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/help_cmd.py +0 -0
  50. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/latency_test.py +0 -0
  51. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/preset_cmd.py +0 -0
  52. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/test_mic.py +0 -0
  53. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/commands/wizard.py +0 -0
  54. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/diagnostics.py +0 -0
  55. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/__init__.py +0 -0
  56. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/base.py +0 -0
  57. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/biquad.py +0 -0
  58. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/compressor.py +0 -0
  59. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/deesser.py +0 -0
  60. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/export_cofilite.py +0 -0
  61. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/leveler.py +0 -0
  62. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/proximity.py +0 -0
  63. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/dsp/util.py +0 -0
  64. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/errors.py +0 -0
  65. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/logging_setup.py +0 -0
  66. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/models/cofilite.onnx +0 -0
  67. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/presets.py +0 -0
  68. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/profile_store.py +0 -0
  69. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/__init__.py +0 -0
  70. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/hotkeys.py +0 -0
  71. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/keys.py +0 -0
  72. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/report.py +0 -0
  73. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/settings_gui.py +0 -0
  74. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/theme.py +0 -0
  75. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/tuning.py +0 -0
  76. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/ui/widgets.py +0 -0
  77. {micforge-1.3.0 → micforge-1.3.1}/src/micforge/util/autostart.py +0 -0
  78. {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/dependency_links.txt +0 -0
  79. {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/entry_points.txt +0 -0
  80. {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/requires.txt +0 -0
  81. {micforge-1.3.0 → micforge-1.3.1}/src/micforge.egg-info/top_level.txt +0 -0
  82. {micforge-1.3.0 → micforge-1.3.1}/tests/test_aec.py +0 -0
  83. {micforge-1.3.0 → micforge-1.3.1}/tests/test_click_fixes.py +0 -0
  84. {micforge-1.3.0 → micforge-1.3.1}/tests/test_cofilite.py +0 -0
  85. {micforge-1.3.0 → micforge-1.3.1}/tests/test_cues.py +0 -0
  86. {micforge-1.3.0 → micforge-1.3.1}/tests/test_deverb.py +0 -0
  87. {micforge-1.3.0 → micforge-1.3.1}/tests/test_dsp.py +0 -0
  88. {micforge-1.3.0 → micforge-1.3.1}/tests/test_engine.py +0 -0
  89. {micforge-1.3.0 → micforge-1.3.1}/tests/test_hotkeys.py +0 -0
  90. {micforge-1.3.0 → micforge-1.3.1}/tests/test_misc.py +0 -0
  91. {micforge-1.3.0 → micforge-1.3.1}/tests/test_presets.py +0 -0
  92. {micforge-1.3.0 → micforge-1.3.1}/tests/test_proximity.py +0 -0
  93. {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.0
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
- [![Version](https://img.shields.io/badge/version-1.3.0-0284c7.svg)](verison%20notes/v1.3.0.md)
47
+ [![Version](https://img.shields.io/badge/version-1.3.1-0284c7.svg)](verison%20notes/v1.3.1.md)
48
48
  [![License: MIT](https://img.shields.io/badge/license-MIT-slate.svg)](LICENSE)
49
49
  [![Python 3.10+](https://img.shields.io/badge/python-3.10+-emerald.svg)](https://www.python.org/)
50
- [![Tests](https://img.shields.io/badge/tests-128%2F128%20passing-teal.svg)](tests/)
50
+ [![Tests](https://img.shields.io/badge/tests-139%2F139%20passing-teal.svg)](tests/)
51
51
  [![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20Linux%20%7C%20macOS-neutral.svg)]()
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
+ | [![Raw Spectrogram](docs/images/spectrogram_raw.png)](docs/audio/1_raw.wav) | [![Processed Spectrogram](docs/images/spectrogram_processed.png)](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
+ ![Full Stacked Comparison](docs/images/spectrogram_comparison.png)
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 / noise gate
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/ # 125 automated tests (mocked PortAudio backend)
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
- │ └── v1.3.0.md # Adaptive profiles, hot-plug recovery, diagnostics & latency
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
  ```