def preprocess(experiment: Experiment, args: Mapping) -> None:
    """ Preprocesses wavs and text, returns None or raises an Exception. """
    # bring data in format usable by Tacotron-2
    # for now just copy them over
    raw_wav_dir = os.path.join(experiment.paths["acoustic_model"],
                               "LJSpeech-1.1", "wavs")
    fu.ensure_dir(raw_wav_dir)
    fu.copy_files(args["wav_dir"], raw_wav_dir)
    raw_metadata_file = os.path.join(experiment.paths["acoustic_model"],
                                     "LJSpeech-1.1", "metadata.csv")
    fu.copy_file(args["text_file"], raw_metadata_file)

    # run Tacotron-2 preprocessing
    tacoargs = namedtuple(
        "tacoargs",
        "base_dir hparams dataset language voice reader merge_books book output n_jobs"
        .split())
    tacoargs.base_dir = experiment.paths["acoustic_model"]
    tacoargs.language = experiment.config["language"]
    tacoargs.output = experiment.paths["acoustic_features"]
    tacoargs.hparams = ""
    tacoargs.n_jobs = multiprocessing.cpu_count()
    # for now we always exploit the LJ settings
    tacoargs.dataset = "LJSpeech-1.1"
    tacoargs.voice = "female"
    tacoargs.reader = "LJ"
    tacoargs.merge_books = "True"
    tacoargs.book = "northandsouth"

    modified_hp = tacotron2.hparams.hparams.parse(tacoargs.hparams)
    tacotron2.preprocess.run_preprocess(tacoargs, modified_hp)
def download_pretrained(experiment: Experiment, url: str) -> None:
    """ Downloads a pretrained model. """
    pretrained_dir = _get_pretrained_folder(experiment)
    pretrained_zip = os.path.join(pretrained_dir, "wavernnalt_pretrained.zip")
    fu.ensure_dir(pretrained_dir)
    fu.download_file(url, pretrained_zip)
    with zipfile.ZipFile(pretrained_zip, 'r') as zip_ref:
        zip_ref.extractall(pretrained_dir)
    os.remove(pretrained_zip)
Exemple #3
0
def download_pretrained(experiment: Experiment, url: str) -> None:
    """ Downloads a pretrained model. """
    pretrained_dir = os.path.join(experiment.paths["acoustic_model"],
                                  "logs-Tacotron")
    pretrained_zip = os.path.join(pretrained_dir, "taco_pretrained.zip")
    fu.ensure_dir(pretrained_dir)
    fu.download_file(url, pretrained_zip)
    with zipfile.ZipFile(pretrained_zip, 'r') as zip_ref:
        zip_ref.extractall(pretrained_dir)
    os.remove(pretrained_zip)
Exemple #4
0
def get_pretrained_wavernn(model_id, targetdir):
    """ Downloads a pretrained waveRNN model. """
    if model_id not in consts.PRETRAINED_WAVERNN_MODELS:
        raise FileNotFoundError(model_id)

    (model_url, model_filename) = consts.PRETRAINED_WAVERNN_MODELS[model_id]
    model_dir = os.path.join(targetdir, model_id)
    model_path = os.path.join(model_dir, model_filename)
    if os.path.exists(model_path):
        return model_path

    fu.ensure_dir(model_dir)
    fu.download_file(model_url, model_path)
    return model_path
Exemple #5
0
def synthesize(sentences, output_dir):
    # Tacotron first
    args = namedtuple(
        "tacoargs", "mode model checkpoint output_dir mels_dir hparams name".split())
    args.mode = "eval"
    args.model = "Tacotron-2"
    args.checkpoint = "pretrained/"
    args.output_dir = "output"
    args.mels_dir = "tacotron_output/eval"
    args.base_dir = ''
    args.input_dir = 'training_data/'
    args.hparams = ''
    args.name = "Tacotron-2"
    args.log_dir = None
    taco_checkpoint, _, hparams = prepare_run(args)
    taco_checkpoint = os.path.join("tacotron2", taco_checkpoint)
    tacotron_synthesize(args, hparams, taco_checkpoint, sentences)

    # now WaveRNN
    if not os.path.exists(MODEL_PATH):
        raise FileNotFoundError(MODEL_PATH)

    model = Model(rnn_dims=512, fc_dims=512, bits=bits, pad=2,
                  upsample_factors=(5, 5, 11), feat_dims=80,
                  compute_dims=128, res_out_dims=128, res_blocks=10).to(device)

    print("Loading WaveRNN model from " + MODEL_PATH)
    model.load_state_dict(torch.load(MODEL_PATH))


    # mels_paths = [f for f in sorted(
    #     os.listdir(args.mels_dir)) if f.endswith(".npy")]
    map_path = os.path.join(args.mels_dir, 'map.txt')
    f = open(map_path)
    maps = f.readlines()
    f.close()

    mels_paths = [x.split('|')[1] for x in maps]
    test_mels = [np.load(m).T for m in mels_paths]


    fu.ensure_dir(output_dir)

    for i, mel in enumerate(test_mels):
        print('\nGenerating: %i/%i' % (i+1, len(test_mels)))
        model.generate(mel, output_dir + f'/{i}_generated.wav')
Exemple #6
0
def generate(experiment: Experiment,
             sentences,
             generate_features: bool = True,
             generate_waveforms: bool = True) -> None:
    """
    Generates from the model.

    :param Experiment experiment: The experiment to generate from.
    :param bool generate_features: Store acoustic features
    :param bool generate_waveforms: Generate a waveform from acoustic features using Griffin-Lim
    """
    # python synthesize.py --model Tacotron --tacotron_name Tacotron-2 --mode eval --text_list text_list.txt &> /dev/null
    tacoargs = namedtuple(
        "tacoargs",
        "mode model checkpoint output_dir mels_dir hparams name tacotron_name GTA"
        .split())
    tacoargs.checkpoint = _get_pretrained_folder(experiment)
    tacoargs.hparams = ''
    tacoargs.name = "Tacotron"
    tacoargs.tacotron_name = "Tacotron"
    tacoargs.model = "Tacotron"
    #tacoargs.input_dir = 'training_data/'
    tacoargs.mels_dir = experiment.paths["acoustic2wavegen_features"]
    tacoargs.output_dir = experiment.paths["acoustic2wavegen_features"]
    tacoargs.mode = "eval"
    tacoargs.GTA = False
    #tacoargs.base_dir = ''
    #tacoargs.log_dir = None
    #taco_checkpoint, _, hparams = tacotron2.synthesize.prepare_run(tacoargs)
    modified_hp = tacotron2.hparams.hparams.parse(tacoargs.hparams)
    #taco_checkpoint = os.path.join("tacotron2", taco_checkpoint)
    tacotron2.tacotron.synthesize.tacotron_synthesize(tacoargs, modified_hp,
                                                      tacoargs.checkpoint,
                                                      sentences)
    output_dir = os.path.join(experiment.paths["synthesized_wavs"],
                              "griffinlim")
    fu.ensure_dir(output_dir)
    fu.copy_files(
        os.path.join(experiment.paths["acoustic2wavegen_features"],
                     "logs-eval", "wavs"), output_dir)
Exemple #7
0
def generate(experiment: Experiment, sentences=None) -> None:
    """
    Generates waveforms from existing acoustic features.

    :param Experiment experiment: The experiment to generate from.
    :param sentences: List of feature files to synthesize. If None synthesizes all files in the feature folder. 
    """
    mels_dir = experiment.paths["acoustic2wavegen_features"]
    output_dir = os.path.join(experiment.paths["synthesized_wavs"], "wavernn")
    fu.ensure_dir(output_dir)
    pretrained_dir = _get_pretrained_folder(experiment)
    checkpoint_file = os.path.join(pretrained_dir, "checkpoint.pth")
    map_file = os.path.join(mels_dir, "eval", "map.txt")
    print(map_file)
    map_content = np.genfromtxt(map_file, dtype=None, delimiter='|')
    for i, line in enumerate(map_content):
        (text, mel_file, _) = line
        LOGGER.info("Generating waveform from %s with text: %s" % (line, text))
        mel_file = mel_file.decode("utf-8")
        mel = np.load(mel_file).T
        output_file = os.path.join(output_dir, os.path.basename(mel_file))
        wsynth.main(mel, checkpoint_file, output_file)
def convert_training_data(experiment: Experiment, args: Mapping) -> None:
    """ Converts output of acoustic model for training, returns None or raises an Exception. """
    # TODO: load voice specific hparams
    # wpreproc.hp.override_from_dict(otherhparams.values())
    dataset_ids = []
    map_file = os.path.join(
        experiment.paths["acoustic2wavegen_training_features"], "map.txt")
    output_dir = experiment.paths["wavegen_features"]
    output_wav_dir = os.path.join(output_dir, "wav")
    output_mel_dir = os.path.join(output_dir, "mel")
    output_test_dir = os.path.join(output_dir, "test")
    fu.ensure_dir(output_wav_dir)
    fu.ensure_dir(output_mel_dir)
    fu.ensure_dir(output_test_dir)

    if not os.path.exists(map_file):
        # in future we might find the files by some other means
        raise FileNotFoundError(map_file)

    # read map file to get paths to audio, original mel and GTA mel
    gta_map = np.genfromtxt(map_file, dtype=None, delimiter='|')
    for i, line in enumerate(gta_map):
        (audio_file, mel_file, gta_file, _, _) = line
        fileid = "%05d" % (i)
        LOGGER.info("Converting %s and %s" % (audio_file, gta_file))
        gta_mel = np.load(gta_file.decode("utf-8")).T
        #audio, mel = wpreproc.get_wav_mel(audio_file.decode("utf-8"))
        audio = wpreproc.get_wav(audio_file.decode("utf-8"))

        if i < NUM_TEST_FILES:
            np.save(os.path.join(output_test_dir, "test_{}_mel.npy".format(i)),
                    gta_mel.astype(np.float32))
            np.save(os.path.join(output_test_dir, "test_{}_wav.npy".format(i)),
                    audio)
        else:
            np.save(os.path.join(output_mel_dir, fileid),
                    gta_mel.astype(np.float32))
            np.save(os.path.join(output_wav_dir, fileid), audio)
            dataset_ids.append(fileid)

    with open(os.path.join(output_dir, 'dataset_ids.pkl'), 'wb') as f:
        pickle.dump(dataset_ids, f)
Exemple #9
0
def create_file_structure(experiment_path):
    """ Creates the folder structure for a new experiment. """
    fu.ensure_dir(experiment_path)
    return _apply_file_structure(experiment_path, _create_subfolder)
Exemple #10
0
def _create_subfolder(experiment_path, folder):
    """ Creates a subfolder inside the experiment directory. """
    absfolder = os.path.join(experiment_path, folder)
    fu.ensure_dir(absfolder)
    return absfolder