MeanFlowTSE / README.md
nmj21c's picture
Upload folder using huggingface_hub
6e75267 verified
|
Raw
History Blame Contribute Delete
5.29 kB
---
license: apache-2.0
tags:
- target-speaker-extraction
- speech-enhancement
- audio-processing
- onnx
- onnxruntime
- flow-matching
- udit
- t-predictor
---
# ONNX Target Speaker Extraction (TSE) Models
This repository contains the ONNX-optimized versions of **MeanFlowTSE (UDiT)** and **T-Predictor** models used in the Target Speaker Extraction (TSE) application. The models are exported from PyTorch Lightning checkpoints and optimized for GPU (CUDA) and CPU deployment using ONNX Runtime.
---
## 1. Model Summary & Purpose
These models work cooperatively to extract a target speaker's voice from a noisy mixture audio:
1. **T-Predictor** (62.3 MB PyTorch -> 31.8 MB FP16 ONNX): Estimates the flow matching scaling factor ($\alpha$) by analyzing the reference target speaker voice and the mixed audio.
2. **MeanFlowTSE (UDiT)** (1.37 GB PyTorch -> 688 MB FP16 ONNX): A large Diffusion-based velocity predictor model that iteratively reconstructs clean audio features under the guide of the predicted $\alpha$.
---
## 2. File Specifications & Download List
* **Float32 Models** (Best compatibility & fidelity):
* `meanflow_tse_fp32.onnx` (1375.6 MB)
* `t_predictor_fp32.onnx` (63.4 MB)
* **Float16 Models** (Highly recommended for GPU):
* `meanflow_tse_fp16.onnx` (688.2 MB)
* `t_predictor_fp16.onnx` (31.8 MB)
* **Int8 Quantized Models** (Highly optimized for CPU):
* `meanflow_tse_int8.onnx` (345.8 MB)
* `t_predictor_int8.onnx` (16.4 MB)
All evaluation-related source audio waveforms and reconstructed samples are available under the `evaluation_wavs/` directory.
---
## 3. Evaluation & Performance Benchmarks
The benchmarks below were measured on an **NVIDIA GeForce GPU** with CUDA 12.1 and `onnxruntime-gpu` enabled. Numbers are averaged across 8 standard evaluation audio sets (combinations of target voices `ref-voice1` to `ref-voice4` and noisy mixtures `mixed_noise` and `mixed_raw`).
| Model Format | Load Status | Avg Latency (ms) | Avg WAV MAE | Size Saving | Notes & Recommendations |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **PyTorch (Baseline)** | **Success** | `761.1 ms` | *Baseline* | 0% (1.43 GB) | PyTorch lightning codebase dependency |
| **ONNX FP32** | **Success** | **`692.8 ms`** | **`2.71e-05`** | 0% (1.43 GB) | **10% faster** than PyTorch, mathematically equivalent |
| **ONNX FP16** | **Success** | **`676.3 ms`** | **`9.91e-03`** | **50% saving** | **Best for GPU**. Under 1% WAV difference, no audible noise |
| **ONNX INT8** | **Success** | `6716.1 ms` | `2.62e-02` | **75% saving** | **Best for CPU** (AVX512/AMX). High latency on GPU due to CPU emulations |
* **WAV MAE**: The Mean Absolute Error (MAE) calculated between PyTorch output waveforms and ONNX-reconstructed waveforms (range -1.0 to 1.0).
* **FP16 Quality**: FP16 achieves an error rate under 1.0% compared to Float32, preserving high fidelity without introducing audible quantization noise, unlike INT8.
---
## 4. Key Fixes & Design Decisions
### Timestep Embedder Type Mismatch Resolution
During direct FP16 export, PyTorch's sinusoidal embedding inside `TimestepEmbedder` (`udit_meanflow.py`) hardcoded a `.float()` casting, leading to a type mismatch error when multiplied by float16 weights. We modified this behavior to dynamically cast the embeddings to match the MLP's weight precision:
```python
# Fixed code inside udit_meanflow.py
t_freq = self.timestep_embedding(t, self.frequency_embedding_size)
t_freq = t_freq.to(self.mlp[0].weight.dtype) # Dynamic precision casting
t_emb = self.mlp(t_freq)
```
This fix enables native FP16 execution in ONNX Runtime without loading issues.
---
## 5. How to Load and Run (Python Example)
To run the models with CUDA acceleration:
```python
import onnxruntime as ort
import numpy as np
# Select CUDA Execution Provider
providers = [('CUDAExecutionProvider', {'device_id': 0}), 'CPUExecutionProvider']
# Load FP16 sessions
tp_session = ort.InferenceSession("t_predictor_fp16.onnx", providers=providers)
udit_session = ort.InferenceSession("meanflow_tse_fp16.onnx", providers=providers)
# Example: T-Predictor Inference
# Inputs: mixture (Batch, Time_Steps), enrollment (Batch, Time_Steps)
mixture_data = np.random.randn(1, 48000).astype(np.float16) # Use float16 for FP16 models
enroll_data = np.random.randn(1, 48000).astype(np.float16)
tp_inputs = {"mixture": mixture_data, "enrollment": enroll_data}
tp_outputs = tp_session.run(None, tp_inputs)
alpha = tp_outputs[0]
print("Predicted Alpha:", alpha)
```
---
## 6. Original Sources & Checkpoints
* **Original Codebase**: MeanFlowTSE uses Diffusion-based Velocity Predictor architectures derived from DiT (Diffusion Transformers) and GLIDE concepts.
* UDiT Module reference: [GLIDE Text2Im](https://github.com/openai/glide-text2im)
* **Checkpoint Origin**: The weights exported into these ONNX models were trained on clean-speech TSE datasets and extracted from the following local training checkpoints:
* MeanFlowTSE (UDiT) baseline: `backend/exp/best-clean-weights.ckpt`
* T-Predictor baseline: `backend/exp/t-predictor-clean-weights.ckpt`
---
## 7. License
This repository is licensed under the Apache License 2.0. Feel free to use, modify, and distribute these models in your projects. Refer to the `LICENSE` file for details.