FRCRN_SE_16K for Tenstorrent Tensix (BF16)
tenstorrent · tensix · ttnn · speech-enhancement · noise-suppression · frcrn · bfloat16 · safetensors
FRCRN_SE_16K with complex convolution weights written as real block matrices, batch normalization folded into the convolutions, and weights stored in bf16. The tensor layout is suitable for TT-NN implementations. No additional training.
The stored weight tensors occupy about 0.05 GB before TT-NN packing; allow additional device memory for packing and working buffers.
Formats
model.safetensors contains the two UNets' real tensors. Every stored tensor is bf16.
config.json records each convolution's stride and padding and each FSMN memory's axis and order.
| Tensor | Layout |
|---|---|
| Encoder convolution | [output, input, kernel frequency, kernel time] |
| Transposed decoder convolution | [input, output, kernel frequency, kernel time] |
| FSMN linear projection | [output, input, 1, 1] |
| Complex channels | real channels followed by imaginary channels |
A complex convolution uses the real block matrix [[Wr, -Wi], [Wi, Wr]]. The following batch
normalization is folded into its output channels. Decoder skip-input channels follow the order
recorded in config.json. Tensor names begin with u1 or u2, followed by the module name.
The input is a normalized complex spectrum [1, 2, 321, 51] for 16 kHz audio, a 640-point FFT and
320-sample hop. The output is the complex mask tanh(u1) + tanh(u2) in the same real/imaginary layout.
The consuming implementation supplies framing, normalization, mask application and synthesis.
Use
Read one tensor with safetensors:
from safetensors import safe_open
with safe_open("model.safetensors", framework="pt", device="cpu") as f:
weight = f.get_tensor("u1.enc.0.weight")
Reproduce the conversion with the original checkpoint and the frcrn_se source package from
ClearerVoice-Studio / clearvoice 0.1.2:
python convert_frcrn.py last_best_checkpoint.pt output \
--source-dir ClearerVoice-Studio/clearvoice/clearvoice/models/frcrn_se \
--revision 3766e6a64b0d8cb58f08d913d617bf129f11ed53
Conversion needs torch, numpy and safetensors. The script also runs a deterministic CPU comparison
against the original model on eight synthetic spectra. --validation-npz accepts an optional private
set of normalized spectra; input data is never copied into the output directory.
Checks
The source checkpoint matches the original repository at
3766e6a64b0d8cb58f08d913d617bf129f11ed53,
SHA256 b22256adbb91b68cf5a3db8f6657a4fb17066eecd5f069803e59c186c1cf3ebb.
CPU comparisons use float32 operations. The bf16 rows reload the actual serialized weights into
float32 modules, isolating weight-conversion error from arithmetic precision. Each set contains
eight windows of 51 frames. SNR is 10 log10(sum(reference²) / sum(error²)).
| Set | Float32 transformation, mask SNR | Stored bf16, mask SNR | Stored bf16, enhanced-spectrum SNR |
|---|---|---|---|
| Held-out normalized spectra | 77.97 dB | 27.87 dB | 39.12 dB |
| Synthetic spectra, seed 20261112 | 96.55 dB | 17.46 dB | 17.66 dB |
equivalence.json contains the measurements. Synthetic spectra are independent random values and
are not an audio-quality benchmark. The held-out data is not distributed. These checks measure
agreement with the original CPU model; they do not measure task quality or device speed.
License
Apache-2.0. The original checkpoint card declares Apache-2.0 and has no LICENSE file; LICENSE
contains the canonical agreement. NOTICE identifies the original repository, revision and changes.
convert_frcrn.py is by Xylolabs under Apache-2.0. Not affiliated with or endorsed by Tenstorrent.
Citation
The base model's card has no citation entry. Cite alibabasglab/FRCRN_SE_16K.