/scripts/voice_conversion_test.py

https://github.com/Hiroshiba/become-yukarin
Python | 76 lines | 60 code | 16 blank | 0 comment | 10 complexity | 9074ddd0b0046ab8715256b6eaa205ba MD5 | raw file
  1. import argparse
  2. import glob
  3. import multiprocessing
  4. import re
  5. from functools import partial
  6. from pathlib import Path
  7. import librosa
  8. import numpy
  9. from become_yukarin import AcousticConverter
  10. from become_yukarin.config.config import create_from_json as create_config
  11. parser = argparse.ArgumentParser()
  12. parser.add_argument('model_names', nargs='+')
  13. parser.add_argument('-md', '--model_directory', type=Path, default=Path('/mnt/dwango/hiroshiba/become-yukarin/'))
  14. parser.add_argument('-iwd', '--input_wave_directory', type=Path,
  15. default=Path('/mnt/dwango/hiroshiba/become-yukarin/dataset/hiho-wave/hiho-pause-atr503-subset/'))
  16. parser.add_argument('-it', '--iteration', type=int)
  17. parser.add_argument('-g', '--gpu', type=int)
  18. args = parser.parse_args()
  19. model_directory = args.model_directory # type: Path
  20. input_wave_directory = args.input_wave_directory # type: Path
  21. it = args.iteration
  22. gpu = args.gpu
  23. paths_test = list(Path('./test_data/').glob('*.wav'))
  24. def extract_number(f):
  25. s = re.findall("\d+", str(f))
  26. return int(s[-1]) if s else -1
  27. def process(p: Path, acoustic_converter: AcousticConverter):
  28. try:
  29. if p.suffix in ['.npy', '.npz']:
  30. fn = glob.glob(str(input_wave_directory / p.stem) + '.*')[0]
  31. p = Path(fn)
  32. wave = acoustic_converter(p)
  33. librosa.output.write_wav(str(output / p.stem) + '.wav', wave.wave, wave.sampling_rate, norm=True)
  34. except:
  35. import traceback
  36. print('error!', str(p))
  37. print(traceback.format_exc())
  38. for model_name in args.model_names:
  39. base_model = model_directory / model_name
  40. config = create_config(base_model / 'config.json')
  41. input_paths = list(sorted([Path(p) for p in glob.glob(str(config.dataset.input_glob))]))
  42. numpy.random.RandomState(config.dataset.seed).shuffle(input_paths)
  43. path_train = input_paths[0]
  44. path_test = input_paths[-1]
  45. if it is not None:
  46. model_path = base_model / 'predictor_{}.npz'.format(it)
  47. else:
  48. model_paths = base_model.glob('predictor_*.npz')
  49. model_path = list(sorted(model_paths, key=extract_number))[-1]
  50. print(model_path)
  51. acoustic_converter = AcousticConverter(config, model_path, gpu=gpu)
  52. output = Path('./output').absolute() / base_model.name
  53. output.mkdir(exist_ok=True)
  54. paths = [path_train, path_test] + paths_test
  55. process_partial = partial(process, acoustic_converter=acoustic_converter)
  56. if gpu is None:
  57. pool = multiprocessing.Pool()
  58. pool.map(process_partial, paths)
  59. else:
  60. list(map(process_partial, paths))