使用 AudioEncoder 对音频样本进行编码

使用 AudioEncoder 对音频样本进行编码#

先生成一些样本进行编码。需要编码的数据也可以直接从AudioEncoder获取!

import torch
from IPython.display import Audio as play_audio


def make_sinewave() -> tuple[torch.Tensor, int]:
    """生成 440Hz (音乐中的标准音高 A4,即中央 C 上方的 A 音)的正弦波音频,时长 3 秒 ,采样率为 16000Hz。
    """
    freq_A = 440  # Hz (频率:决定音高)
    sample_rate = 16000  # Hz (采样率:每秒采集/播放的数据点数)
    duration_seconds = 3  # seconds (时长:音频的总时间长度)
    t = torch.linspace(0, duration_seconds, int(sample_rate * duration_seconds), dtype=torch.float32)
    return torch.sin(2 * torch.pi * freq_A * t), sample_rate


samples, sample_rate = make_sinewave()

print(f"Encoding samples with {samples.shape = } and {sample_rate = }")
play_audio(samples, rate=sample_rate)  # 音频播放控件
Encoding samples with samples.shape = torch.Size([48000]) and sample_rate = 16000

首先实例化音频编码器 。样本必须是二维张量 (num_channels,num_samples)),或者在这里,是一维张量,其中 num_channels 假设为 1.这些值必须是以 \([-1, 1]\) 归一化的浮点值:这也是 音频解码器会回归。

from torchcodec.encoders import AudioEncoder

encoder = AudioEncoder(samples=samples, sample_rate=sample_rate)

sample_rate 参数对应于 输入 ,而不是期望的编码采样率。

AudioEncoder 支持通过 to_file 方法将采样编码成文件,或通过 to_tensor 方法编码为原始字节。

encoded_samples = encoder.to_tensor(format="mp3")
print(f"{encoded_samples.shape = }, {encoded_samples.dtype = }")
encoded_samples.shape = torch.Size([9512]), encoded_samples.dtype = torch.uint8

有了编码数据,可以重新解码,确保它看起来和听起来都符合预期:

from torchcodec.decoders import AudioDecoder

samples_back = AudioDecoder(encoded_samples).get_all_samples()

print(samples_back)
play_audio(samples_back.data, rate=samples_back.sample_rate)
AudioSamples:
  data (shape): torch.Size([1, 48000])
  pts_seconds: 0.0690625
  duration_seconds: 3.0
  sample_rate: 16000

编码器支持一些编码选项,允许你更改数据编码方式。例如,可以决定将单声道数据(1通道)编码为立体声数据(2通道),并指定输出采样率:

desired_sample_rate = 32000
encoded_samples = encoder.to_tensor(format="wav", num_channels=2, sample_rate=desired_sample_rate)

stereo_samples_back = AudioDecoder(encoded_samples).get_all_samples()

print(stereo_samples_back)
play_audio(stereo_samples_back.data, rate=desired_sample_rate)
AudioSamples:
  data (shape): torch.Size([2, 96000])
  pts_seconds: 0.0
  duration_seconds: 3.0
  sample_rate: 32000