audiolm-pytorch

audiolm-pytorch

基于Pytorch的音频生成模型AudioLM

AudioLM是一个基于Pytorch的音频生成模型,具有T5引导的文本到音频转换功能。该项目还兼容SoundStream和Facebook的EnCodec,并提供了多个音频编码和解码模块。用户可以通过完整的训练和使用流程,包括SoundStream、分层Transformer和基于文本条件的音频合成,来进行音频生成技术的研究和开发。

AudioLM音频生成PytorchSoundStreamEnCodecGithub开源项目

<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/5e016582-c7b0-466e-bd5e-e65d10ea5189.png" width="600px"></img>

AudioLM - Pytorch

实现 <a href="https://google-research.github.io/seanet/audiolm/examples/">AudioLM</a>,一种基于语言建模的方法,用于 Google Research 的音频生成,用 Pytorch 实现。

它还扩展了使用 T5 模型进行分类器自由引导的条件化工作。这允许进行文本到音频或 TTS,在原始论文中并未提供。是的,这意味着 <a href="https://valle-demo.github.io/">VALL-E</a> 可以通过这个仓库进行训练。本质上是一样的。

如果您有兴趣在开放环境中复制这项工作,请加入 <a href="https://discord.gg/xBPBXfcFHd"><img alt="Join us on Discord" src="https://yellow-cdn.veclightyear.com/35dd4d3f/e638488d-85b2-401e-9f7c-4300f0371d5a.png"></a>

该仓库现在还包含了 <a href="https://arxiv.org/abs/2107.03312">SoundStream</a> 的 MIT 许可版本。它还兼容 <a href="https://github.com/facebookresearch/encodec">EnCodec</a>,其在撰写本文时也是 MIT-许可 的。

更新:AudioLM 基本上被用来解决新的 <a href="https://github.com/lucidrains/musiclm-pytorch">MusicLM</a> 中的音乐生成问题。

将来,<a href="https://www.youtube.com/watch?v=olNvmUCmY8o">这段电影剪辑</a>将不再有任何意义。您只需提示 AI 即可。

感谢

  • <a href="https://stability.ai/">Stability.ai</a> 赞助我们开展并开源前沿的人工智能研究。

  • <a href="https://huggingface.co/">🤗 Huggingface</a> 提供了出色的 accelerate 和 transformers 库。

  • <a href="https://ai.facebook.com/">MetaAI</a> 提供了 <a href="https://github.com/facebookresearch/fairseq">Fairseq</a> 和宽松的许可证。

  • <a href="https://github.com/eonglints">@eonglints</a><a href="https://github.com/turian">Joseph</a> 提供了他们的专业建议和专业知识以及提交的拉取请求!

  • <a href="https://github.com/djqualia">@djqualia</a><a href="https://github.com/yigityu">@yigityu</a><a href="https://github.com/inspirit">@inspirit</a><a href="https://github.com/BlackFox1197">@BlackFox1197</a> 帮助调试了 soundstream。

  • <a href="https://github.com/zhvng">Allen</a><a href="https://github.com/LWprogramming">LWprogramming</a> 审核代码并提交了修复错误。

  • <a href="https://github.com/ilya16">Ilya</a> 发现了多尺度判别器下采样的问题,并改进了 soundstream 训练。

  • <a href="https://github.com/AndreyBocharnikov">Andrey</a> 发现 soundstream 中缺少的损失,并指导我正确的 mel 频谱超参数设置。

  • <a href="https://github.com/alexdemartos">Alejandro</a><a href="https://github.com/ilya16">Ilya</a> 分享了他们的 soundstream 训练结果,并解决了局部注意力位置嵌入的一些问题。

  • <a href="https://github.com/LWprogramming">LWprogramming</a> 添加了 Encodec 兼容性!

  • <a href="https://github.com/LWprogramming">LWprogramming</a> 发现采样 FineTransformer 时处理 EOS 令牌的问题。

  • <a href="https://github.com/YoungloLee">@YoungloLee</a> 发现了 soundstream 中与填充不考虑步长有关的一维因果卷积的大错误。

  • <a href="https://github.com/haydenshively">Hayden</a> 指出 Soundstream 多尺度判别器的一些差异。

安装

$ pip install audiolm-pytorch

用法

SoundStream 和 Encodec

有两种选择神经编解码器。如果您想使用预训练的 24kHz Encodec,只需创建如下的 Encodec 对象:

from audiolm_pytorch import EncodecWrapper encodec = EncodecWrapper() # 现在您可以像使用下面的 soundstream 变量一样使用 encodec 变量。

否则,为了更忠实于原始论文,您可以使用 SoundStream。首先,SoundStream 需要在大量音频数据上进行训练:

from audiolm_pytorch import SoundStream, SoundStreamTrainer soundstream = SoundStream( codebook_size = 4096, rq_num_quantizers = 8, rq_groups = 2, # 本文提出使用多头残差矢量量化 - https://arxiv.org/abs/2305.02765 use_lookup_free_quantizer = True, # 是否使用残差查找自由量化 - 现在有报告称成功使用了这一未发表的技术 use_finite_scalar_quantizer = False, # 是否使用残差有限标量量化 attn_window_size = 128, # 在瓶颈处的本地注意力感受野 attn_depth = 2 # 2 个本地注意力变压器块 - soundstream 作者不是注意力的专家,因此我添加了一些。encodec 使用 lstms,但注意力应该更好 ) trainer = SoundStreamTrainer( soundstream, folder = '/path/to/audio/files', batch_size = 4, grad_accum_every = 8, # 有效批量大小为 32 data_max_length_seconds = 2, # 训练2秒的音频 num_train_steps = 1_000_000 ).cuda() trainer.train() # 经过大量训练后,您可以如下测试自动编码 soundstream.eval() # 您的 soundstream 必须处于 eval 模式,以避免训练所需的残差 VQ 的残差 dropout audio = torch.randn(10080).cuda() recons = soundstream(audio, return_recons_only = True) # (1, 10080) - 1 频道

您的训练 SoundStream 可以用作通用音频分词器。

audio = torch.randn(1, 512 * 320) codes = soundstream.tokenize(audio) # 现在您可以使用代码本标识符训练任何东西 recon_audio_from_codes = soundstream.decode_from_codebook_indices(codes) # 校验 assert torch.allclose( recon_audio_from_codes, soundstream(audio, return_recons_only = True) )

您还可以通过分别导入 AudioLMSoundStreamMusicLMSoundStream 来使用特定于 AudioLMMusicLM 的 soundstream。

from audiolm_pytorch import AudioLMSoundStream, MusicLMSoundStream soundstream = AudioLMSoundStream(...) # 假设您想要 Audio LM 论文中的超参数 # 其余部分与上述相同

0.17.0 版本起,您现在可以在 SoundStream 上调用类方法,从 checkpoint 文件加载,而无需记住您的配置。

from audiolm_pytorch import SoundStream soundstream = SoundStream.init_and_load_from('./path/to/checkpoint.pt')

要使用 <a href="https://wandb.ai">Weights & Biases</a> 跟踪,首先在 SoundStreamTrainer 上设置 use_wandb_tracking = True,然后执行以下操作:

trainer = SoundStreamTrainer( soundstream, ..., use_wandb_tracking = True ) # 上下文管理器包装 .train(),指定项目和跑步名称 with trainer.wandb_tracker(project = 'soundstream', run = 'baseline'): trainer.train()

分层变压器

然后需要训练三个单独的变压器(SemanticTransformerCoarseTransformerFineTransformer)。

例如:SemanticTransformer

import torch from audiolm_pytorch import HubertWithKmeans, SemanticTransformer, SemanticTransformerTrainer # hubert checkpoints 可在以下位置下载: # https://github.com/facebookresearch/fairseq/tree/main/examples/hubert wav2vec = HubertWithKmeans( checkpoint_path = './hubert/hubert_base_ls960.pt', kmeans_path = './hubert/hubert_base_ls960_L9_km500.bin' ) semantic_transformer = SemanticTransformer( num_semantic_tokens = wav2vec.codebook_size, dim = 1024, depth = 6, flash_attn = True ).cuda() trainer = SemanticTransformerTrainer( transformer = semantic_transformer, wav2vec = wav2vec, folder ='/path/to/audio/files', batch_size = 1, data_max_length = 320 * 32, num_train_steps = 1 ) trainer.train()

例如:CoarseTransformer

import torch from audiolm_pytorch import HubertWithKmeans, SoundStream, CoarseTransformer, CoarseTransformerTrainer wav2vec = HubertWithKmeans( checkpoint_path = './hubert/hubert_base_ls960.pt', kmeans_path = './hubert/hubert_base_ls960_L9_km500.bin' ) soundstream = SoundStream.init_and_load_from('/path/to/trained/soundstream.pt') coarse_transformer = CoarseTransformer( num_semantic_tokens = wav2vec.codebook_size, codebook_size = 1024, num_coarse_quantizers = 3, dim = 512, depth = 6, flash_attn = True ) trainer = CoarseTransformerTrainer( transformer = coarse_transformer, codec = soundstream, wav2vec = wav2vec, folder = '/path/to/audio/files', batch_size = 1, data_max_length = 320 * 32, num_train_steps = 1_000_000 ) trainer.train()

例如:FineTransformer

import torch from audiolm_pytorch import SoundStream, FineTransformer, FineTransformerTrainer soundstream = SoundStream.init_and_load_from('/path/to/trained/soundstream.pt') fine_transformer = FineTransformer( num_coarse_quantizers = 3, num_fine_quantizers = 5, codebook_size = 1024, dim = 512, depth = 6, flash_attn = True ) trainer = FineTransformerTrainer( transformer = fine_transformer, codec = soundstream, folder = '/path/to/audio/files', batch_size = 1, data_max_length = 320 * 32, num_train_steps = 1_000_000 ) trainer.train()

现在合在一起

from audiolm_pytorch import AudioLM audiolm = AudioLM( wav2vec = wav2vec, codec = soundstream, semantic_transformer = semantic_transformer, coarse_transformer = coarse_transformer, fine_transformer = fine_transformer ) generated_wav = audiolm(batch_size = 1) # 或带提示生成 generated_wav_with_prime = audiolm(prime_wave = torch.randn(1, 320 * 8)) # 或有文本条件时 generated_wav_with_text_condition = audiolm(text = ['鸟鸣和远处钟声的回声'])

文本条件的音频合成

更新:看起来这是可行的,参见 <a href="https://valle-demo.github.io/">'VALL-E'</a>

例如:语义变压器

import torch from audiolm_pytorch import HubertWithKmeans, SemanticTransformer, SemanticTransformerTrainer wav2vec = HubertWithKmeans( checkpoint_path = './hubert/hubert_base_ls960.pt', kmeans_path = './hubert/hubert_base_ls960_L9_km500.bin' ) semantic_transformer = SemanticTransformer( num_semantic_tokens = 500, dim = 1024, depth = 6, has_condition = True, # 这必须设置为 True cond_as_self_attn_prefix = True # 是否将条件作为自注意力前缀,而不是交叉注意力,正如'VALL-E'论文中所述 ).cuda() # 模拟文本音频数据集(作为示例) # 您将需要从 `Dataset` 扩展自己的数据集,并返回音频张量以及字符串(音频描述),任何顺序(框架将自动检测并路由到变压器中) from torch.utils.data import Dataset class MockTextAudioDataset(Dataset): def __init__(self, length = 100, audio_length = 320 * 32): super().__init__() self.audio_length = audio_length self.len = length def __len__(self): return self.len def __getitem__(self, idx): mock_audio = torch.randn(self.audio_length) mock_caption = 'audio caption' return mock_caption, mock_audio dataset = MockTextAudioDataset() # 实例化语义变压器训练器并训练 trainer = SemanticTransformerTrainer( transformer = semantic_transformer, wav2vec = wav2vec, dataset = dataset, batch_size = 4, grad_accum_every = 8, data_max_length = 320 * 32, num_train_steps = 1_000_000 ) trainer.train() # 经过大量训练后 sample = trainer.generate(text = ['屋顶上雨滴的声音'], batch_size = 1, max_length = 2) # (1, < 128) - 如果检测到 [eos] 可能会提前终止

多 GPU

由于所有的训练器类都使用了 <a href="https://huggingface.co/docs/accelerate/accelerator">🤗 Accelerator</a>,您可以轻松地使用 accelerate 命令进行多 GPU 训练。

在项目根目录

$ accelerate config

然后,在相同目录中

$ accelerate launch train.py

待办事项

  • 完成 CoarseTransformer

  • 使用 fairseq vq-wav2vec 进行嵌入

  • 添加条件化

  • 添加分类器自由引导

  • 添加唯一连续

  • 包含使用 hubert 中间特征作为语义标记的能力,<a href="https://github.com/lucidrains/audiolm-pytorch/discussions/13">eonglints</a> 推荐。

  • 适应变长音频,引入 eos 令牌。

  • 确保唯一连续可以与粗略变压器一起工作。

  • 日志中打印所有判别器损失。

  • 生成语义 Tokens 时,确保最后的 logits 不一定是序列中的最后一个,因为有唯一连续处理。

  • 完成 Coarse 和 Fine 变压器的采样代码,这将很棘手。

  • 确保带或不带提示的 AudioLM 类全推理工作。

  • 完成 soundstream 的完整训练代码,照顾判别器训练。

  • 为 soundstream 的判别器添加高效梯度惩罚。

  • 连接音频数据集的采样 Hz -> 变压器,并在训练期间适当重采样 - 考虑是否允许数据集具有不同的音频文件或强制相同的采样 Hz。

  • 所有三个变压器的完整训练代码。

  • 重新架构,使语义变压器具有一个处理唯一连续、wav to hubert 或 vq-wav2vec 的包装器。

  • 在提示端(语义针对粗略变压器,粗略针对细化变压器)不自注意 eos 令牌。

  • 从忘记因果遮蔽中添加结构化 Dropout,比传统 Dropout 更好。

  • 找出如何抑制 fairseq 的日志记录。

  • 确保传递到 audiolm 的所有三个变压器是兼容的。

  • 允许在粗略和细化之间的量化器的匹配位置基础上,在细化变压器中进行专门的相对位置嵌入。

  • 在 soundstream 中允许分组残差 vq(使用 GroupedResidualVQ 从 vector-quantize-pytorch 库),来自 <a href="https://arxiv.org/abs/2305.02765">hifi-codec</a>

  • 使用 <a href="https://arxiv.org/abs/2305.19466">NoPE</a> 添加闪电注意力。

  • 接受 AudioLM 中 prime wave 的路径作为音频文件,并在语义与声学之间自动重采样。

  • 为所有变压器添加键/值缓存,加快推理速度。

  • 设计一个分层的粗略和细化变压器。

  • 调查 <a href="https://openreview.net/forum?id=H-VlwsYvVi">spec decoding</a>,首先在 x-transformers 中测试,如果适用再移植过来。

  • 在存在组的残差 vq 时重做位置嵌入。

@misc{https://doi.org/10.48550/arxiv.2107.03312, title = {SoundStream: An End-to-End Neural Audio Codec}, author = {Zeghidour, Neil and Luebs, Alejandro and Omran, Ahmed and Skoglund, Jan and Tagliasacchi, Marco}, publisher = {arXiv}, url = {https://arxiv.org/abs/2107.03312}, year = {2021} }
@misc{shazeer2020glu, title = {GLU Variants Improve Transformer}, author = {Noam Shazeer}, year = {2020}, url = {https://arxiv.org/abs/2002.05202} }
@article{Shazeer2019FastTD, title = {Fast Transformer Decoding: One Write-Head is All You Need}, author = {Noam M. Shazeer}, journal = {ArXiv}, year = {2019}, volume = {abs/1911.02150} }
@article{Ho2022ClassifierFreeDG, title = {Classifier-Free Diffusion Guidance}, author = {Jonathan Ho}, journal = {ArXiv}, year = {2022}, volume = {abs/2207.12598} }
@misc{crowson2022, author = {Katherine Crowson}, url = {https://twitter.com/rivershavewings} }
@misc{ding2021cogview, title = {CogView: Mastering Text-to-Image Generation via Transformers}, author = {Ming Ding and Zhuoyi Yang and Wenyi Hong and Wendi Zheng and Chang Zhou and Da Yin and Junyang Lin and Xu Zou and Zhou Shao and Hongxia Yang and Jie Tang}, year = {2021}, eprint = {2105.13290}, archivePrefix = {arXiv}, primaryClass = {cs.CV} }
@article{Liu2022FCMFC, title = {FCM: Forgetful Causal Masking Makes Causal Language Models Better Zero-Shot Learners}, author = {Hao Liu and Xinyang Geng and Lisa Lee and Igor Mordatch and Sergey Levine and Sharan Narang and P. Abbeel}, journal = {ArXiv}, year = {2022}, volume = {abs/2210.13432} }
@inproceedings{anonymous2022normformer, title = {NormFormer: Improved Transformer Pretraining with Extra Normalization}, author = {Anonymous}, booktitle = {Submitted to The Tenth International Conference on Learning Representations }, year = {2022}, url = {https://openreview.net/forum?id=GMYWzWztDx5}, note = {under review} }
@misc{liu2021swin, title = {Swin Transformer V2: Scaling Up Capacity and Resolution}, author = {Ze Liu and Han Hu and Yutong Lin and Zhuliang Yao and Zhenda Xie and Yixuan Wei and Jia Ning and Yue Cao and Zheng Zhang and Li Dong and Furu Wei and Baining Guo}, year = {2021}, eprint = {2111.09883}, archivePrefix = {arXiv}, primaryClass = {cs.CV} }
@article{Li2021LocalViTBL, title = {LocalViT: Bringing Locality to Vision Transformers}, author = {Yawei Li and K. Zhang and Jie Cao and Radu Timofte and Luc Van Gool}, journal = {ArXiv}, year = {2021}, volume = {abs/2104.05707} }
@article{Defossez2022HighFN, title = {High Fidelity Neural Audio Compression}, author = {Alexandre D'efossez and Jade Copet and Gabriel Synnaeve and Yossi Adi}, journal = {ArXiv}, year = {2022}, volume = {abs/2210.13438} }
@article{Hu2017SqueezeandExcitationN, title = {Squeeze-and-Excitation Networks}, author = {Jie Hu and Li Shen and Gang Sun}, journal = {2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition}, year = {2017}, pages = {7132-7141} }
@inproceedings{Yang2023HiFiCodecGV, title = {HiFi-Codec: Group-residual Vector quantization for High Fidelity Audio Codec}, author = {Dongchao Yang and Songxiang Liu and Rongjie Huang and Jinchuan Tian and Chao Weng and Yuexian Zou}, year = {2023} }
@article{Kazemnejad2023TheIO, title = {The Impact of Positional Encoding on Length Generalization in Transformers}, author = {Amirhossein Kazemnejad and Inkit Padhi and Karthikeyan Natesan Ramamurthy and Payel Das and Siva Reddy}, journal = {ArXiv}, year = {2023}, volume = {abs/2305.19466} }
@inproceedings{dao2022flashattention, title = {Flash{A}ttention: Fast and Memory-Efficient Exact Attention with {IO}-Awareness}, author = {Dao, Tri and Fu, Daniel Y. and Ermon, Stefano and Rudra, Atri and R{\'e}, Christopher}, booktitle = {Advances in Neural Information Processing Systems}, year = {2022} }
@misc{yu2023language, title = {Language Model Beats Diffusion -- Tokenizer is Key to Visual Generation}, author = {Lijun Yu and José Lezama and Nitesh B. Gundavarapu and Luca Versari and Kihyuk Sohn and David Minnen and Yong Cheng and Agrim Gupta and Xiuye Gu and Alexander G. Hauptmann and Boqing Gong and Ming-Hsuan Yang and Irfan Essa and David A. Ross and Lu Jiang}, year = {2023}, eprint = {2310.05737}, archivePrefix = {arXiv}, primaryClass = {cs.CV} }
@inproceedings{Katsch2023GateLoopFD, title = {GateLoop: Fully Data-Controlled Linear Recurrence for Sequence Modeling}, author = {Tobias Katsch}, year = {2023}, url = {https://api.semanticscholar.org/CorpusID:265018962} }

编辑推荐精选

博思AIPPT

博思AIPPT

AI一键生成PPT,就用博思AIPPT!

博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。

AI办公办公工具AI工具博思AIPPTAI生成PPT智能排版海量精品模板AI创作热门
潮际好麦

潮际好麦

AI赋能电商视觉革命,一站式智能商拍平台

潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。

iTerms

iTerms

企业专属的AI法律顾问

iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。

SimilarWeb流量提升

SimilarWeb流量提升

稳定高效的流量提升解决方案,助力品牌曝光

稳定高效的流量提升解决方案,助力品牌曝光

Sora2视频免费生成

Sora2视频免费生成

最新版Sora2模型免费使用,一键生成无水印视频

最新版Sora2模型免费使用,一键生成无水印视频

Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
商汤小浣熊

商汤小浣熊

最强AI数据分析助手

小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。

imini AI

imini AI

像人一样思考的AI智能体

imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。

下拉加载更多