使用 AudioEncoder 对音频样本进行编码¶
在此示例中,我们将学习如何使用 AudioEncoder
类将音频样本编码到文件或原始字节中。
我们首先生成一些要编码的样本。要编码的数据也可以直接来自 AudioDecoder
!
import torch
from IPython.display import Audio as play_audio
def make_sinewave() -> tuple[torch.Tensor, int]:
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
我们首先实例化一个 AudioEncoder
。我们将要编码的样本传递给它。样本必须是形状为 (num_channels, num_samples)
的二维张量,或者在这种情况下,是一维张量,其中 num_channels
默认为 1。值必须是归一化在 [-1, 1]
范围内的浮点值:这也是 AudioDecoder
会返回的值。
注意
sample_rate
参数对应于 *输入* 的采样率,而不是所需的编码后采样率。
from torchcodec.encoders import AudioEncoder
encoder = AudioEncoder(samples=samples, sample_rate=sample_rate)
AudioEncoder
支持通过 to_file()
方法将样本编码到文件中,或者通过 to_tensor()
编码到原始字节中。在本教程中,我们将使用 to_tensor()
,以便我们可以轻松地重新解码编码后的样本并检查它们的属性。to_file()
方法的工作方式非常相似。
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
请查看编码方法的 docstring 以了解不同的编码选项。
脚本总运行时间: (0 分钟 0.043 秒)