92 lines
3.1 KiB
Python
92 lines
3.1 KiB
Python
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
from __future__ import division
|
|
import os
|
|
import argparse
|
|
import ruamel.yaml
|
|
import numpy as np
|
|
import soundfile as sf
|
|
|
|
from paddle import fluid
|
|
fluid.require_version('1.8.0')
|
|
import paddle.fluid.layers as F
|
|
import paddle.fluid.dygraph as dg
|
|
from tensorboardX import SummaryWriter
|
|
|
|
from parakeet.g2p import en
|
|
from parakeet.modules.weight_norm import WeightNormWrapper
|
|
from parakeet.utils.layer_tools import summary
|
|
from parakeet.utils import io
|
|
|
|
from model import make_model
|
|
from utils import make_evaluator
|
|
|
|
if __name__ == "__main__":
|
|
parser = argparse.ArgumentParser(
|
|
description="Synthsize waveform with a checkpoint.")
|
|
parser.add_argument("--config", type=str, help="experiment config")
|
|
parser.add_argument("--device", type=int, default=-1, help="device to use")
|
|
|
|
g = parser.add_mutually_exclusive_group()
|
|
g.add_argument("--checkpoint", type=str, help="checkpoint to resume from")
|
|
g.add_argument(
|
|
"--iteration",
|
|
type=int,
|
|
help="the iteration of the checkpoint to load from output directory")
|
|
|
|
parser.add_argument("text", type=str, help="text file to synthesize")
|
|
parser.add_argument(
|
|
"output", type=str, help="path to save synthesized audio")
|
|
|
|
args = parser.parse_args()
|
|
with open(args.config, 'rt') as f:
|
|
config = ruamel.yaml.safe_load(f)
|
|
|
|
print("Command Line Args: ")
|
|
for k, v in vars(args).items():
|
|
print("{}: {}".format(k, v))
|
|
|
|
if args.device == -1:
|
|
place = fluid.CPUPlace()
|
|
else:
|
|
place = fluid.CUDAPlace(args.device)
|
|
|
|
dg.enable_dygraph(place)
|
|
|
|
model = make_model(config)
|
|
checkpoint_dir = os.path.join(args.output, "checkpoints")
|
|
if args.checkpoint is not None:
|
|
iteration = io.load_parameters(model, checkpoint_path=args.checkpoint)
|
|
else:
|
|
iteration = io.load_parameters(
|
|
model, checkpoint_dir=checkpoint_dir, iteration=args.iteration)
|
|
|
|
# WARNING: don't forget to remove weight norm to re-compute each wrapped layer's weight
|
|
# removing weight norm also speeds up computation
|
|
for layer in model.sublayers():
|
|
if isinstance(layer, WeightNormWrapper):
|
|
layer.remove_weight_norm()
|
|
|
|
synthesis_dir = os.path.join(args.output, "synthesis")
|
|
if not os.path.exists(synthesis_dir):
|
|
os.makedirs(synthesis_dir)
|
|
|
|
with open(args.text, "rt", encoding="utf-8") as f:
|
|
lines = f.readlines()
|
|
sentences = [line[:-1] for line in lines]
|
|
|
|
evaluator = make_evaluator(config, sentences, synthesis_dir)
|
|
evaluator(model, iteration)
|