低比特率神经音频编解码器 + 残差矢量量化 —— 把连续音频转成离散 token 的工具包。
soniq 是一套面向音频语言模型的核心基础设施:用一个 SEANet 风格的卷积
编码器把波形压到低帧率隐层,用**残差矢量量化(RVQ)**把每一帧离散成若干
码本索引(token),再用对称的解码器还原回波形。整条管线纯 PyTorch 实现,
CPU 即可运行,WAV 读写只依赖标准库。
波形 ──SEANet编码器──▶ 隐层 [B, dim, F] ──RVQ──▶ token [B, Nq, F]
│
波形 ◀──SEANet解码器── 隐层 [B, dim, F] ◀──码本查表──┘
- 🎛 SEANet 编解码器:膨胀残差单元 + 步长卷积下采样,Snake 激活、权重归一化。
- 🧩 残差矢量量化:分解低维码本、L2 归一化余弦最近邻、直通估计、可变层数。
- 🪙 离散 token:
encode()直接给出[B, n_codebooks, frames]的整数 token,喂给音频 LM。 - 📉 可变比特率:训练期 quantizer dropout,推理期
n_quantizers一键换带宽。 - 🧮 比特率工具:帧率 / token 速率 / kbps 一行算清,码流可存
.npz。 - 🧰 零重型依赖:不需要 torchaudio / librosa,
torch + numpy + einops即可。 - 🖥 命令行:
soniq encode / decode / reconstruct / info / presets。
pip install soniq # 从 PyPI(发布后)
# 或从源码
git clone https://github.com/LX588387/soniq
cd soniq && pip install -e ".[dev]"import torch
from soniq import NeuralCodec
codec = NeuralCodec.from_preset("soniq-24khz-6kbps").eval()
wav = torch.randn(1, 1, 24000) # 1 秒 24kHz 单声道
codes = codec.encode(wav) # [1, 8, 75] —— 每秒 600 个 token
recon = codec.decode(codes, length=wav.shape[-1])
print(codes.shape, f"{codec.bitrate/1000:.1f} kbps")命令行:
soniq info --preset soniq-24khz-6kbps
soniq encode input.wav tokens.npz
soniq decode tokens.npz recon.wav
⚠️ 本仓库提供完整的模型结构与训练脚手架,但不随附训练好的权重(体积过大)。 直接用随机初始化的模型可以验证整条管线、张量形状与比特率换算;要得到高保真 重建,请参考examples/04_train_toy.py与docs/usage.md自行训练并用--checkpoint载入。
| 预设 | 采样率 | 码本 | 比特率 |
|---|---|---|---|
soniq-24khz-6kbps |
24 kHz | 8 × 1024 | 6.0 kbps |
soniq-24khz-3kbps |
24 kHz | 4 × 1024 | 3.0 kbps |
soniq-16khz-3kbps |
16 kHz | 6 × 1024 | 3.0 kbps |
MIT © Dai Yanan