Skip to content

Commit f93c5f6

Browse files
authored
Merge pull request #166 from sp-nitech/v4
V4
2 parents a708b7a + 7294086 commit f93c5f6

120 files changed

Lines changed: 1553 additions & 1609 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

diffsptk/modules/acorr.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616

1717
import torch
1818

19-
from ..typing import Callable, Precomputed
19+
from ..typing import Callable
2020
from ..utils.private import check_size, filter_values
21-
from .base import BaseFunctionalModule
21+
from .base import BaseFunctionalModule, Precomputed
2222

2323

2424
class Autocorrelation(BaseFunctionalModule):
@@ -38,14 +38,16 @@ class Autocorrelation(BaseFunctionalModule):
3838
3939
"""
4040

41+
_takes_input_size = True
42+
4143
def __init__(
4244
self, frame_length: int, acr_order: int, out_format: str | int = "naive"
4345
) -> None:
4446
super().__init__()
4547

4648
self.in_dim = frame_length
4749

48-
self.values = self._precompute(**filter_values(locals())).values
50+
self._register_precomputed(self._precompute(**filter_values(locals())))
4951

5052
def forward(self, x: torch.Tensor) -> torch.Tensor:
5153
"""Estimate the autocorrelation of the input waveform.
@@ -71,16 +73,12 @@ def forward(self, x: torch.Tensor) -> torch.Tensor:
7173
7274
"""
7375
check_size(x.size(-1), self.in_dim, "length of waveform")
74-
return self._forward(x, *self.values)
76+
return self._call_forward(x)
7577

7678
@staticmethod
7779
def _func(x: torch.Tensor, *args, **kwargs) -> torch.Tensor:
78-
values = Autocorrelation._precompute(x.size(-1), *args, **kwargs).values
79-
return Autocorrelation._forward(x, *values)
80-
81-
@staticmethod
82-
def _takes_input_size() -> bool:
83-
return True
80+
_p = Autocorrelation._precompute(x.size(-1), *args, **kwargs)
81+
return Autocorrelation._apply_precomputed(_p, x=x)
8482

8583
@staticmethod
8684
def _check(frame_length: int, acr_order: int) -> None:
@@ -107,10 +105,12 @@ def _precompute(
107105
)
108106
else:
109107
raise ValueError(f"out_format {out_format} is not supported.")
110-
return Precomputed(values=(acr_order, formatter))
108+
return Precomputed(values={"acr_order": acr_order, "formatter": formatter})
111109

112110
@staticmethod
113-
def _forward(x: torch.Tensor, acr_order: int, formatter: Callable) -> torch.Tensor:
111+
def _forward(
112+
x: torch.Tensor, *, acr_order: int, formatter: Callable
113+
) -> torch.Tensor:
114114
fft_length = x.size(-1) + acr_order
115115
if fft_length % 2 == 1:
116116
fft_length += 1

diffsptk/modules/acr2csm.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
import torch
1818
import torch.nn.functional as F
1919

20-
from ..typing import Precomputed
2120
from ..utils.private import check_size, filter_values, hankel, to, vander
22-
from .base import BaseFunctionalModule
21+
from .base import BaseFunctionalModule, Precomputed
2322
from .root_pol import PolynomialToRoots
2423

2524

@@ -45,6 +44,8 @@ class AutocorrelationToCompositeSinusoidalModelCoefficients(BaseFunctionalModule
4544
4645
"""
4746

47+
_takes_input_size = True
48+
4849
def __init__(
4950
self,
5051
acr_order: int,
@@ -55,8 +56,7 @@ def __init__(
5556

5657
self.in_dim = acr_order + 1
5758

58-
tensors = self._precompute(**filter_values(locals())).tensors
59-
self.register_buffer("C", tensors[0])
59+
self._register_precomputed(self._precompute(**filter_values(locals())))
6060

6161
def forward(self, r: torch.Tensor) -> torch.Tensor:
6262
"""Convert autocorrelation to CSM coefficients.
@@ -83,20 +83,16 @@ def forward(self, r: torch.Tensor) -> torch.Tensor:
8383
8484
"""
8585
check_size(r.size(-1), self.in_dim, "dimension of autocorrelation")
86-
return self._forward(r, **self._buffers) # type: ignore[arg-type]
86+
return self._call_forward(r)
8787

8888
@staticmethod
8989
def _func(r: torch.Tensor, *args, **kwargs) -> torch.Tensor:
90-
tensors = AutocorrelationToCompositeSinusoidalModelCoefficients._precompute(
90+
_p = AutocorrelationToCompositeSinusoidalModelCoefficients._precompute(
9191
r.size(-1) - 1, *args, **kwargs, device=r.device, dtype=r.dtype
92-
).tensors
93-
return AutocorrelationToCompositeSinusoidalModelCoefficients._forward(
94-
r, *tensors
9592
)
96-
97-
@staticmethod
98-
def _takes_input_size() -> bool:
99-
return True
93+
return AutocorrelationToCompositeSinusoidalModelCoefficients._apply_precomputed(
94+
_p, r=r
95+
)
10096

10197
@staticmethod
10298
def _check(acr_order: int) -> None:
@@ -130,10 +126,10 @@ def _precompute(
130126
bias + center : bias + center + length, k
131127
]
132128
C[1:] *= 2
133-
return Precomputed(tensors=(to(C, dtype=dtype),))
129+
return Precomputed(tensors={"C": to(C, dtype=dtype)})
134130

135131
@staticmethod
136-
def _forward(r: torch.Tensor, C: torch.Tensor) -> torch.Tensor:
132+
def _forward(r: torch.Tensor, *, C: torch.Tensor) -> torch.Tensor:
137133
u = torch.matmul(r, C)
138134
u1, u2 = torch.tensor_split(u, 2, dim=-1)
139135

diffsptk/modules/alaw.py

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@
1818

1919
import torch
2020

21-
from ..typing import Precomputed
2221
from ..utils.private import filter_values
23-
from .base import BaseFunctionalModule
22+
from .base import BaseFunctionalModule, Precomputed
2423

2524

2625
class ALawCompression(BaseFunctionalModule):
@@ -40,7 +39,7 @@ class ALawCompression(BaseFunctionalModule):
4039
def __init__(self, abs_max: float = 1, a: float = 87.6) -> None:
4140
super().__init__()
4241

43-
self.values = self._precompute(**filter_values(locals())).values
42+
self._register_precomputed(self._precompute(**filter_values(locals())))
4443

4544
def forward(self, x: torch.Tensor) -> torch.Tensor:
4645
"""Compress the input waveform using the A-law algorithm.
@@ -65,16 +64,12 @@ def forward(self, x: torch.Tensor) -> torch.Tensor:
6564
tensor([0.0000, 2.9868, 3.4934, 3.7897, 4.0000])
6665
6766
"""
68-
return self._forward(x, *self.values)
67+
return self._call_forward(x)
6968

7069
@staticmethod
7170
def _func(x: torch.Tensor, *args, **kwargs) -> torch.Tensor:
72-
values = ALawCompression._precompute(*args, **kwargs).values
73-
return ALawCompression._forward(x, *values)
74-
75-
@staticmethod
76-
def _takes_input_size() -> bool:
77-
return False
71+
_p = ALawCompression._precompute(*args, **kwargs)
72+
return ALawCompression._apply_precomputed(_p, x=x)
7873

7974
@staticmethod
8075
def _check(abs_max: float, a: float) -> None:
@@ -87,15 +82,13 @@ def _check(abs_max: float, a: float) -> None:
8782
def _precompute(abs_max: float, a: float) -> Precomputed:
8883
ALawCompression._check(abs_max, a)
8984
return Precomputed(
90-
values=(
91-
abs_max,
92-
a,
93-
abs_max / (1 + math.log(a)),
94-
)
85+
values={"abs_max": abs_max, "a": a, "c": abs_max / (1 + math.log(a))}
9586
)
9687

9788
@staticmethod
98-
def _forward(x: torch.Tensor, abs_max: float, a: float, c: float) -> torch.Tensor:
89+
def _forward(
90+
x: torch.Tensor, *, abs_max: float, a: float, c: float
91+
) -> torch.Tensor:
9992
x_abs = x.abs() / abs_max
10093
x1 = a * x_abs
10194
x2 = 1 + torch.log(x1)

diffsptk/modules/ap.py

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -247,14 +247,18 @@ def __init__(
247247
idx = np.clip(idx, 0, len(coarse_axis) - 2)
248248
idx = idx.reshape(1, 1, -1)
249249
self.register_buffer(
250-
"interp_indices", to(idx, device=device, dtype=torch.long)
250+
"interp_indices",
251+
to(idx, device=device, dtype=torch.long),
252+
persistent=False,
251253
)
252254

253255
x0 = coarse_axis[:-1]
254256
dx = coarse_axis[1:] - x0
255257
weights = (freq_axis - np.take(x0, idx)) / np.take(dx, idx)
256258
self.register_buffer(
257-
"interp_weights", to(weights, device=device, dtype=dtype)
259+
"interp_weights",
260+
to(weights, device=device, dtype=dtype),
261+
persistent=False,
258262
)
259263

260264
self.segment_length = [
@@ -263,21 +267,29 @@ def __init__(
263267
ramp = torch.arange(-1, self.segment_length[0] + 1, device=device).view(
264268
1, 1, -1
265269
)
266-
self.register_buffer("ramp", ramp)
267-
self.register_buffer("eye", torch.eye(6, device=device, dtype=dtype) * eps)
270+
self.register_buffer("ramp", ramp, persistent=False)
271+
self.register_buffer(
272+
"eye", torch.eye(6, device=device, dtype=dtype) * eps, persistent=False
273+
)
268274

269275
hHP = self._qmf_high()
270276
hLP = self._qmf_low()
271-
self.register_buffer("hHP", to(hHP, device=device, dtype=dtype).view(1, 1, -1))
272-
self.register_buffer("hLP", to(hLP, device=device, dtype=dtype).view(1, 1, -1))
277+
self.register_buffer(
278+
"hHP", to(hHP, device=device, dtype=dtype).view(1, 1, -1), persistent=False
279+
)
280+
self.register_buffer(
281+
"hLP", to(hLP, device=device, dtype=dtype).view(1, 1, -1), persistent=False
282+
)
273283
self.hHP_pad = nn.ReflectionPad1d(self.hHP.size(-1) // 2)
274284
self.hLP_pad = nn.ReflectionPad1d(self.hLP.size(-1) // 2)
275285

276286
window = np.zeros((self.n_band, self.segment_length[0]))
277287
for i, s in enumerate(self.segment_length):
278288
window[i, :s] = np.hanning(s + 2)[1:-1]
279-
self.register_buffer("window", to(window, device=device, dtype=dtype))
280-
self.register_buffer("window_sqrt", self.window.sqrt())
289+
self.register_buffer(
290+
"window", to(window, device=device, dtype=dtype), persistent=False
291+
)
292+
self.register_buffer("window_sqrt", self.window.sqrt(), persistent=False)
281293

282294
def forward(self, x: torch.Tensor, f0: torch.Tensor) -> torch.Tensor:
283295
f0 = torch.where(f0 <= 32, self.default_f0, f0).detach()
@@ -502,7 +514,7 @@ def __init__(
502514
left = center - half_window_length
503515
right = center + half_window_length + 1
504516
windows.append(F.pad(window, (left, padded_window_length - right)))
505-
self.register_buffer("windows", torch.stack(windows))
517+
self.register_buffer("windows", torch.stack(windows), persistent=False)
506518
self.window_length = window_length
507519

508520
if fft_length is not None:
@@ -513,20 +525,26 @@ def __init__(
513525
idx = np.clip(idx, 0, len(coarse_axis) - 2)
514526
idx = idx.reshape(1, 1, -1)
515527
self.register_buffer(
516-
"interp_indices", to(idx, device=device, dtype=torch.long)
528+
"interp_indices",
529+
to(idx, device=device, dtype=torch.long),
530+
persistent=False,
517531
)
518532

519533
x0 = coarse_axis[:-1]
520534
dx = coarse_axis[1:] - x0
521535
weights = (freq_axis - np.take(x0, idx)) / np.take(dx, idx)
522536
self.register_buffer(
523-
"interp_weights", to(weights, device=device, dtype=dtype)
537+
"interp_weights",
538+
to(weights, device=device, dtype=dtype),
539+
persistent=False,
524540
)
525541

526542
self.spec_love = Spectrum(self.fft_length_love)
527543
self.spec_d4c = Spectrum(self.fft_length_d4c)
528544

529-
self.register_buffer("ramp", torch.arange(self.fft_length_d4c, device=device))
545+
self.register_buffer(
546+
"ramp", torch.arange(self.fft_length_d4c, device=device), persistent=False
547+
)
530548

531549
def forward(self, x: torch.Tensor, f0: torch.Tensor) -> torch.Tensor:
532550
f0 = (

diffsptk/modules/b2mc.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,8 @@
1717
import torch
1818
import torch.nn.functional as F
1919

20-
from ..typing import Precomputed
2120
from ..utils.private import check_size, filter_values, to
22-
from .base import BaseFunctionalModule
21+
from .base import BaseFunctionalModule, Precomputed
2322

2423

2524
class MLSADigitalFilterCoefficientsToMelCepstrum(BaseFunctionalModule):
@@ -48,6 +47,8 @@ class MLSADigitalFilterCoefficientsToMelCepstrum(BaseFunctionalModule):
4847
4948
"""
5049

50+
_takes_input_size = True
51+
5152
def __init__(
5253
self,
5354
cep_order: int,
@@ -59,8 +60,7 @@ def __init__(
5960

6061
self.in_dim = cep_order + 1
6162

62-
tensors = self._precompute(**filter_values(locals())).tensors
63-
self.register_buffer("A", tensors[0])
63+
self._register_precomputed(self._precompute(**filter_values(locals())))
6464

6565
def forward(self, b: torch.Tensor) -> torch.Tensor:
6666
"""Convert MLSA filter coefficients to mel-cepstrum.
@@ -87,17 +87,13 @@ def forward(self, b: torch.Tensor) -> torch.Tensor:
8787
8888
"""
8989
check_size(b.size(-1), self.in_dim, "dimension of cepstrum")
90-
return self._forward(b, **self._buffers) # type: ignore[arg-type]
90+
return self._call_forward(b)
9191

9292
@staticmethod
9393
def _func(b: torch.Tensor, alpha: float) -> torch.Tensor:
9494
MLSADigitalFilterCoefficientsToMelCepstrum._check(b.size(-1) - 1, alpha)
9595
return b + F.pad(alpha * b[..., 1:], (0, 1))
9696

97-
@staticmethod
98-
def _takes_input_size() -> bool:
99-
return True
100-
10197
@staticmethod
10298
def _check(cep_order: int, alpha: float) -> None:
10399
if cep_order < 0:
@@ -115,8 +111,8 @@ def _precompute(
115111
MLSADigitalFilterCoefficientsToMelCepstrum._check(cep_order, alpha)
116112
A = torch.eye(cep_order + 1, device=device, dtype=torch.double)
117113
A[:, 1:].fill_diagonal_(alpha)
118-
return Precomputed(tensors=(to(A.T, dtype=dtype),))
114+
return Precomputed(tensors={"A": to(A.T, dtype=dtype)})
119115

120116
@staticmethod
121-
def _forward(b: torch.Tensor, A: torch.Tensor) -> torch.Tensor:
117+
def _forward(b: torch.Tensor, *, A: torch.Tensor) -> torch.Tensor:
122118
return torch.matmul(b, A)

0 commit comments

Comments
 (0)