Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update VAD docstring and check for input shape length #1513

Merged
merged 3 commits into from
May 21, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions test/torchaudio_unittest/transforms/sox_compatibility_test.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
import warnings

import torch
import torchaudio.transforms as T
from parameterized import parameterized

Expand Down Expand Up @@ -61,3 +64,25 @@ def test_vad(self, filename):
data, sample_rate = load_wav(path)
result = T.Vad(sample_rate)(data)
self.assert_sox_effect(result, path, ['vad'])

def test_vad_warning(self):
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you provide the docstring which describes the condition when the warning should be issued and when not, so that any future maintainer can understand the intend easily?

I think we can merge test_vad_warning and test_vad_no_warning.

"""vad should throw a warning if input dimension is greater than 2"""
sample_rate = 41100

data = torch.rand(5, 5, sample_rate)
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
T.Vad(sample_rate)(data)
assert len(w) == 1

data = torch.rand(5, sample_rate)
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
T.Vad(sample_rate)(data)
assert len(w) == 0

data = torch.rand(sample_rate)
with warnings.catch_warnings(record=True) as w:
warnings.simplefilter("always")
T.Vad(sample_rate)(data)
assert len(w) == 0
15 changes: 14 additions & 1 deletion torchaudio/functional/filtering.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import math
import warnings
from typing import Optional

import torch
Expand Down Expand Up @@ -1374,7 +1375,10 @@ def vad(
so in order to trim from the back, the reverse effect must also be used.

Args:
waveform (Tensor): Tensor of audio of dimension `(..., time)`
waveform (Tensor): Tensor of audio of dimension `(channels, time)` or `(time)`
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: "channel", see convention

Tensor of shape `(channels, time)` is treated as a multi-channel recording
of the same event and the resulting output will be trimmed to the earliest
voice activity in any channel.
sample_rate (int): Sample rate of audio signal.
trigger_level (float, optional): The measurement level used to trigger activity detection.
This may need to be cahnged depending on the noise level, signal level,
Expand Down Expand Up @@ -1420,6 +1424,15 @@ def vad(
http://sox.sourceforge.net/sox.html
"""

if waveform.ndim > 2:
warnings.warn(
"Expected input tensor dimension of 1 for single channel"
f" or 2 for multi-channel. Got {waveform.ndim} instead. "
"Batch semantics is not supported. "
"Please refer to https://github.com/pytorch/audio/issues/1348"
" and https://github.com/pytorch/audio/issues/1468."
Comment on lines +1432 to +1433
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: two links might be confusing. the first is the most relevant one to this issue.

)

measure_duration: float = (
2.0 / measure_freq if measure_duration is None else measure_duration
)
Expand Down
5 changes: 4 additions & 1 deletion torchaudio/transforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -1110,7 +1110,10 @@ def __init__(self,
def forward(self, waveform: Tensor) -> Tensor:
r"""
Args:
waveform (Tensor): Tensor of audio of dimension `(..., time)`
waveform (Tensor): Tensor of audio of dimension `(channels, time)` or `(time)`
Tensor of shape `(channels, time)` is treated as a multi-channel recording
of the same event and the resulting output will be trimmed to the earliest
voice activity in any channel.
"""
return F.vad(
waveform=waveform,
Expand Down