使用 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 秒)