Files
openvpi--diffsinger/modules/fastspeech/param_adaptor.py
T
2026-07-13 12:35:17 +08:00

96 lines
3.5 KiB
Python

from __future__ import annotations
import torch
import modules.compat as compat
from modules.core.ddpm import MultiVarianceDiffusion
from utils import filter_kwargs
from utils.hparams import hparams
VARIANCE_CHECKLIST = ['energy', 'breathiness', 'voicing', 'tension']
class ParameterAdaptorModule(torch.nn.Module):
def __init__(self):
super().__init__()
self.variance_prediction_list = []
self.predict_energy = hparams.get('predict_energy', False)
self.predict_breathiness = hparams.get('predict_breathiness', False)
self.predict_voicing = hparams.get('predict_voicing', False)
self.predict_tension = hparams.get('predict_tension', False)
if self.predict_energy:
self.variance_prediction_list.append('energy')
if self.predict_breathiness:
self.variance_prediction_list.append('breathiness')
if self.predict_voicing:
self.variance_prediction_list.append('voicing')
if self.predict_tension:
self.variance_prediction_list.append('tension')
self.predict_variances = len(self.variance_prediction_list) > 0
def build_adaptor(self, cls=MultiVarianceDiffusion):
ranges = []
clamps = []
if self.predict_energy:
ranges.append((
hparams['energy_db_min'],
hparams['energy_db_max']
))
clamps.append((hparams['energy_db_min'], 0.))
if self.predict_breathiness:
ranges.append((
hparams['breathiness_db_min'],
hparams['breathiness_db_max']
))
clamps.append((hparams['breathiness_db_min'], 0.))
if self.predict_voicing:
ranges.append((
hparams['voicing_db_min'],
hparams['voicing_db_max']
))
clamps.append((hparams['voicing_db_min'], 0.))
if self.predict_tension:
ranges.append((
hparams['tension_logit_min'],
hparams['tension_logit_max']
))
clamps.append((
hparams['tension_logit_min'],
hparams['tension_logit_max']
))
variances_hparams = hparams['variances_prediction_args']
total_repeat_bins = variances_hparams['total_repeat_bins']
assert total_repeat_bins % len(self.variance_prediction_list) == 0, \
f'Total number of repeat bins must be divisible by number of ' \
f'variance parameters ({len(self.variance_prediction_list)}).'
repeat_bins = total_repeat_bins // len(self.variance_prediction_list)
backbone_type = compat.get_backbone_type(hparams, nested_config=variances_hparams)
backbone_args = compat.get_backbone_args(variances_hparams, backbone_type=backbone_type)
kwargs = filter_kwargs(
{
'ranges': ranges,
'clamps': clamps,
'repeat_bins': repeat_bins,
'timesteps': hparams.get('timesteps'),
'time_scale_factor': hparams.get('time_scale_factor'),
'backbone_type': backbone_type,
'backbone_args': backbone_args
},
cls
)
return cls(**kwargs)
def collect_variance_inputs(self, **kwargs) -> list:
return [kwargs.get(name) for name in self.variance_prediction_list]
def collect_variance_outputs(self, variances: list | tuple) -> dict:
return {
name: pred
for name, pred in zip(self.variance_prediction_list, variances)
}