Spaces:
Sleeping
Sleeping
| import json | |
| import os | |
| import pathlib | |
| import sys | |
| from collections import OrderedDict | |
| from pathlib import Path | |
| import click | |
| from typing import Tuple | |
| root_dir = Path(__file__).resolve().parent.parent | |
| os.environ['PYTHONPATH'] = str(root_dir) | |
| sys.path.insert(0, str(root_dir)) | |
| def find_exp(exp): | |
| if not (root_dir / 'checkpoints' / exp).exists(): | |
| for subdir in (root_dir / 'checkpoints').iterdir(): | |
| if not subdir.is_dir(): | |
| continue | |
| if subdir.name.startswith(exp): | |
| print(f'| match ckpt by prefix: {subdir.name}') | |
| exp = subdir.name | |
| break | |
| else: | |
| raise click.BadParameter( | |
| f'There are no matching exp starting with \'{exp}\' in \'checkpoints\' folder. ' | |
| 'Please specify \'--exp\' as the folder name or prefix.' | |
| ) | |
| else: | |
| print(f'| found ckpt by name: {exp}') | |
| return exp | |
| def main(): | |
| pass | |
| def acoustic( | |
| proj: pathlib.Path, | |
| exp: str, | |
| ckpt: int, | |
| spk: str, | |
| out: pathlib.Path, | |
| title: str, | |
| num: int, | |
| key: int, | |
| gender: float, | |
| seed: int, | |
| depth: float, | |
| steps: int, | |
| mel: bool | |
| ): | |
| name = proj.stem if not title else title | |
| if out is None: | |
| out = proj.parent | |
| with open(proj, 'r', encoding='utf-8') as f: | |
| params = json.load(f) | |
| if not isinstance(params, list): | |
| params = [params] | |
| if len(params) == 0: | |
| print('The input file is empty.') | |
| exit() | |
| from utils.infer_utils import trans_key, parse_commandline_spk_mix | |
| if key != 0: | |
| params = trans_key(params, key) | |
| key_suffix = '%+dkey' % key | |
| if not title: | |
| name += key_suffix | |
| print(f'| key transition: {key:+d}') | |
| sys.argv = [ | |
| sys.argv[0], | |
| '--exp_name', | |
| exp, | |
| '--infer' | |
| ] | |
| from utils.hparams import set_hparams, hparams | |
| set_hparams() | |
| # Check for vocoder path | |
| assert mel or (root_dir / hparams['vocoder_ckpt']).exists(), \ | |
| f'Vocoder ckpt \'{hparams["vocoder_ckpt"]}\' not found. ' \ | |
| f'Please put it to the checkpoints directory to run inference.' | |
| # For compatibility: | |
| # migrate timesteps, K_step, K_step_infer, diff_speedup to time_scale_factor, T_start, T_start_infer, sampling_steps | |
| if 'diff_speedup' not in hparams and 'pndm_speedup' in hparams: | |
| hparams['diff_speedup'] = hparams['pndm_speedup'] | |
| if 'T_start' not in hparams: | |
| hparams['T_start'] = 1 - hparams['K_step'] / hparams['timesteps'] | |
| if 'T_start_infer' not in hparams: | |
| hparams['T_start_infer'] = 1 - hparams['K_step_infer'] / hparams['timesteps'] | |
| if 'sampling_steps' not in hparams: | |
| if hparams['use_shallow_diffusion']: | |
| hparams['sampling_steps'] = hparams['K_step_infer'] // hparams['diff_speedup'] | |
| else: | |
| hparams['sampling_steps'] = hparams['timesteps'] // hparams['diff_speedup'] | |
| if 'time_scale_factor' not in hparams: | |
| hparams['time_scale_factor'] = hparams['timesteps'] | |
| if depth is not None: | |
| assert depth <= 1 - hparams['T_start'], ( | |
| f"Depth should not be larger than 1 - T_start ({1 - hparams['T_start']})" | |
| ) | |
| hparams['K_step_infer'] = round(hparams['timesteps'] * depth) | |
| hparams['T_start_infer'] = 1 - depth | |
| if steps is not None: | |
| if hparams['use_shallow_diffusion']: | |
| step_size = (1 - hparams['T_start_infer']) / steps | |
| if 'K_step_infer' in hparams: | |
| hparams['diff_speedup'] = round(step_size * hparams['K_step_infer']) | |
| else: | |
| if 'timesteps' in hparams: | |
| hparams['diff_speedup'] = round(hparams['timesteps'] / steps) | |
| hparams['sampling_steps'] = steps | |
| spk_mix = parse_commandline_spk_mix(spk) if hparams['use_spk_id'] and spk is not None else None | |
| for param in params: | |
| if gender is not None and hparams['use_key_shift_embed']: | |
| param['gender'] = gender | |
| if spk_mix is not None: | |
| param['spk_mix'] = spk_mix | |
| from inference.ds_acoustic import DiffSingerAcousticInfer | |
| infer_ins = DiffSingerAcousticInfer(load_vocoder=not mel, ckpt_steps=ckpt) | |
| print(f'| Model: {type(infer_ins.model)}') | |
| try: | |
| infer_ins.run_inference( | |
| params, out_dir=out, title=name, num_runs=num, | |
| spk_mix=spk_mix, seed=seed, save_mel=mel | |
| ) | |
| except KeyboardInterrupt: | |
| exit(-1) | |
| def variance( | |
| proj: pathlib.Path, | |
| exp: str, | |
| ckpt: int, | |
| spk: str, | |
| predict: Tuple[str], | |
| out: pathlib.Path, | |
| title: str, | |
| num: int, | |
| key: int, | |
| expr: float, | |
| seed: int, | |
| steps: int | |
| ): | |
| name = proj.stem if not title else title | |
| if out is None: | |
| out = proj.parent | |
| if (not out or out.resolve() == proj.parent.resolve()) and not title: | |
| name += '_variance' | |
| with open(proj, 'r', encoding='utf-8') as f: | |
| params = json.load(f) | |
| if not isinstance(params, list): | |
| params = [params] | |
| params = [OrderedDict(p) for p in params] | |
| if len(params) == 0: | |
| print('The input file is empty.') | |
| exit() | |
| from utils.infer_utils import trans_key, parse_commandline_spk_mix | |
| if key != 0: | |
| params = trans_key(params, key) | |
| key_suffix = '%+dkey' % key | |
| if not title: | |
| name += key_suffix | |
| print(f'| key transition: {key:+d}') | |
| sys.argv = [ | |
| sys.argv[0], | |
| '--exp_name', | |
| exp, | |
| '--infer' | |
| ] | |
| from utils.hparams import set_hparams, hparams | |
| set_hparams() | |
| # For compatibility: | |
| # migrate timesteps, K_step, K_step_infer, diff_speedup to time_scale_factor, T_start, T_start_infer, sampling_steps | |
| if 'diff_speedup' not in hparams and 'pndm_speedup' in hparams: | |
| hparams['diff_speedup'] = hparams['pndm_speedup'] | |
| if 'sampling_steps' not in hparams: | |
| hparams['sampling_steps'] = hparams['timesteps'] // hparams['diff_speedup'] | |
| if 'time_scale_factor' not in hparams: | |
| hparams['time_scale_factor'] = hparams['timesteps'] | |
| if steps is not None: | |
| if 'timesteps' in hparams: | |
| hparams['diff_speedup'] = round(hparams['timesteps'] / steps) | |
| hparams['sampling_steps'] = steps | |
| spk_mix = parse_commandline_spk_mix(spk) if hparams['use_spk_id'] and spk is not None else None | |
| for param in params: | |
| if expr is not None: | |
| param['expr'] = expr | |
| if spk_mix is not None: | |
| param['ph_spk_mix_backup'] = param.get('ph_spk_mix') | |
| param['spk_mix_backup'] = param.get('spk_mix') | |
| param['ph_spk_mix'] = param['spk_mix'] = spk_mix | |
| from inference.ds_variance import DiffSingerVarianceInfer | |
| infer_ins = DiffSingerVarianceInfer(ckpt_steps=ckpt, predictions=set(predict)) | |
| print(f'| Model: {type(infer_ins.model)}') | |
| try: | |
| infer_ins.run_inference( | |
| params, out_dir=out, title=name, | |
| num_runs=num, seed=seed | |
| ) | |
| except KeyboardInterrupt: | |
| exit(-1) | |
| if __name__ == '__main__': | |
| main() | |