torchaudio.sox_effects.apply_effects_file¶
- torchaudio.sox_effects.apply_effects_file(path: str, effects: List[List[str]], normalize: bool = True, channels_first: bool = True, format: Optional[str] = None) Tuple[Tensor, int] [源代码]¶
对音频文件应用 sox 效果,并将结果数据加载为张量。
注意
此函数的工作方式与
sox
命令非常相似,但存在一些细微差异。例如,sox
命令会自动添加某些效果(例如,在speed
、pitch
等之后添加rate
效果),但此函数仅应用给定的效果。因此,要真正应用speed
效果,您还需要给出带有所需采样率的rate
效果,因为在内部,speed
效果仅改变采样率,而不会更改样本。- 参数::
path (路径类对象) – 音频数据的来源。
effects (List[List[str]]) – 效果列表。
normalize (bool, 可选) –
当
True
时,此函数会将本机样本类型转换为float32
。默认:True
。如果输入文件是整数 WAV,则给出
False
将会将结果张量的类型更改为整数类型。此参数对除整数 WAV 类型以外的格式没有影响。channels_first (bool, 可选) – 当为 True 时,返回的张量具有维度 [channel, time]。否则,返回的张量的维度为 [time, channel]。
format (str 或 None, 可选) – 使用给定的格式覆盖格式检测。当 libsox 无法从标题或扩展名推断出格式时,提供此参数可能会有所帮助。
- 返回值::
结果张量和采样率。如果
normalize=True
,则结果张量始终为float32
类型。如果normalize=False
并且输入音频文件为整数 WAV 文件,则结果张量具有相应的整数类型。(注意,不支持 24 位整数类型)如果channels_first=True
,则结果张量具有维度 [channel, time],否则为 [time, channel]。- 返回类型::
(Tensor, int)
- 示例 - 基本用法
>>> >>> # Defines the effects to apply >>> effects = [ ... ['gain', '-n'], # normalises to 0dB ... ['pitch', '5'], # 5 cent pitch shift ... ['rate', '8000'], # resample to 8000 Hz ... ] >>> >>> # Apply effects and load data with channels_first=True >>> waveform, sample_rate = apply_effects_file("data.wav", effects, channels_first=True) >>> >>> # Check the result >>> waveform.shape torch.Size([2, 8000]) >>> waveform tensor([[ 5.1151e-03, 1.8073e-02, 2.2188e-02, ..., 1.0431e-07, -1.4761e-07, 1.8114e-07], [-2.6924e-03, 2.1860e-03, 1.0650e-02, ..., 6.4122e-07, -5.6159e-07, 4.8103e-07]]) >>> sample_rate 8000
- 示例 - 对数据集应用随机速度扰动
>>> >>> # Load data from file, apply random speed perturbation >>> class RandomPerturbationFile(torch.utils.data.Dataset): ... """Given flist, apply random speed perturbation ... ... Suppose all the input files are at least one second long. ... """ ... def __init__(self, flist: List[str], sample_rate: int): ... super().__init__() ... self.flist = flist ... self.sample_rate = sample_rate ... ... def __getitem__(self, index): ... speed = 0.5 + 1.5 * random.randn() ... effects = [ ... ['gain', '-n', '-10'], # apply 10 db attenuation ... ['remix', '-'], # merge all the channels ... ['speed', f'{speed:.5f}'], # duration is now 0.5 ~ 2.0 seconds. ... ['rate', f'{self.sample_rate}'], ... ['pad', '0', '1.5'], # add 1.5 seconds silence at the end ... ['trim', '0', '2'], # get the first 2 seconds ... ] ... waveform, _ = torchaudio.sox_effects.apply_effects_file( ... self.flist[index], effects) ... return waveform ... ... def __len__(self): ... return len(self.flist) ... >>> dataset = RandomPerturbationFile(file_list, sample_rate=8000) >>> loader = torch.utils.data.DataLoader(dataset, batch_size=32) >>> for batch in loader: >>> pass
- 使用
apply_effects_file
的教程 - 音频特征增强