<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Swarnim Tripathi</title><link>http://blog.swarnim.site/</link><description>Recent content on Swarnim Tripathi</description><generator>Hugo</generator><language>en</language><copyright>2026 Swarnim Tripathi</copyright><lastBuildDate>Wed, 01 Jul 2026 23:05:53 +0530</lastBuildDate><atom:link href="http://blog.swarnim.site/index.xml" rel="self" type="application/rss+xml"/><item><title>Identity Is Not the Keyword</title><link>http://blog.swarnim.site/posts/disent-kws/</link><pubDate>Wed, 01 Jul 2026 23:05:53 +0530</pubDate><guid>http://blog.swarnim.site/posts/disent-kws/</guid><description>A deep dive into DISENT-KWS: a 1.8M parameter model that disentangles phonetic content from speaker identity for robust custom keyword spotting on edge devices. Combines adversarial training, mutual information minimization, and dual-head scoring for speaker-aware wake word detection.</description></item><item><title>Deconstructing my PyTorch ATen PR: What happens when you index a Tensor?</title><link>http://blog.swarnim.site/posts/pytorch-aten-dispatch/</link><pubDate>Sun, 17 May 2026 01:00:00 +0530</pubDate><guid>http://blog.swarnim.site/posts/pytorch-aten-dispatch/</guid><description>My PyTorch PR that fixed empty-index crashes in ATen&amp;#39;s tensor indexing... tracing the dispatch path from Python to C++ and the validation fix in IndexingUtils.h.</description></item><item><title/><link>http://blog.swarnim.site/ref/model_card/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://blog.swarnim.site/ref/model_card/</guid><description>&lt;h1 id="model-card-disent-kws">Model Card: DISENT-KWS&lt;/h1>
&lt;h2 id="model-description">Model Description&lt;/h2>
&lt;p>&lt;strong>DISENT-KWS&lt;/strong> is a speech disentanglement model for robust custom word detection. It uses a shared BC-ResNet-2 encoder with dual heads — a Causal Conformer (phonetic) and ECAPA-TDNN Lite (speaker) — to produce orthogonal latent embeddings. A Dual-Gate Scorer combines keyword and speaker similarity with calibrated weights for joint verification.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Total Parameters:&lt;/strong> 1.806M&lt;/li>
&lt;li>&lt;strong>ONNX Size:&lt;/strong> 0.60 MB (INT8 quantized)&lt;/li>
&lt;li>&lt;strong>Input:&lt;/strong> 80-band log Mel filterbank energies, 200 frames (2 s @ 16 kHz)&lt;/li>
&lt;li>&lt;strong>Output:&lt;/strong> &lt;code>z_phn ∈ ℝ¹⁹²&lt;/code> (phonetic embedding), &lt;code>z_spk ∈ ℝ¹⁹²&lt;/code> (speaker embedding)&lt;/li>
&lt;/ul>
&lt;h2 id="intended-use">Intended Use&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Custom keyword spotting&lt;/strong> with speaker verification for access control, voice assistants, or wake-word systems&lt;/li>
&lt;li>&lt;strong>Real-time streaming&lt;/strong> inference on CPU (26.4 ms per 2 s window)&lt;/li>
&lt;li>&lt;strong>Few-shot enrollment&lt;/strong> (5+ utterances) for new users and custom words&lt;/li>
&lt;/ul>
&lt;h2 id="architecture">Architecture&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Component&lt;/th>
&lt;th>Type&lt;/th>
&lt;th>Params&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Shared Encoder&lt;/td>
&lt;td>BC-ResNet-2&lt;/td>
&lt;td>33.8K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Temporal Block&lt;/td>
&lt;td>Mamba SSM / Dilated Conv1D&lt;/td>
&lt;td>10.3K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Phonetic Head&lt;/td>
&lt;td>Causal Conformer (4 heads, kernel 15)&lt;/td>
&lt;td>1,673K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Speaker Head&lt;/td>
&lt;td>ECAPA-TDNN Lite (SE ratio 4, scale 4)&lt;/td>
&lt;td>88.8K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Scorer&lt;/td>
&lt;td>Dual-Gate (w_kw=0.30, w_spk=0.65, EMA α=0.7)&lt;/td>
&lt;td>—&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="training-data">Training Data&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Dataset&lt;/th>
&lt;th>Usage&lt;/th>
&lt;th>Samples&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Google Speech Commands v2&lt;/td>
&lt;td>Keyword pre-training (35 classes)&lt;/td>
&lt;td>105K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>VoxCeleb1&lt;/td>
&lt;td>Speaker verification (1,251 speakers)&lt;/td>
&lt;td>153K&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LibriPhrase&lt;/td>
&lt;td>Hard-negative triplet pairs&lt;/td>
&lt;td>3K triplets&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>MUSAN&lt;/td>
&lt;td>Noise augmentation (babble, music, environmental)&lt;/td>
&lt;td>109 hrs&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="training-phases">Training Phases&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>Phase 1:&lt;/strong> AAM-Softmax pre-training on keyword (GSC) and speaker (VoxCeleb) separately&lt;/li>
&lt;li>&lt;strong>Phase 2:&lt;/strong> Joint training with GRL adversarial reversal + CLUB MI minimization + triplet rejection loss&lt;/li>
&lt;li>&lt;strong>Phase 3a:&lt;/strong> GE2E speaker head refinement&lt;/li>
&lt;li>&lt;strong>Phase 3b:&lt;/strong> Hard-negative GE2E with LibriPhrase confusers&lt;/li>
&lt;/ol>
&lt;h2 id="performance">Performance&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Metric&lt;/th>
&lt;th>Value&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Keyword EER&lt;/td>
&lt;td>4.69%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Speaker EER&lt;/td>
&lt;td>17.86%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Joint EER&lt;/td>
&lt;td>23.47%&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Joint AUC&lt;/td>
&lt;td>0.8425&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>CPU Latency&lt;/td>
&lt;td>26.43 ms (p95: 28.29 ms)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Real-Time Factor (xRT)&lt;/td>
&lt;td>0.0132&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Optimal Threshold (τ)&lt;/td>
&lt;td>0.2222&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="hardware--runtime">Hardware &amp;amp; Runtime&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Training:&lt;/strong> NVIDIA GPU with 16 GB+ VRAM (tested on Tesla T4)&lt;/li>
&lt;li>&lt;strong>Inference:&lt;/strong> CPU-only via ONNX Runtime; no GPU required&lt;/li>
&lt;li>&lt;strong>Memory:&lt;/strong> ~200 MB RAM at runtime&lt;/li>
&lt;/ul>
&lt;h2 id="known-limitations">Known Limitations&lt;/h2>
&lt;ul>
&lt;li>Requires clean enrollment recordings (SNR ≥ 10 dB recommended)&lt;/li>
&lt;li>Speaker EER (17.86%) is higher than keyword EER — joint verification mitigates this&lt;/li>
&lt;li>Mamba SSM fallback to Dilated Conv1D on platforms without CUDA (no performance loss)&lt;/li>
&lt;/ul>
&lt;h2 id="license">License&lt;/h2>
&lt;p>MIT&lt;/p></description></item><item><title/><link>http://blog.swarnim.site/ref/readme/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://blog.swarnim.site/ref/readme/</guid><description>&lt;h1 id="disent-kws--speech-disentanglement-for-robust-custom-word-detection">DISENT-KWS — Speech Disentanglement for Robust Custom Word Detection&lt;/h1>
&lt;p align="center">
&lt;img src="docs/training_phases.png" alt="DISENT-KWS Training Pipeline" width="800"/>
&lt;/p>
&lt;p align="center">
&lt;img src="https://img.shields.io/badge/Parameters-1.806M-green" alt="1.806M params"/>
&lt;img src="https://img.shields.io/badge/Keyword%20EER-4.69%25-green" alt="4.69% Keyword EER"/>
&lt;img src="https://img.shields.io/badge/Joint%20AUC-0.8425-green" alt="0.8425 AUC"/>
&lt;img src="https://img.shields.io/badge/Model%20Size-0.60%20MB-blue" alt="0.60 MB ONNX"/>
&lt;img src="https://img.shields.io/badge/xRT-0.0132-blue" alt="0.0132 real-time factor"/>
&lt;img src="https://img.shields.io/badge/License-MIT-yellow" alt="MIT License"/>
&lt;/p>
&lt;hr>
&lt;ul>
&lt;li>&lt;strong>Demo Video Link&lt;/strong> — &lt;a href="https://youtu.be/dKjWTKI60Rw">YouTube Demo Video&lt;/a>&lt;/li>
&lt;li>&lt;strong>Setup &amp;amp; Result Reproducibility Video Link&lt;/strong> — &lt;a href="https://youtu.be/eU0mwZUcVaE">YouTube Setup Video&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="quick-start">Quick Start&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Install dependencies&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uv sync --all-extras
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Run tests (verify 60+ tests pass)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make test
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Option A: Live record 5 utterances from mic, then enroll&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python src/demo.py record --model model_final.pt --out enrollment.pt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Option B: Provide pre-recorded WAV files&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python src/demo.py enroll &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --recordings ./my_recordings/*.wav &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --model model_final.pt &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --out enrollment.pt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Real-time detection&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python src/demo.py detect --enrollment enrollment.pt --auto-threshold --vad-threshold 0.02
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="project-artifacts">Project Artifacts&lt;/h2>
&lt;h3 id="technical-documentation">Technical Documentation&lt;/h3>
&lt;p>All technical documentation is organized in the &lt;a href="docs/">&lt;code>docs/&lt;/code>&lt;/a> directory:&lt;/p></description></item><item><title/><link>http://blog.swarnim.site/ref/solution_architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://blog.swarnim.site/ref/solution_architecture/</guid><description>&lt;h1 id="speech-disentanglement-for-robust-custom-word-detection-solution-architecture-and-theoretical-foundations">Speech Disentanglement for Robust Custom Word Detection: Solution Architecture and Theoretical Foundations&lt;/h1>
&lt;p>This document serves as a comprehensive technical treatise on the mathematical, architectural, and optimization foundations of the &lt;strong>DISENT-KWS&lt;/strong> system.&lt;/p>
&lt;hr>
&lt;h2 id="1-problem-formulation-and-theoretical-constraints">1. Problem Formulation and Theoretical Constraints&lt;/h2>
&lt;p>Let $x(t)$ be a monaural, continuous-time acoustic signal recorded in a noisy reverberant environment. The signal is modeled as:&lt;/p>
$$x(t) = \left( s_T(t) * h_T(t) \right) + \sum_{i=1}^{I} \left( s_i(t) * h_i(t) \right) + n(t)$$&lt;p>Where:&lt;/p></description></item><item><title/><link>http://blog.swarnim.site/ref/testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://blog.swarnim.site/ref/testing/</guid><description>&lt;h1 id="testing-guide-for-disent-kws">Testing Guide for DISENT-KWS&lt;/h1>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>This project uses &lt;strong>pytest&lt;/strong> for unit testing, &lt;strong>GitHub Actions&lt;/strong> for CI-CD, and &lt;strong>pre-commit hooks&lt;/strong> for local code quality enforcement.&lt;/p>
&lt;p>All dependencies are managed via &lt;strong>&lt;code>uv&lt;/code>&lt;/strong> (fast Python package installer). Make sure &lt;code>uv&lt;/code> is installed before running tests.&lt;/p>
&lt;hr>
&lt;h2 id="quick-start">Quick Start&lt;/h2>
&lt;h3 id="run-all-tests-locally">Run All Tests Locally&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Option 1: Using make&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make test
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Option 2: Using uv directly&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uv run pytest tests/ -v
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Option 3: Using the Python runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python scripts/test.py
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="run-tests-with-coverage">Run Tests with Coverage&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Using make&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make test-cov
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Using uv directly&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uv run pytest tests/ -v --cov&lt;span style="color:#f92672">=&lt;/span>data --cov&lt;span style="color:#f92672">=&lt;/span>models --cov&lt;span style="color:#f92672">=&lt;/span>training --cov-report&lt;span style="color:#f92672">=&lt;/span>html
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Using the Python runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>python scripts/test.py --coverage
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="run-specific-tests">Run Specific Tests&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Run only dataloader tests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>make test-dataloaders
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># or&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uv run pytest tests/test_dataloaders.py -v
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Run specific test by name&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uv run pytest tests/test_dataloaders.py::TestLFBETransform::test_transform_1d_input -v
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Run tests matching a pattern&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>uv run pytest tests/ -k &lt;span style="color:#e6db74">&amp;#34;lfbe&amp;#34;&lt;/span> -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="test-structure">Test Structure&lt;/h2>
&lt;div class="goat svg-container ">
&lt;svg
xmlns="http://www.w3.org/2000/svg"
font-family="Menlo,Lucida Console,monospace"
viewBox="0 0 560 137"
>
&lt;g transform='translate(8,16)'>
&lt;path d='M 32,24 L 40,24' fill='none' stroke='currentColor'>&lt;/path>
&lt;text text-anchor='middle' x='0' y='4' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='0' y='20' fill='currentColor' style='font-size:1em'>├&lt;/text>
&lt;text text-anchor='middle' x='0' y='36' fill='currentColor' style='font-size:1em'>├&lt;/text>
&lt;text text-anchor='middle' x='0' y='52' fill='currentColor' style='font-size:1em'>└&lt;/text>
&lt;text text-anchor='middle' x='0' y='84' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='0' y='100' fill='currentColor' style='font-size:1em'>├&lt;/text>
&lt;text text-anchor='middle' x='0' y='116' fill='currentColor' style='font-size:1em'>└&lt;/text>
&lt;text text-anchor='middle' x='8' y='4' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='8' y='20' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='8' y='36' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='8' y='52' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='8' y='84' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='8' y='100' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='8' y='116' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='16' y='4' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='16' y='20' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='16' y='36' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='16' y='52' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='16' y='84' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='16' y='100' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='16' y='116' fill='currentColor' style='font-size:1em'>─&lt;/text>
&lt;text text-anchor='middle' x='24' y='4' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='24' y='84' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='32' y='4' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='32' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='32' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='32' y='84' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='32' y='100' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='32' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='40' y='4' fill='currentColor' style='font-size:1em'>/&lt;/text>
&lt;text text-anchor='middle' x='40' y='20' fill='currentColor' style='font-size:1em'>_&lt;/text>
&lt;text text-anchor='middle' x='40' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='40' y='52' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='40' y='84' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='40' y='100' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='40' y='116' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='48' y='20' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='48' y='36' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='48' y='52' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='48' y='84' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='48' y='100' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='48' y='116' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='56' y='20' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='56' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='56' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='56' y='84' fill='currentColor' style='font-size:1em'>/&lt;/text>
&lt;text text-anchor='middle' x='56' y='100' fill='currentColor' style='font-size:1em'>_&lt;/text>
&lt;text text-anchor='middle' x='56' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='64' y='20' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='64' y='36' fill='currentColor' style='font-size:1em'>_&lt;/text>
&lt;text text-anchor='middle' x='64' y='52' fill='currentColor' style='font-size:1em'>_&lt;/text>
&lt;text text-anchor='middle' x='64' y='100' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='64' y='116' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='72' y='20' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='72' y='36' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='72' y='52' fill='currentColor' style='font-size:1em'>m&lt;/text>
&lt;text text-anchor='middle' x='72' y='100' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='72' y='116' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='80' y='20' fill='currentColor' style='font-size:1em'>_&lt;/text>
&lt;text text-anchor='middle' x='80' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='80' y='52' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='80' y='100' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='80' y='116' fill='currentColor' style='font-size:1em'>y&lt;/text>
&lt;text text-anchor='middle' x='88' y='20' fill='currentColor' style='font-size:1em'>_&lt;/text>
&lt;text text-anchor='middle' x='88' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='88' y='52' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='88' y='100' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='96' y='20' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='96' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='96' y='52' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='96' y='100' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='104' y='20' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='104' y='36' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='104' y='52' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='104' y='100' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='112' y='20' fill='currentColor' style='font-size:1em'>y&lt;/text>
&lt;text text-anchor='middle' x='112' y='36' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='112' y='52' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='112' y='100' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='120' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='120' y='52' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='120' y='100' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='128' y='36' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='128' y='52' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='136' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='136' y='52' fill='currentColor' style='font-size:1em'>y&lt;/text>
&lt;text text-anchor='middle' x='144' y='36' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='152' y='36' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='160' y='36' fill='currentColor' style='font-size:1em'>.&lt;/text>
&lt;text text-anchor='middle' x='168' y='36' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='176' y='36' fill='currentColor' style='font-size:1em'>y&lt;/text>
&lt;text text-anchor='middle' x='264' y='36' fill='currentColor' style='font-size:1em'>#&lt;/text>
&lt;text text-anchor='middle' x='264' y='52' fill='currentColor' style='font-size:1em'>#&lt;/text>
&lt;text text-anchor='middle' x='264' y='100' fill='currentColor' style='font-size:1em'>#&lt;/text>
&lt;text text-anchor='middle' x='264' y='116' fill='currentColor' style='font-size:1em'>#&lt;/text>
&lt;text text-anchor='middle' x='280' y='36' fill='currentColor' style='font-size:1em'>D&lt;/text>
&lt;text text-anchor='middle' x='280' y='52' fill='currentColor' style='font-size:1em'>M&lt;/text>
&lt;text text-anchor='middle' x='280' y='100' fill='currentColor' style='font-size:1em'>S&lt;/text>
&lt;text text-anchor='middle' x='280' y='116' fill='currentColor' style='font-size:1em'>P&lt;/text>
&lt;text text-anchor='middle' x='288' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='288' y='52' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='288' y='100' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='288' y='116' fill='currentColor' style='font-size:1em'>y&lt;/text>
&lt;text text-anchor='middle' x='296' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='296' y='52' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='296' y='100' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='296' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='304' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='304' y='52' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='304' y='100' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='304' y='116' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='312' y='52' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='312' y='100' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='312' y='116' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='320' y='36' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='320' y='116' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='328' y='36' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='328' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='328' y='100' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='336' y='36' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='336' y='52' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='336' y='100' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='336' y='116' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='344' y='36' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='344' y='52' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='344' y='100' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='344' y='116' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='352' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='352' y='52' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='352' y='100' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='352' y='116' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='360' y='36' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='360' y='52' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='360' y='100' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='360' y='116' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='368' y='100' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='368' y='116' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='376' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='376' y='116' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='384' y='36' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='384' y='100' fill='currentColor' style='font-size:1em'>f&lt;/text>
&lt;text text-anchor='middle' x='392' y='36' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='392' y='100' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='392' y='116' fill='currentColor' style='font-size:1em'>w&lt;/text>
&lt;text text-anchor='middle' x='400' y='36' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='400' y='100' fill='currentColor' style='font-size:1em'>r&lt;/text>
&lt;text text-anchor='middle' x='400' y='116' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='408' y='36' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='408' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='416' y='100' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='416' y='116' fill='currentColor' style='font-size:1em'>h&lt;/text>
&lt;text text-anchor='middle' x='424' y='100' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='432' y='100' fill='currentColor' style='font-size:1em'>c&lt;/text>
&lt;text text-anchor='middle' x='432' y='116' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='440' y='100' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='440' y='116' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='448' y='100' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='448' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='456' y='116' fill='currentColor' style='font-size:1em'>a&lt;/text>
&lt;text text-anchor='middle' x='464' y='100' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='464' y='116' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='472' y='100' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='472' y='116' fill='currentColor' style='font-size:1em'>l&lt;/text>
&lt;text text-anchor='middle' x='480' y='100' fill='currentColor' style='font-size:1em'>s&lt;/text>
&lt;text text-anchor='middle' x='480' y='116' fill='currentColor' style='font-size:1em'>e&lt;/text>
&lt;text text-anchor='middle' x='488' y='100' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='488' y='116' fill='currentColor' style='font-size:1em'>d&lt;/text>
&lt;text text-anchor='middle' x='496' y='100' fill='currentColor' style='font-size:1em'>i&lt;/text>
&lt;text text-anchor='middle' x='504' y='100' fill='currentColor' style='font-size:1em'>n&lt;/text>
&lt;text text-anchor='middle' x='504' y='116' fill='currentColor' style='font-size:1em'>o&lt;/text>
&lt;text text-anchor='middle' x='512' y='100' fill='currentColor' style='font-size:1em'>g&lt;/text>
&lt;text text-anchor='middle' x='512' y='116' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='520' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;text text-anchor='middle' x='528' y='116' fill='currentColor' style='font-size:1em'>p&lt;/text>
&lt;text text-anchor='middle' x='536' y='116' fill='currentColor' style='font-size:1em'>u&lt;/text>
&lt;text text-anchor='middle' x='544' y='116' fill='currentColor' style='font-size:1em'>t&lt;/text>
&lt;/g>
&lt;/svg>
&lt;/div>
&lt;h3 id="test-files">Test Files&lt;/h3>
&lt;h4 id="teststest_dataloaderspy">&lt;code>tests/test_dataloaders.py&lt;/code>&lt;/h4>
&lt;p>Tests for data loading and feature extraction:&lt;/p></description></item></channel></rss>