尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

使用 Candle 运行 EnCodec 音频神经编解码器:从 Token 到 WAV 的完整实战指南

使用 Candle 运行 EnCodec 音频神经编解码器:从 Token 到 WAV 的完整实战指南 人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载导读EnCodec 是一种基于编码器/解码器架构与残差向量量化Residual Vector Quantization, RVQ的高质量音频压缩模型能够将 24kHz 单声道音频编码为离散 Token 序列并从中高质量地重建音频。本文基于当前仓库中candle-examples/examples/encodec/下的示例讲解如何在 Candle 中完成 EnCodec 的三种典型操作code-to-audioToken 解码为音频、audio-to-audio音频压缩-重建、以及audio-to-code音频编码为 Token。读完本文你将掌握 EnCodec 示例的完整命令行用法、底层模型结构编码器、解码器、残差向量量化器以及源码级的实现细节。EnCodec 示例概述EnCodec 由 Meta 提出对应论文 High Fidelity Neural Audio Compression详见 模型实现头部注释其核心思想是用一个卷积编码器将 PCM 波形压缩为低维隐表示再用多级残差向量量化器将其离散化为若干层 Tokencodebook 索引解码器再根据这些 Token 重建出近似原始波形的音频。由于 Token 序列天然是离散的、可无损传输的因此 EnCodec 常被用作语音、音乐生成模型的音频表征层。当前仓库中的实现分布在三个层次模型实现candle-transformers/src/models/encodec.rs提供Config、Model内含Encoder、Decoder、ResidualVectorQuantizer等核心组件示例入口candle-examples/examples/encodec/main.rs基于 clap 解析子命令与参数负责模型加载与三种动作的调度音频 I/O 工具candle-examples/examples/encodec/audio_io.rs封装录音、放音、解码音频文件与重采样等底层能力。示例使用的模型权重为facebook/encodec_24khz24kHz 版本的官方权重权重文件为model.safetensors。环境准备与编译启用encodecfeature该示例依赖cpal音频设备输入输出、symphonia音频文件解码与rubato重采样这些依赖通过 candle-examples 的encodecfeature 统一开启。在 candle-examples/Cargo.toml 中可以看到encodec [cpal, symphonia, rubato]同时 candle-examples/Cargo.toml 中将该示例注册为encodec[[example]] name encodec required-features [encodec]因此编译示例时必须显式带上--features encodec否则会因缺少依赖无法编译。后端依赖与 Candle 其他示例一致main.rs 开头会按需引入intel_mkl_srcmklfeature或accelerate_srcacceleratefeature作为线性代数加速后端二者择一均未启用时回退到 Candle 自带的 CPU 后端。在装有 NVIDIA GPU 的环境下也可以不加任何 CPU 加速 feature让candle_examples::device(false)自动选择 CUDA 设备见下文设备选择说明。三种核心操作详解1. code-to-audioToken 解码为音频这是 README 中最直接的示例读取 safetensors 格式的 EnCodec Token 文件重建出 WAV 音频。cargo run --example encodec --features encodec --release -- code-to-audio \ candle-examples/examples/encodec/jfk-codes.safetensors \ jfk.wav命令拆解cargo run --example encodec运行encodec示例--features encodec启用音频依赖 feature必需--release以发布模式编译运行推理性能更佳code-to-audio指定动作第一个位置参数为输入文件jfk-codes.safetensors仓库中已随示例附带的 EnCodec Token 文件第二个位置参数为输出文件jfk.wav。该命令会解码jfk-codes.safetensors中存储的 EnCodec Token并生成包含音频数据的输出 WAV 文件。命令行结束时终端会打印codes shape: ...与output pcm shape: ...两条形状信息便于确认 Token 与重建 PCM 的维度。从 main.rs 的源码可以看到code-to-audio分支直接用candle::safetensors::load加载输入文件并取出其中键名为codes的张量Action::CodeToAudio { let codes candle::safetensors::load(args.in_file, device)?; codes.get(codes).expect(no codes in input file).clone() }因此如果你自己准备 Token 文件必须保证 safetensors 中有一个名为codes的键这正是audio-to-code动作写出时的键名见下文。随后 main.rs 调用model.decode(codes)得到重建 PCM经过响度归一化后写入 WAVlet pcm model.decode(codes)?; let pcm pcm.i(0)?.i(0)?; let pcm candle_examples::audio::normalize_loudness(pcm, 24_000, true)?; let pcm pcm.to_vec1::f32()?; // ... let mut output std::fs::File::create(args.out_file)?; candle_examples::wav::write_pcm_as_wav(mut output, pcm, 24_000)?;其中normalize_loudness在 candle-examples/src/audio.rs 中实现write_pcm_as_wav在 candle-examples/src/wav.rs 中实现两者共同保证输出 WAV 的听感响度合理、格式正确。2. audio-to-audio音频压缩后重建cargo run --example encodec --features encodec --release -- audio-to-audio in.mp3 out.wav该动作先将输入音频文件编码为 EnCodec Token再立即解码回 WAV实现压缩-重建的完整链路可直接用来试听 EnCodec 的重建音质。处理流程见 main.rsAction::AudioToCode | Action::AudioToAudio { let pcm if args.in_file - { // 从默认输入设备录音 } else { let (pcm, sample_rate) audio_io::pcm_decode(args.in_file)?; if sample_rate ! 24_000 { println!(WARNING: encodec uses a 24khz sample rate, input uses {sample_rate}, resampling...); audio_io::resample(pcm, sample_rate as usize, 24_000)? } else { pcm } }; // ... model.encode(pcm)? }需要注意的关键点采样率要求EnCodec 以 24kHz 采样率训练若输入音频采样率不是 24000程序会打印警告并自动用audio_io::resample内部基于rubato的 FFT 重采样器见 audio_io.rs重采样到 24kHz声道要求模型配置为单声道audio_channels: 1输入 PCM 取自解码音频的第一个平面多声道文件只取第一声道解码音频文件的任务由 symphonia 完成pcm_decode通过 symphonia 的 probe 机制自动识别格式并解码为Vecf32见 audio_io.rs。3. audio-to-code音频编码为 Tokencargo run --example encodec --features encodec --release -- audio-to-code in.mp3 out.safetensors该动作将输入音频编码为 EnCodec Token并写出 safetensors 文件。写出的键名为codes见 main.rsAction::AudioToCode { codes.save_safetensors(codes, args.out_file)?; }生成的 Token 文件可直接用作code-to-audio的输入由此构成音频 → Token → 音频的可逆闭环。这种 Token 形式非常适合作为下游任务的中间表征例如语音/音乐生成模型的离散输入。实时录音与播放-的魔法README 特别提到输出文件名为-时直接播放到默认音频输出设备输入文件名为-时从默认音频输入设备录音。录音main.rs中当in_file -时会打印 RECORDING AUDIO, PRESS ENTER ONCE DONE 随后启动audio_io::setup_input_stream基于 cpal在一个后台线程中持续收集麦克风数据直到用户在终端按下回车结束录音见 main.rs播放当out_file -时main.rs启动audio_io::setup_output_stream将重建 PCM 推入播放队列并循环等待队列清空后才退出见 main.rs。在 audio_io.rs 中输入与输出流都经过了 rubato 异步重采样器AudioOutputData_::new将设备原生采样率与 24kHz 之间做实时转换录音方向设备采样率 → 24000播放方向24000 → 设备采样率。因此即使声卡采样率与 EnCodec 不一致也能实时运行。一个典型的实时演示命令组合# 录制麦克风音频然后立即用 EnCodec 编码并解码实时播放 cargo run --example encodec --features encodec --release -- audio-to-audio - -命令行参数速查示例使用 clap 定义参数完整定义见 main.rs参数类型必填说明action位置参数是三种动作之一code-to-audio/audio-to-audio/audio-to-codein_file位置参数是输入文件音频文件或 safetensors Token 文件-表示从麦克风录音out_file位置参数是输出文件WAV 音频或 safetensors Token 文件-表示直接播放--cpu标志否强制在 CPU 上运行而非自动选择 GPU--model字符串否指定模型权重文件路径safetensors 格式缺省时自动从 Hugging Face Hub 下载facebook/encodec_24khz/model.safetensors设备选择与权重加载main.rs中的设备选择复用 candle-examples 的通用逻辑candle_examples::device(args.cpu)默认情况下若环境中存在 CUDA 设备则优先使用 GPU--cpu可强制回退 CPU也可参考示例内依赖的candle_examples::hub::Api完成权重下载。权重加载路径有两种见 main.rslet model match args.model { Some(model) std::path::PathBuf::from(model), None Api::new()? .model(facebook/encodec_24khz) .get(model.safetensors)?, }; let vb unsafe { VarBuilder::from_mmaped_safetensors([model], DType::F32, device)? }; let config Config::default(); let model Model::new(config, vb)?;要点传--model path/to/model.safetensors可离线使用本地权重避免联网下载默认路径通过Api从 Hugging Face Hub 拉取facebook/encodec_24khz的model.safetensors权重以DType::F32通过from_mmaped_safetensors映射加载mmap 方式省内存模型使用Config::default()构建即默认配置即可与官方 24kHz 权重对齐。模型结构与源码级原理Config 与默认超参数Config的默认值定义在 candle-transformers/src/models/encodec.rs关键默认参数如下参数默认值含义target_bandwidths[1.5, 3.0, 6.0, 12.0, 24.0]目标码率档位kbps决定量化器层数sampling_rate24_000模型采样率Hzaudio_channels1音频声道数单声道hidden_size128编码器输出隐维度num_filters32卷积滤波器基数num_residual_layers1每个采样层堆叠的残差块数upsampling_ratios[8, 5, 4, 2]各阶段上采样下采样倍数乘积为帧率分母norm_typeWeightNorm权重归一化类型kernel_size7卷积核大小use_causal_convtrue是否使用因果卷积pad_modeReplicate填充模式原实现为 ReflectCandle 暂不支持故回退 Replicatecompress2残差块中间通道压缩比num_lstm_layers2LSTM 层数codebook_size1024每级 codebook 大小码本条目数其中量化器层数由num_quantizers推导1000 * 最高目标带宽 / (frame_rate * 10)见 encodec.rs而frame_rate sampling_rate / hop_lengthhop_length即upsampling_ratios的乘积8*5*4*2 320因此 24kHz 音频的帧率约为 75 Hz——即每秒钟音频对应约 75 个 Token 帧。编码器EncoderEncoderencodec.rs的结构为初始卷积init_conv将audio_channels1映射到num_filters32逐级下采样对upsampling_ratios逆序[2, 4, 5, 8]遍历每级先堆叠num_residual_layers个残差块再经 ELU 激活后用一个步长为ratio的卷积将时间维度降采样ratio倍、通道翻倍两层EncodecLSTMnum_filters * scaling 32 * 16 512维用于捕捉全局时序依赖最终卷积final_conv输出hidden_size128维的紧凑表示。每个卷积层都通过EncodecConv1d封装了因果填充逻辑get_extra_padding_for_conv1d计算使输出长度整除所需的最小补零量再按pad_mode本仓库实现为 Replicate在时间轴补边见 encodec.rs。权重归一化则通过conv1d_weight_norm在推理时由weight_g与weight_v重新合成权重见 encodec.rs。残差向量量化器ResidualVectorQuantizerResidualVectorQuantizerencodec.rs是 EnCodec 的核心编码时逐级对上一级量化后的残差进行向量量化输出各级 codebook 索引并堆叠为(n_quantizers, n_frames)的 Token 张量解码时按索引查表累加各级量化结果重建隐表示。每一级使用大小为 1024 的EuclideanCodebook欧氏距离最近邻查找CPU 上通过自定义算子CodebookEncode并行加速见 encodec.rs。Model::encode返回codes.transpose(0, 1)最终形状为(n_frames, n_quantizers)与主流分词器约定一致Model::decode先转置回(n_quantizers, n_frames)再逐级解码累加见 encodec.rs。解码器DecoderDecoderencodec.rs与编码器对称先经初始卷积与两层 LSTM再按upsampling_ratios正序逐级执行转置卷积上采样ratio倍 残差块堆叠每级通道减半最后输出audio_channels1个通道的 PCM 波形。一个 24kHz 权重对应的典型 Token 规模结合默认配置推算frame_rate 24000 / 320 75帧/秒最高带宽档24 kbps对应num_quantizers 1000 * 24 / (75 * 10) 32级量化。即每秒音频在最高码率档下对应约75 × 32 2400个 Token 元素Token 的编码数据量远小于原始 PCM体现了 EnCodec 的压缩本质。注意实际每帧 Token 数由权重的target_bandwidths决定运行时通过打印的codes shape即可直观确认。常见问题与使用建议编译报缺少依赖务必带--features encodec运行cargo run输入音频采样率不是 24kHz程序自动重采样并打印 WARNING无需手动预处理codes键缺失code-to-audio要求 safetensors 内存在codes键建议统一用audio-to-code生成 Token 文件以保证键名正确录音/播放失败-输入输出依赖系统声卡设备cpal需确保默认输入/输出设备可用且权限允许访问麦克风离线使用传--model指定本地model.safetensors可避免联网下载权重。小结通过candle-examples/examples/encodec/这个示例可以在 Rust 中以极简的命令行完成 EnCodec 的编码、解码与压缩重建全流程并支持麦克风实时录音与声卡实时播放。其底层实现candle-transformers/src/models/encodec.rs完整覆盖了 EnCodec 论文提出的卷积编码器/解码器与残差向量量化架构为在 Rust 生态中进一步做语音/音乐生成、离散音频表征等任务提供了可直接复用的模型基座与样例代码。赞分享人工智能大模型机器学习深度学习本地部署模型推理服务【免费下载链接】candleMinimalist ML framework for Rust项目地址https://gitcode.com/GitHub_Trending/ca/candle点击查看免费下载相关推荐突破音频压缩极限Meta EnCodec 24kHz实时神经网络编解码器全解析突破音频压缩极限Meta EnCodec 24kHz实时神经网络编解码器全解析 你是否还在为音频压缩中的质量损失而困扰是否在寻找既能节省带宽又能保持高保真音深入解析 Transformers 中的 EnCodec神经音频编解码器的架构、配置与 PyTorch 用法深入解析 Transformers 中的 EnCodec神经音频编解码器的架构、配置与 PyTorch 用法 本文对应仓库文档 docs/source/en/人工智能大模型深度学习NLP预训练微调模型推理服务AI-Research-SKILLs 之 AudioCraft 音频生成实战指南MusicGen 文生音乐、AudioGen 音效合成与 EnCodec 神经编解码AI Research SKILLs 之 AudioCraft 音频生成实战指南MusicGen 文生音乐、AudioGen 音效合成与 EnCodec 神经AI 技能人工智能大模型深度学习上一篇揭秘OpenAI Strawberryo1模型如何重新定义AI推理能力下一篇解决 Oh My Posh 终端字体显示异常的完整指南从安装到调试创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表