{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "Copyright 2020 The TensorFlowTTS Team. All Rights Reserved.\n", "Licensed under the Apache License, Version 2.0 (the \"License\");" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install parallel_wavegan" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/lap13548/anaconda3/envs/tensorflow-tts/lib/python3.7/site-packages/tensorflow_addons/utils/ensure_tf_install.py:68: UserWarning: Tensorflow Addons supports using Python ops for all Tensorflow versions above or equal to 2.2.0 and strictly below 2.3.0 (nightly versions are not supported). \n", " The versions of TensorFlow you are currently using is 2.3.0 and is not supported. \n", "Some things might work, some things might not.\n", "If you were to encounter a bug, do not file an issue.\n", "If you want to make sure you're using a tested and supported configuration, either change the TensorFlow version or the TensorFlow Addons's version. \n", "You can find the compatibility matrix in TensorFlow Addon's readme:\n", "https://github.com/tensorflow/addons\n", " UserWarning,\n" ] } ], "source": [ "import tensorflow as tf\n", "import torch\n", "\n", "from tensorflow_tts.models import TFParallelWaveGANGenerator\n", "from tensorflow_tts.configs import ParallelWaveGANGeneratorConfig\n", "\n", "from parallel_wavegan.models import ParallelWaveGANGenerator\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "tf_model = TFParallelWaveGANGenerator(config=ParallelWaveGANGeneratorConfig(), name=\"parallel_wavegan_generator\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "tf_model._build()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Model: \"parallel_wavegan_generator\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "first_convolution (TFConv1d1 multiple 128 \n", "_________________________________________________________________\n", "tf_conv_in_upsample_net_work multiple 32036 \n", "_________________________________________________________________\n", "residual_block_._0 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._1 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._2 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._3 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._4 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._5 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._6 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._7 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._8 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._9 (TFResidu multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._10 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._11 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._12 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._13 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._14 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._15 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._16 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._17 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._18 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._19 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._20 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._21 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._22 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._23 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._24 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._25 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._26 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._27 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._28 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "residual_block_._29 (TFResid multiple 43264 \n", "_________________________________________________________________\n", "re_lu (ReLU) multiple 0 \n", "_________________________________________________________________\n", "tf_conv1d1x1 (TFConv1d1x1) multiple 4160 \n", "_________________________________________________________________\n", "re_lu_1 (ReLU) multiple 0 \n", "_________________________________________________________________\n", "tf_conv1d1x1_1 (TFConv1d1x1) multiple 65 \n", "_________________________________________________________________\n", "activation_12 (Activation) multiple 0 \n", "=================================================================\n", "Total params: 1,334,309\n", "Trainable params: 1,334,309\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ] } ], "source": [ "tf_model.summary()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "torch_checkpoints = torch.load(\"./checkpoint-400000steps.pkl\", map_location=torch.device('cpu'))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "torch_generator_weights = torch_checkpoints[\"model\"][\"generator\"]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "torch_model = ParallelWaveGANGenerator()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "torch_model.load_state_dict(torch_checkpoints[\"model\"][\"generator\"])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "torch_model.remove_weight_norm()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1334309" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_parameters = filter(lambda p: p.requires_grad, torch_model.parameters())\n", "params = sum([np.prod(p.size()) for p in model_parameters])\n", "params" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# in pytorch, in convolution layer, the order is bias -> weight, in tf it is weight -> bias. We need re-order.\n", "\n", "def convert_weights_pytorch_to_tensorflow(weights_pytorch):\n", " \"\"\"\n", " Convert pytorch Conv1d weight variable to tensorflow Conv2D weights.\n", " 1D: Pytorch (f_output, f_input, kernel_size) -> TF (kernel_size, f_input, 1, f_output)\n", " 2D: Pytorch (f_output, f_input, kernel_size_h, kernel_size_w) -> TF (kernel_size_w, kernel_size_h, f_input, 1, f_output)\n", " \"\"\"\n", " if len(weights_pytorch.shape) == 3: # conv1d-kernel\n", " weights_tensorflow = np.transpose(weights_pytorch, (0,2,1)) # [f_output, kernel_size, f_input]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (1,0,2)) # [kernel-size, f_output, f_input]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (0,2,1)) # [kernel-size, f_input, f_output]\n", " return weights_tensorflow\n", " elif len(weights_pytorch.shape) == 1: # conv1d-bias\n", " return weights_pytorch\n", " elif len(weights_pytorch.shape) == 4: # conv2d-kernel\n", " weights_tensorflow = np.transpose(weights_pytorch, (0,2,1,3)) # [f_output, kernel_size_h, f_input, kernel_size_w]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (1,0,2,3)) # [kernel-size_h, f_output, f_input, kernel-size-w]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (0,2,1,3)) # [kernel_size_h, f_input, f_output, kernel-size-w]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (0,1,3,2)) # [kernel_size_h, f_input, kernel-size-w, f_output]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (0,2,1,3)) # [kernel_size_h, kernel-size-w, f_input, f_output]\n", " weights_tensorflow = np.transpose(weights_tensorflow, (1,0,2,3)) # [kernel-size_w, kernel_size_h, f_input, f_output]\n", " return weights_tensorflow\n", "\n", "torch_weights = []\n", "all_keys = list(torch_model.state_dict().keys())\n", "all_values = list(torch_model.state_dict().values())\n", "\n", "idx_already_append = []\n", "\n", "for i in range(len(all_keys) -1):\n", " if i not in idx_already_append:\n", " if all_keys[i].split(\".\")[0:-1] == all_keys[i + 1].split(\".\")[0:-1]:\n", " if all_keys[i].split(\".\")[-1] == \"bias\" and all_keys[i + 1].split(\".\")[-1] == \"weight\":\n", " torch_weights.append(convert_weights_pytorch_to_tensorflow(all_values[i + 1].cpu().detach().numpy()))\n", " torch_weights.append(convert_weights_pytorch_to_tensorflow(all_values[i].cpu().detach().numpy()))\n", " idx_already_append.append(i)\n", " idx_already_append.append(i + 1)\n", " else:\n", " if i not in idx_already_append:\n", " torch_weights.append(convert_weights_pytorch_to_tensorflow(all_values[i].cpu().detach().numpy()))\n", " idx_already_append.append(i)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "tf_var = tf_model.trainable_variables" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "for i, var in enumerate(tf_var):\n", " tf.keras.backend.set_value(var, torch_weights[i])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "feats = np.load(\"LJ001-0009-norm-feats.npy\")" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "feats = np.expand_dims(feats, 0)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "audio = tf_model(feats)[0, :, 0]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(audio)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "from IPython.display import Audio" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Audio(audio, rate=22050)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }