高保真神经网络音频编解码器
项目描述
EnCodec:高保真神经网络音频压缩
这是在高保真神经网络音频压缩 [abs] 论文中提出的EnCodec神经网络编解码器的代码。我们提供了我们的两种多频带模型
- 一个在24 kHz频率下工作的因果模型,用于单声道音频,并在各种音频数据上进行了训练。
- 一个在48 kHz频率下工作的非因果模型,用于立体声音频,并在仅音乐数据上进行了训练。
24 kHz模型可以压缩到1.5、3、6、12或24 kbps,而48 kHz模型支持3、6、12和24 kbps。我们还为每个模型提供了一个预训练的语言模型,它可以进一步将表示压缩40%,而不会损失任何质量。
作为参考,我们还提供了我们新颖的MS-STFT判别器的代码。
示例
包括基线在内的示例在我们的示例页面上提供。您还可以通过点击缩略图快速演示EnCodec为我们实现的48 kHz音乐的成果,包括熵编码(原始曲目由Lucille Crew 和 Voyageur I 提供)。
发生了什么?
有关发布详情,请参阅变更日志。
安装
EnCodec需要Python 3.8,以及一个合理近期的PyTorch版本(理想情况下为1.11.0)。要安装EnCodec,可以从该仓库运行
pip install -U encodec # stable release
pip install -U git+https://git@github.com/facebookresearch/encodec#egg=encodec # bleeding edge
# of if you cloned the repo locally
pip install .
用法
然后,您可以使用EnCodec命令,要么作为
python3 -m encodec [...]
# or
encodec [...]
如果您想直接使用压缩API,请查看encodec.compress
和 encodec.model
。有关如何提取离散表示的说明,请参阅以下内容。
模型存储
首次使用时,模型将通过Torch Hub自动下载。有关模型存储位置的信息或如何自定义存储位置的信息,请查看相关文档。
压缩
encodec [-b TARGET_BANDWIDTH] [-f] [--hq] [--lm] INPUT_FILE [OUTPUT_FILE]
给定支持的平台上的任何torchaudio音频文件,使用EnCodec压缩到目标带宽(默认为6 kbps,可以是1.5、3、6、12或24)。OUTPUT_FILE必须以.ecdc
结尾。如果没有提供,则与INPUT_FILE
相同,将扩展名替换为.ecdc
。为了在立体声音频上使用48 kHz的模型,请使用--hq
标志。使用-f
标志强制覆盖现有输出文件。使用--lm
标志使用预训练的语言模型进行熵编码(预期它会慢得多)。
如果输入的采样率或通道数与模型不匹配,命令将自动重新采样/减少通道数。
解压缩
encodec [-f] [-r] ENCODEC_FILE [OUTPUT_WAV_FILE]
给定之前生成的.ecdc
文件,这将将其解码为指定的输出wav文件。如果没有提供,输出将默认为输入文件,并以.wav
扩展名。使用-f
文件强制覆盖输出文件(如果在压缩后解压缩,请注意不要覆盖原始文件!)。如果遇到削波,请使用-r
标志,这将调整输出文件以避免削波。
压缩 + 解压缩
encodec [-r] [-b TARGET_BANDWIDTH] [-f] [--hq] [--lm] INPUT_FILE OUTPUT_WAV_FILE
当OUTPUT_WAV_FILE
具有.wav
扩展名(而不是.ecdc
)时,encodec
命令将压缩并立即解压缩,而不存储中间的.ecdc
文件。
提取离散表示
EnCodec模型还可以用于从音频波形中提取离散表示。
from encodec import EncodecModel
from encodec.utils import convert_audio
import torchaudio
import torch
# Instantiate a pretrained EnCodec model
model = EncodecModel.encodec_model_24khz()
model.set_target_bandwidth(6.0)
# Load and pre-process the audio waveform
wav, sr = torchaudio.load("<PATH_TO_AUDIO_FILE>")
wav = wav.unsqueeze(0)
wav = convert_audio(wav, sr, model.sample_rate, model.channels)
# Extract discrete codes from EnCodec
encoded_frames = model.encode(wav)
codes = torch.cat([encoded[0] for encoded in encoded_frames], dim=-1) # [B, n_q, T]
请注意,48 kHz模型以1秒的块处理音频,重叠1%,并将音频重新归一化以具有单位刻度。对于此模型,model.encode(wav)
的输出将是一个列表(对于每1秒的帧),其中包含一个元组(codes, scale)
,其中scale
是一个标量张量。
开发安装
这将安装依赖项和在开发者模式下安装encodec
(文件更改将直接反映),以及运行单元测试的依赖项。
pip install -e '.[dev]'
测试
您可以使用以下命令运行单元测试:
make tests
引用
如果您在论文中使用此代码或结果,请引用我们的工作如下:
@article{defossez2022highfi,
title={High Fidelity Neural Audio Compression},
author={Défossez, Alexandre and Copet, Jade and Synnaeve, Gabriel and Adi, Yossi},
journal={arXiv preprint arXiv:2210.13438},
year={2022}
}
许可
此存储库在LICENSE文件中找到的CC-BY-NC 4.0许可下发布。