快捷方式

使用 AudioDecoder 解码音频流

在此示例中,我们将学习如何使用 AudioDecoder 类解码音频文件。

首先,一些样板代码:我们将从网络下载一个音频文件并定义一个音频播放工具。您可以忽略这部分,直接跳转到下面的 创建解码器

import requests
from IPython.display import Audio


def play_audio(samples):
    return Audio(samples.data, rate=samples.sample_rate)


# Audio source is CC0: https://opengameart.org/content/town-theme-rpg
# Attribution: cynicmusic.com pixelsphere.org
url = "https://opengameart.org/sites/default/files/TownTheme.mp3"
response = requests.get(url, headers={"User-Agent": ""})
if response.status_code != 200:
    raise RuntimeError(f"Failed to download video. {response.status_code = }.")

raw_audio_bytes = response.content

创建解码器

现在我们可以从原始(编码的)音频字节创建解码器。您当然可以使用本地音频文件并将路径作为输入。您还可以解码视频中的音频流!

from torchcodec.decoders import AudioDecoder

decoder = AudioDecoder(raw_audio_bytes)

尚未通过解码器进行解码,但我们已经可以通过 metadata 属性访问一些元数据,该属性是一个 AudioStreamMetadata 对象。

print(decoder.metadata)
AudioStreamMetadata:
  duration_seconds_from_header: 97.48898
  begin_stream_seconds_from_header: 0.025057
  bit_rate: 108039.0
  codec: mp3
  stream_index: 0
  sample_rate: 44100
  num_channels: 2
  sample_format: fltp

解码样本

要获取解码后的样本,我们只需调用 get_all_samples() 方法,该方法返回一个 AudioSamples 对象

samples = decoder.get_all_samples()

print(samples)
play_audio(samples)
AudioSamples:
  data (shape): torch.Size([2, 4297722])
  pts_seconds: 0.02505668934240363
  duration_seconds: 97.45401360544217
  sample_rate: 44100


.data 字段是一个形状为 (num_channels, num_samples) 的张量,其 dtype 为 float,取值范围在 [-1, 1] 之间。

.pts_seconds 字段表示输出样本的起始时间。这里是 0.025 秒,即使我们要求从 0 开始的样本。并非所有流都从恰好 0 开始!这不是 TorchCodec 的 bug,这是文件编码时定义的属性。

指定范围

如果我们不需要所有样本,可以使用 get_samples_played_in_range() 解码指定范围内的样本

samples = decoder.get_samples_played_in_range(start_seconds=10, stop_seconds=70)

print(samples)
play_audio(samples)
AudioSamples:
  data (shape): torch.Size([2, 2646000])
  pts_seconds: 10.0
  duration_seconds: 60.0
  sample_rate: 44100


自定义采样率

我们还可以使用 AudioDecodersample_rate 参数将样本解码到所需的采样率。输出听起来一样,但请注意样本数量大幅增加

decoder = AudioDecoder(raw_audio_bytes, sample_rate=16_000)
samples = decoder.get_all_samples()

print(samples)
play_audio(samples)
AudioSamples:
  data (shape): torch.Size([2, 1559264])
  pts_seconds: 0.02505668934240363
  duration_seconds: 97.454
  sample_rate: 16000


脚本总运行时间: (0 分钟 1.789 秒)

由 Sphinx-Gallery 生成的图库

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取针对初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题解答

查看资源