{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "ESPnet Speech Translation Demo", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "accelerator": "GPU" }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "MuhqhYSToxl7", "colab_type": "text" }, "source": [ "# ESPnet Speech Translation Demonstration\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/espnet/notebook/blob/master/st_demo.ipynb)\n", "\n", "See also\n", "\n", "- ESPnet: https://github.com/espnet/espnet\n", "- ESPnet documentation: https://espnet.github.io/espnet/\n", "- TTS demo: https://colab.research.google.com/github/espnet/notebook/blob/master/tts_realtime_demo.ipynb \n", "\n", "Author: [Shigeki Karita](https://github.com/ShigekiKarita)" ] }, { "cell_type": "markdown", "metadata": { "id": "9e_i_gdgAFNJ", "colab_type": "text" }, "source": [ "## Install\n", "\n", "It takes around 3 minutes. Please keep waiting for a while." ] }, { "cell_type": "code", "metadata": { "id": "fjJ5zkyaoy29", "colab_type": "code", "outputId": "c40db280-2edb-4a4f-c86a-ecf00ba3112c", "colab": { "base_uri": "https://localhost:8080/", "height": 1000 } }, "source": [ "# OS setup\n", "!cat /etc/os-release\n", "!apt-get install -qq bc tree sox\n", "\n", "# espnet and moses setup\n", "!git clone -q https://github.com/ShigekiKarita/espnet.git\n", "!pip install -q torch==1.1\n", "!cd espnet; git checkout c0466d9a356c1a33f671a546426d7bc33b5b17e8; pip install -q -e .\n", "!cd espnet/tools/; make moses.done\n", "\n", "# download pre-compiled warp-ctc and kaldi tools\n", "!espnet/utils/download_from_google_drive.sh \\\n", " \"https://drive.google.com/open?id=13Y4tSygc8WtqzvAVGK_vRV9GlV7TRC0w\" espnet/tools tar.gz > /dev/null\n", "\n", "# make dummy activate\n", "!mkdir -p espnet/tools/venv/bin && touch espnet/tools/venv/bin/activate\n", "!echo \"setup done.\"" ], "execution_count": 1, "outputs": [ { "output_type": "stream", "text": [ "NAME=\"Ubuntu\"\n", "VERSION=\"18.04.3 LTS (Bionic Beaver)\"\n", "ID=ubuntu\n", "ID_LIKE=debian\n", "PRETTY_NAME=\"Ubuntu 18.04.3 LTS\"\n", "VERSION_ID=\"18.04\"\n", "HOME_URL=\"https://www.ubuntu.com/\"\n", "SUPPORT_URL=\"https://help.ubuntu.com/\"\n", "BUG_REPORT_URL=\"https://bugs.launchpad.net/ubuntu/\"\n", "PRIVACY_POLICY_URL=\"https://www.ubuntu.com/legal/terms-and-policies/privacy-policy\"\n", "VERSION_CODENAME=bionic\n", "UBUNTU_CODENAME=bionic\n", "Selecting previously unselected package libopencore-amrnb0:amd64.\n", "(Reading database ... 145674 files and directories currently installed.)\n", "Preparing to unpack .../0-libopencore-amrnb0_0.1.3-2.1_amd64.deb ...\n", "Unpacking libopencore-amrnb0:amd64 (0.1.3-2.1) ...\n", "Selecting previously unselected package libopencore-amrwb0:amd64.\n", "Preparing to unpack .../1-libopencore-amrwb0_0.1.3-2.1_amd64.deb ...\n", "Unpacking libopencore-amrwb0:amd64 (0.1.3-2.1) ...\n", "Selecting previously unselected package libmagic-mgc.\n", "Preparing to unpack .../2-libmagic-mgc_1%3a5.32-2ubuntu0.3_amd64.deb ...\n", "Unpacking libmagic-mgc (1:5.32-2ubuntu0.3) ...\n", "Selecting previously unselected package libmagic1:amd64.\n", "Preparing to unpack .../3-libmagic1_1%3a5.32-2ubuntu0.3_amd64.deb ...\n", "Unpacking libmagic1:amd64 (1:5.32-2ubuntu0.3) ...\n", "Selecting previously unselected package bc.\n", "Preparing to unpack .../4-bc_1.07.1-2_amd64.deb ...\n", "Unpacking bc (1.07.1-2) ...\n", "Selecting previously unselected package libsox3:amd64.\n", "Preparing to unpack .../5-libsox3_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", "Unpacking libsox3:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", "Selecting previously unselected package libsox-fmt-alsa:amd64.\n", "Preparing to unpack .../6-libsox-fmt-alsa_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", "Unpacking libsox-fmt-alsa:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", "Selecting previously unselected package libsox-fmt-base:amd64.\n", "Preparing to unpack .../7-libsox-fmt-base_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", "Unpacking libsox-fmt-base:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", "Selecting previously unselected package sox.\n", "Preparing to unpack .../8-sox_14.4.2-3ubuntu0.18.04.1_amd64.deb ...\n", "Unpacking sox (14.4.2-3ubuntu0.18.04.1) ...\n", "Selecting previously unselected package tree.\n", "Preparing to unpack .../9-tree_1.7.0-5_amd64.deb ...\n", "Unpacking tree (1.7.0-5) ...\n", "Setting up tree (1.7.0-5) ...\n", "Setting up libmagic-mgc (1:5.32-2ubuntu0.3) ...\n", "Setting up libmagic1:amd64 (1:5.32-2ubuntu0.3) ...\n", "Setting up libopencore-amrnb0:amd64 (0.1.3-2.1) ...\n", "Setting up bc (1.07.1-2) ...\n", "Setting up libopencore-amrwb0:amd64 (0.1.3-2.1) ...\n", "Setting up libsox3:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", "Setting up libsox-fmt-base:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", "Setting up libsox-fmt-alsa:amd64 (14.4.2-3ubuntu0.18.04.1) ...\n", "Setting up sox (14.4.2-3ubuntu0.18.04.1) ...\n", "Processing triggers for libc-bin (2.27-3ubuntu1) ...\n", "Processing triggers for man-db (2.8.3-2ubuntu0.1) ...\n", "Processing triggers for mime-support (3.60ubuntu1) ...\n", "\u001b[K |████████████████████████████████| 676.9MB 15kB/s \n", "\u001b[31mERROR: torchvision 0.4.2 has requirement torch==1.3.1, but you'll have torch 1.1.0 which is incompatible.\u001b[0m\n", "\u001b[K |████████████████████████████████| 890kB 3.5MB/s \n", "\u001b[K |████████████████████████████████| 25.2MB 129kB/s \n", "\u001b[K |████████████████████████████████| 1.6MB 40.6MB/s \n", "\u001b[K |████████████████████████████████| 245kB 43.4MB/s \n", "\u001b[K |████████████████████████████████| 174kB 62.9MB/s \n", "\u001b[K |████████████████████████████████| 2.8MB 45.2MB/s \n", "\u001b[K |████████████████████████████████| 204kB 48.5MB/s \n", "\u001b[K |████████████████████████████████| 40kB 7.5MB/s \n", "\u001b[K |████████████████████████████████| 276kB 55.7MB/s \n", "\u001b[K |████████████████████████████████| 1.0MB 48.2MB/s \n", "\u001b[K |████████████████████████████████| 419kB 55.3MB/s \n", "\u001b[K |████████████████████████████████| 1.5MB 40.0MB/s \n", "\u001b[K |████████████████████████████████| 1.7MB 42.1MB/s \n", "\u001b[K |████████████████████████████████| 3.1MB 40.1MB/s \n", "\u001b[K |████████████████████████████████| 81kB 12.7MB/s \n", "\u001b[K |████████████████████████████████| 1.2MB 47.5MB/s \n", "\u001b[K |████████████████████████████████| 92kB 14.1MB/s \n", "\u001b[K |████████████████████████████████| 368kB 46.3MB/s \n", "\u001b[K |████████████████████████████████| 184kB 57.0MB/s \n", "\u001b[K |████████████████████████████████| 512kB 46.2MB/s \n", "\u001b[?25h Building wheel for chainer (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for librosa (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for kaldiio (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for configargparse (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for PyYAML (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for pysptk (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for nltk (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for nnmnkwii (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for jaconv (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for torch-complex (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for pytorch-wpe (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for simplejson (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for bandmat (setup.py) ... \u001b[?25l\u001b[?25hdone\n", " Building wheel for distance (setup.py) ... \u001b[?25l\u001b[?25hdone\n", "\u001b[31mERROR: albumentations 0.1.12 has requirement imgaug<0.2.7,>=0.2.5, but you'll have imgaug 0.2.9 which is incompatible.\u001b[0m\n", "\u001b[31mERROR: tensorboardx 2.0 has requirement protobuf>=3.8.0, but you'll have protobuf 3.7.1 which is incompatible.\u001b[0m\n", "git clone https://github.com/moses-smt/mosesdecoder.git moses\n", "Cloning into 'moses'...\n", "remote: Enumerating objects: 219, done.\u001b[K\n", "remote: Counting objects: 100% (219/219), done.\u001b[K\n", "remote: Compressing objects: 100% (129/129), done.\u001b[K\n", "remote: Total 147514 (delta 132), reused 135 (delta 84), pack-reused 147295\u001b[K\n", "Receiving objects: 100% (147514/147514), 129.75 MiB | 22.22 MiB/s, done.\n", "Resolving deltas: 100% (113966/113966), done.\n", "touch moses.done\n", "--2020-02-01 06:23:17-- https://drive.google.com/uc?export=download&id=13Y4tSygc8WtqzvAVGK_vRV9GlV7TRC0w\n", "Resolving drive.google.com (drive.google.com)... 172.217.212.113, 172.217.212.100, 172.217.212.139, ...\n", "Connecting to drive.google.com (drive.google.com)|172.217.212.113|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: unspecified [text/html]\n", "Saving to: ‘espnet/tools/gX5bJU.tar.gz’\n", "\n", "espnet/tools/gX5bJU [ <=> ] 3.22K --.-KB/s in 0s \n", "\n", "2020-02-01 06:23:17 (50.9 MB/s) - ‘espnet/tools/gX5bJU.tar.gz’ saved [3295]\n", "\n", "\n", "gzip: stdin: not in gzip format\n", "tar: Child returned status 1\n", "tar: Error is not recoverable: exiting now\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 3295 0 3295 0 0 30509 0 --:--:-- --:--:-- --:--:-- 30509\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 408 0 408 0 0 4387 0 --:--:-- --:--:-- --:--:-- 4387\n", " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", "100 662M 0 662M 0 0 62.8M 0 --:--:-- 0:00:10 --:--:-- 72.3M\n", "setup done.\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "3lMJyJcLCsd4", "colab_type": "text" }, "source": [ "\n", "\n", "---\n", "## Spanish speech -> English text translation\n", "\n", "This audio says \"yo soy José.\"" ] }, { "cell_type": "code", "metadata": { "id": "XY-dquZHQY2V", "colab_type": "code", "outputId": "6ed5e2d7-9b5b-4480-c0df-4731932efd67", "colab": { "base_uri": "https://localhost:8080/", "height": 61 } }, "source": [ "from IPython.display import display, Audio\n", "display(Audio(\"/content/espnet/test_utils/st_test.wav\", rate=16000))" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "QFxfW6soSBU4", "colab_type": "text" }, "source": [ "Let's translate this into English text by our pretrained Transformer ST model trained on the Fisher-CALLHOME Spanish dataset." ] }, { "cell_type": "code", "metadata": { "id": "riY5Wr5HHXw3", "colab_type": "code", "outputId": "656a4cf2-9c5c-43ce-b7ca-af453bf04b33", "colab": { "base_uri": "https://localhost:8080/", "height": 938 } }, "source": [ "# move on the recipe directory\n", "import os\n", "os.chdir(\"/content/espnet/egs/fisher_callhome_spanish/st1\")\n", "\n", "!../../../utils/translate_wav.sh --models fisher_callhome_spanish.transformer.v1.es-en ../../../test_utils/st_test.wav | tee /content/translated.txt" ], "execution_count": 2, "outputs": [ { "output_type": "stream", "text": [ "--2020-02-01 06:27:27-- https://drive.google.com/uc?export=download&id=1hawp5ZLw4_SIHIT3edglxbKIIkPVe8n3\n", "Resolving drive.google.com (drive.google.com)... 108.177.112.101, 108.177.112.138, 108.177.112.113, ...\n", "Connecting to drive.google.com (drive.google.com)|108.177.112.101|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: unspecified [text/html]\n", "Saving to: 'decode/download/fisher_callhome_spanish.transformer.v1.es-en/ggCWsF..tar.gz'\n", "\n", "\r decode/do [<=> ] 0 --.-KB/s \rdecode/download/fis [ <=> ] 3.26K --.-KB/s in 0s \n", "\n", "2020-02-01 06:27:27 (71.2 MB/s) - 'decode/download/fisher_callhome_spanish.transformer.v1.es-en/ggCWsF..tar.gz' saved [3338]\n", "\n", "\n", "gzip: stdin: not in gzip format\n", "tar: Child returned status 1\n", "tar: Error is not recoverable: exiting now\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 3338 0 3338 0 0 16944 0 --:--:-- --:--:-- --:--:-- 16944\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 408 0 408 0 0 4039 0 --:--:-- --:--:-- --:--:-- 4039\n", "\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", " 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\n", "100 97.8M 0 97.8M 0 0 82.9M 0 --:--:-- 0:00:01 --:--:-- 174M\n", "conf/tuning/train_pytorch_transformer_bpe_short_long.yaml\n", "conf/tuning/decode_pytorch_transformer_bpe.yaml\n", "conf/specaug.yaml\n", "data/train_sp.en/cmvn.ark\n", "exp/train_sp.en_lc.rm_pytorch_train_pytorch_transformer_bpe_short_long_bpe1000_specaug_asrtrans_mttrans/results/model.val5.avg.best\n", "exp/train_sp.en_lc.rm_pytorch_train_pytorch_transformer_bpe_short_long_bpe1000_specaug_asrtrans_mttrans/results/model.json\n", "Sucessfully downloaded zip file from https://drive.google.com/open?id=1hawp5ZLw4_SIHIT3edglxbKIIkPVe8n3\n", "stage 0: Data preparation\n", "stage 1: Feature Generation\n", "steps/make_fbank_pitch.sh --cmd run.pl --nj 1 --write_utt2num_frames true decode/st_test/data decode/st_test/log decode/st_test/fbank\n", "utils/validate_data_dir.sh: WARNING: you have only one speaker. This probably a bad idea.\n", " Search for the word 'bold' in http://kaldi-asr.org/doc/data_prep.html\n", " for more information.\n", "utils/validate_data_dir.sh: Successfully validated data-directory decode/st_test/data\n", "steps/make_fbank_pitch.sh: [info]: no segments file exists: assuming wav.scp indexed by utterance.\n", "steps/make_fbank_pitch.sh: Succeeded creating filterbank and pitch features for data\n", "/content/espnet/egs/fisher_callhome_spanish/st1/../../../utils/dump.sh --cmd run.pl --nj 1 --do_delta false decode/st_test/data/feats.scp decode/download/fisher_callhome_spanish.transformer.v1.es-en/data/train_sp.en/cmvn.ark decode/st_test/log decode/st_test/dump\n", "stage 2: Json Data Preparation\n", "/content/espnet/egs/fisher_callhome_spanish/st1/../../../utils/data2json.sh --feat decode/st_test/dump/feats.scp decode/st_test/data decode/st_test/dict\n", "/content/espnet/egs/fisher_callhome_spanish/st1/../../../utils/feat_to_shape.sh --cmd run.pl --nj 1 --filetype --preprocess-conf --verbose 0 decode/st_test/dump/feats.scp decode/st_test/data/tmp-1PxS1/input_1/shape.scp\n", "sym2int.pl: replacing X with 1\n", "** Replaced 1 instances of OOVs with 1\n", "stage 3: Decoding\n", "\n", "Detokenizer Version $Revision: 4134 $\n", "Language: en\n", "Translated text: yes i'm jose\n", "\n", "Finished\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "e-eBSs8dS7rQ", "colab_type": "text" }, "source": [ "As seen above, we successfully obtained the result: **\"Translated text: yes i'm jose\"**!" ] }, { "cell_type": "markdown", "metadata": { "id": "Ws2mzque9Zdx", "colab_type": "text" }, "source": [ "## English translated text-to-speech synthesis\n", "\n", "Now let's generate an **English speech** from the translated text using a pretrained ESPnet-TTS model." ] }, { "cell_type": "code", "metadata": { "id": "z-kpfGly8bFN", "colab_type": "code", "outputId": "5b85c29f-4d3b-4cf1-9101-f62b912858f0", "colab": { "base_uri": "https://localhost:8080/", "height": 416 } }, "source": [ "!sed -n 's/Translated text://p' /content/translated.txt | tr '[:lower:]' '[:upper:]' | tee /content/translated_sed.txt\n", "!../../../utils/synth_wav.sh /content/translated_sed.txt" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ " YES I'M JOSE\n", "stage 0: Data preparation\n", "/content/espnet/egs/ljspeech/tts1/../../../utils/data2json.sh --trans_type char decode/translated_sed/data decode/download/ljspeech.transformer.v1/data/lang_1char/train_no_dev_units.txt\n", "stage 2: Decoding\n", "stage 3: Synthesis with Griffin-Lim\n", "apply-cmvn --norm-vars=true --reverse=true decode/download/ljspeech.transformer.v1/data/train_no_dev/cmvn.ark scp:decode/translated_sed/outputs/feats.scp ark,scp:decode/translated_sed/outputs_denorm/feats.ark,decode/translated_sed/outputs_denorm/feats.scp \n", "LOG (apply-cmvn[5.5.428~1-29b3]:main():apply-cmvn.cc:159) Applied cepstral mean and variance normalization to 1 utterances, errors on 0\n", "/content/espnet/egs/ljspeech/tts1/../../../utils/convert_fbank.sh --nj 1 --cmd run.pl --fs 22050 --fmax --fmin --n_fft 1024 --n_shift 256 --win_length --n_mels 80 --iters 64 decode/translated_sed/outputs_denorm decode/translated_sed/log decode/translated_sed/wav\n", "Succeeded creating wav for outputs_denorm\n", "\n", "Synthesized wav: decode/translated_sed/wav/translated_sed.wav\n", "\n", "Finished\n", "stage 4: Synthesis with Neural Vocoder\n", "2020-01-31 05:38:17,532 (decode:95) INFO: The feature loaded from decode/translated_sed/outputs/feats.scp.\n", "2020-01-31 05:38:21,674 (decode:110) INFO: Loaded model parameters from decode/download/ljspeech.parallel_wavegan.v1/ljspeech.parallel_wavegan.v1/checkpoint-400000steps.pkl.\n", "[decode]: 0it [00:00, ?it/s]THCudaCheck FAIL file=/pytorch/aten/src/THC/THCGeneral.cpp line=383 error=11 : invalid argument\n", "[decode]: 1it [00:00, 13.43it/s, RTF=0.0581]\n", "2020-01-31 05:38:21,750 (decode:134) INFO: Finished generation of 1 utterances (RTF = 0.058).\n", "\n", "Synthesized wav: decode/translated_sed/wav_wnv/translated_sed.wav\n", "\n", "Finished\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "OlO_PQvNEgOA", "colab_type": "code", "outputId": "d6c3ba1b-6888-40c3-ea95-8ef2abb19eb9", "colab": { "base_uri": "https://localhost:8080/", "height": 292 } }, "source": [ "import matplotlib.pyplot as plt\n", "import kaldiio\n", "fbank = next(iter(kaldiio.load_scp(\"decode/translated_sed/outputs/feats.scp\").values()))\n", "plt.matshow(fbank.T)" ], "execution_count": 0, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 72 }, { "output_type": "display_data", "data": { "image/png": "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\n1aOVGIyWVCMOh8AVS1L2Ylwivu6d24gBhGoNMQ1Dxwp2M1ji7D9jP2OsG9MKmdHYSqrcLR83mYDH\ncp5TK8jUd2/ZSe81zHGx55E2N0T6W6zMt2YW4M5F69z7diz+sD81M+qL169KkgY3oTk4sP3S0TV7\nFGZ+uFgeKXisaMj74vDArMAnrlQXpUXWAmcK4z3HW4gTDSyGakBM2UwKziNls9FeTvX0TMfLKdzU\npVLWWV3RwvM1z17GqpOkeXCEJGGGfF4S9sT4xOUuuPkZTcLlwxUUFBR8+6K8DAsKCgr0MKrjTSt7\n3ndRnDxUdpu3UF2sC1l1yKYnE8IhHIyVw0gBpsZ2NIMwaXuniuX64FUrPv/d2xafuApPx3qzWnd3\nalT8i4cmIf+V2xareHhsXHMc0+o4KT2m3W/NBqlYjEVMKDDaZB8s/B6pIVP3KD2PsZisI73xQlD9\nAOWq+0R6TDs0gmMoxohWfT9Nn8P24+VlVZv0utr3CiJY28f5wuqjHcTIXa08RO+9bF64x9ZMteZa\n3+j1167Z9ZsdBk7JoXjcvE3drnHROQV+wzVutWZLy+5t949sruH2YXVPXd1OchgW2N+1e45TN9P1\nUHkR5SmoWsMSDrkYQFZVVCL1v0wvE7WYzHWU0qmbxTqs0MfYQlxfOsty8YlpnOCDUd+zoFiGBQUF\nBSovw4KCggJJ5+5Nbki9QBNovkczGr2ZrJstP7xgJvLxU7Zh9HTO4QlubRtfeM8jRpO+c8so8QdW\nq9StZ7q2bLthdGiIUmNRrWZvbjxzC6l9STreiqXx9SfVPlglbQjh1SmK01MxZhLp9TRPqR2odhPV\n0Ra/w7tLEdfRFXjL11B1LfydD1iiDlR7nG9HQd1cH6SUOpE+R2rLuLhE4GaUoU6s2YIYutEFO6fN\n9+0t2u8N3mJWCvzyXcvjvL1rcank8JeeqPax1rEOU13ozpHdA/0bRmGdj4or+Xi6zo4N0iV4tfcO\nK8/y4cioM1MB9+ZWZ8XPwG03K7o+Rc2ZzsEpaORCQPXkVReb1AmsZvZb7TsK8uZXTadEsIs4XjUe\n69o+5+qvnDUPL6BYhgUFBQUqL8OCgoICSQ+jVOi08orR5I4B1lSpaPeQPgWPJZ2zreA1vLpj3rgP\n7ph6yfvhhlwHn7s2rujsl/sfXiy7PjDqtD+2wNhYLJxlKZkxdMyUPoh4st5JRF3dEy6PDkkGYvOc\n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\nhgBVfQDL1S/VSDgpUQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "code", "metadata": { "id": "DEL1Bg_U_ckm", "colab_type": "code", "outputId": "e3d90a25-f712-4e45-a5a3-f769733a287a", "colab": { "base_uri": "https://localhost:8080/", "height": 61 } }, "source": [ "from IPython.display import display, Audio\n", "display(Audio(\"decode/translated_sed/wav_wnv/translated_sed_gen.wav\"))" ], "execution_count": 0, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "markdown", "metadata": { "id": "SD3DjKkSIuub", "colab_type": "text" }, "source": [ "Successfully, it says \"Yes I'm Jose\"! For more TTS demo, visit https://colab.research.google.com/github/espnet/notebook/blob/master/tts_realtime_demo.ipynb" ] }, { "cell_type": "markdown", "metadata": { "id": "lVlcTJHyZ6Z7", "colab_type": "text" }, "source": [ "## Check decoding log\n", "\n", "After the translation, you will find `//result.json` for details;" ] }, { "cell_type": "code", "metadata": { "id": "qeFBOFCpW_ld", "colab_type": "code", "outputId": "c84a69a8-7b32-41d0-8427-2e2458a3561b", "colab": { "base_uri": "https://localhost:8080/", "height": 416 } }, "source": [ "!cat decode/st_test/result.json" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "{\n", " \"utts\": {\n", " \"st_test\": {\n", " \"output\": [\n", " {\n", " \"name\": \"target1[1]\",\n", " \"rec_text\": \"▁yes▁i▁'m▁jose\",\n", " \"rec_token\": \"▁yes ▁i ▁ ' m ▁j ose \",\n", " \"rec_tokenid\": \"991 638 371 2 219 656 256 999\",\n", " \"score\": 1.0691701889038088,\n", " \"shape\": [\n", " 1,\n", " 3\n", " ],\n", " \"text\": \"X\",\n", " \"token\": \"X\",\n", " \"tokenid\": \"1\"\n", " }\n", " ],\n", " \"utt2spk\": \"X\"\n", " }\n", " }\n", "}" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ZAgjrUaKaxcF", "colab_type": "text" }, "source": [ "and `//log/decode.log` for runtime log;" ] }, { "cell_type": "code", "metadata": { "id": "MaYYmfy_Zyo0", "colab_type": "code", "outputId": "40b3eb1d-1163-42e9-fe66-4b15f0da236d", "colab": { "base_uri": "https://localhost:8080/", "height": 530 } }, "source": [ "!cat decode/st_test/log/decode.log" ], "execution_count": 25, "outputs": [ { "output_type": "stream", "text": [ "# st_trans.py --config decode/download/fisher_callhome_spanish.transformer.v1.es-en/conf/tuning/decode_pytorch_transformer_bpe.yaml --ngpu 0 --backend pytorch --debugmode 1 --verbose 1 --trans-json decode/st_test/dump/data.json --result-label decode/st_test/result.json --model decode/download/fisher_callhome_spanish.transformer.v1.es-en/exp/train_sp.en_lc.rm_pytorch_train_pytorch_transformer_bpe_short_long_bpe1000_specaug_asrtrans_mttrans/results/model.val5.avg.best --api v2 \n", "# Started at Sat Feb 1 06:27:34 UTC 2020\n", "#\n", "2020-02-01 06:27:34,638 (st_trans:126) INFO: python path = /env/python\n", "2020-02-01 06:27:34,640 (st_trans:131) INFO: set random seed = 1\n", "2020-02-01 06:27:34,640 (st_trans:139) INFO: backend = pytorch\n", "2020-02-01 06:27:40,269 (deterministic_utils:24) INFO: torch type check is disabled\n", "2020-02-01 06:27:40,269 (asr_utils:439) INFO: reading a config file from decode/download/fisher_callhome_spanish.transformer.v1.es-en/exp/train_sp.en_lc.rm_pytorch_train_pytorch_transformer_bpe_short_long_bpe1000_specaug_asrtrans_mttrans/results/model.json\n", "2020-02-01 06:27:40,270 (asr_init:128) WARNING: reading model parameters from decode/download/fisher_callhome_spanish.transformer.v1.es-en/exp/train_sp.en_lc.rm_pytorch_train_pytorch_transformer_bpe_short_long_bpe1000_specaug_asrtrans_mttrans/results/model.val5.avg.best\n", "/usr/local/lib/python3.6/dist-packages/torch/nn/_reduction.py:46: UserWarning: size_average and reduce args will be deprecated, please use reduction='none' instead.\n", " warnings.warn(warning.format(ret))\n", "2020-02-01 06:27:41,093 (io_utils:59) WARNING: [Experimental feature] Some preprocessing will be done for the mini-batch creation using Transformation(\n", " 0: TimeWarp(max_time_warp=5, inplace=True, mode=PIL)\n", " 1: FreqMask(F=30, n_mask=2, replace_with_zero=False, inplace=True)\n", " 2: TimeMask(T=40, n_mask=2, replace_with_zero=False, inplace=True))\n", "2020-02-01 06:27:41,093 (st:449) INFO: (1/1) decoding st_test\n", "2020-02-01 06:27:41,094 (e2e_st_transformer:338) INFO: index: 999\n", "2020-02-01 06:27:41,095 (e2e_st_transformer:339) INFO: mark: \n", "2020-02-01 06:27:41,175 (e2e_st_transformer:344) INFO: input lengths: 48\n", "2020-02-01 06:27:41,175 (e2e_st_transformer:357) INFO: max output length: 14\n", "2020-02-01 06:27:41,175 (e2e_st_transformer:358) INFO: min output length: 0\n", "2020-02-01 06:27:42,643 (e2e_st_transformer:421) INFO: adding in the last postion in the loop\n", "2020-02-01 06:27:42,644 (e2e_st_transformer:451) INFO: no hypothesis. Finish decoding.\n", "2020-02-01 06:27:42,645 (e2e_st_transformer:472) INFO: total log probability: 1.0691701889038088\n", "2020-02-01 06:27:42,645 (e2e_st_transformer:473) INFO: normalized log probability: 0.11879668765597876\n", "2020-02-01 06:27:42,645 (asr_utils:626) INFO: groundtruth: X\n", "2020-02-01 06:27:42,645 (asr_utils:627) INFO: prediction : ▁yes▁i▁'m▁jose\n", "# Accounting: time=9 threads=1\n", "# Ended (code 0) at Sat Feb 1 06:27:43 UTC 2020, elapsed time 9 seconds\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "u7PQ9VCsbubw", "colab_type": "text" }, "source": [ "Let's calculate real-time factor (RTF) of the ST decoding from the `decode.log`" ] }, { "cell_type": "code", "metadata": { "id": "9AomOwogbtrm", "colab_type": "code", "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "outputId": "bdeb2c85-5160-44c7-cddd-4cda67665b36" }, "source": [ "from dateutil import parser\n", "from subprocess import PIPE, run\n", "\n", "# calc input duration (seconds)\n", "input_sec = float(run([\"soxi\", \"-D\", \"/content/espnet/test_utils/st_test.wav\"], stdout=PIPE).stdout)\n", "\n", "# calc NN decoding time\n", "with open(\"decode/st_test/log/decode.log\", \"r\") as f:\n", " times = [parser.parse(x.split(\"(\")[0]) for x in f if \"e2e_st_transformer\" in x]\n", "decode_sec = (times[-1] - times[0]).total_seconds()\n", "\n", "# get real-time factor (RTF)\n", "print(\"Input duration:\\t\", input_sec, \"sec\")\n", "print(\"NN decoding:\\t\", decode_sec, \"sec\")\n", "print(\"Real-time factor:\\t\", decode_sec / input_sec)" ], "execution_count": 54, "outputs": [ { "output_type": "stream", "text": [ "Input duration:\t 2.0 sec\n", "NN decoding:\t 1.551 sec\n", "Real-time factor:\t 0.7755\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "zpFIZXwVhgm9", "colab_type": "text" }, "source": [ "As you can see above, ESPnet-ST can **translate speech faster than the input** (it should be RTF < 1.0)." ] }, { "cell_type": "markdown", "metadata": { "id": "ZKf1luw0RlUR", "colab_type": "text" }, "source": [ "## Training ST models from scratch\n", "\n", "We provide [Kaldi-style recipes](https://kaldi-asr.org/doc/kaldi_for_dummies.html) for ST as well as [ASR](https://colab.research.google.com/github/espnet/notebook/blob/master/asr_cli.ipynb) and [TTS](https://colab.research.google.com/github/espnet/notebook/blob/master/tts_cli.ipynb) as all-in-one bash script `run.sh`:" ] }, { "cell_type": "code", "metadata": { "id": "ALXRj2qXRca7", "colab_type": "code", "outputId": "2677f0b0-698c-4f91-f268-8d4f62fc0510", "colab": { "base_uri": "https://localhost:8080/", "height": 434 } }, "source": [ "!cd /content/espnet/egs/must_c/st1/ && ./run.sh --must-c /content" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "stage -1: Data Download\n", "local/download_and_untar.sh: downloading data from https://drive.google.com/open?id=1Mf2il_VelDIJMSio0bq7I8M9fSs-X4Ie. This may take some time, please be patient.\n", "--2020-01-31 06:29:10-- https://drive.google.com/uc?export=download&id=1Mf2il_VelDIJMSio0bq7I8M9fSs-X4Ie\n", "Resolving drive.google.com (drive.google.com)... 172.217.214.102, 172.217.214.138, 172.217.214.100, ...\n", "Connecting to drive.google.com (drive.google.com)|172.217.214.102|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: unspecified [text/html]\n", "Saving to: '/content/WGgpBx.tar.gz'\n", "\n", "\r/content/WGgpBx.tar [<=> ] 0 --.-KB/s \r/content/WGgpBx.tar [ <=> ] 3.18K --.-KB/s in 0s \n", "\n", "2020-01-31 06:29:11 (38.8 MB/s) - '/content/WGgpBx.tar.gz' saved [3259]\n", "\n", "\n", "gzip: stdin: not in gzip format\n", "tar: Child returned status 1\n", "tar: Error is not recoverable: exiting now\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 3259 0 3259 0 0 16886 0 --:--:-- --:--:-- --:--:-- 16886\n", " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 388 0 388 0 0 2000 0 --:--:-- --:--:-- --:--:-- 1989\n", "100 16.7G 0 16.7G 0 0 40.9M 0 --:--:-- 0:06:59 --:--:-- 40.4M^C\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "nfU_iQzgTRk4", "colab_type": "text" }, "source": [ "However, it takes too much time to finish downloading the dataset. So we cancel the cell above." ] }, { "cell_type": "markdown", "metadata": { "id": "M9n7yQE8IaC7", "colab_type": "text" }, "source": [ "## Details of ESPnet tools" ] }, { "cell_type": "code", "metadata": { "id": "f61DJqkjTHMc", "colab_type": "code", "outputId": "84cc6f07-ea90-46bb-b7ac-608ee276c4cf", "colab": { "base_uri": "https://localhost:8080/", "height": 503 } }, "source": [ "!../../../utils/translate_wav.sh --help" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Usage:\n", " ../../../utils/translate_wav.sh [options] \n", "\n", "Options:\n", " --ngpu # Number of GPUs (Default: 0)\n", " --decode_dir # Name of directory to store decoding temporary data\n", " --models # Model name (e.g. tedlium2.transformer.v1)\n", " --cmvn # Location of cmvn.ark\n", " --trans_model # Location of E2E model\n", " --decode_config # Location of configuration file\n", " --api # API version (v1 or v2)\n", "\n", "Example:\n", " # Record audio from microphone input as example.wav\n", " rec -c 1 -r 16000 example.wav trim 0 5\n", "\n", " # Decode using model name\n", " ../../../utils/translate_wav.sh --models must_c.transformer.v1.en-fr example.wav\n", "\n", " # Decode using model file\n", " ../../../utils/translate_wav.sh --cmvn cmvn.ark --trans_model model.acc.best --decode_config conf/decode.yaml example.wav\n", "\n", " # Decode with GPU (require batchsize > 0 in configuration file)\n", " ../../../utils/translate_wav.sh --ngpu 1 example.wav\n", "\n", "Available models:\n", " - must_c.transformer.v1.en-fr\n", " - fisher_callhome_spanish.transformer.v1.es-en\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "WeLx7Xixadyf", "colab_type": "code", "outputId": "550696f6-afc6-4012-b3dc-a6efe80a96e9", "colab": { "base_uri": "https://localhost:8080/", "height": 712 } }, "source": [ "!../../../utils/synth_wav.sh --help" ], "execution_count": 0, "outputs": [ { "output_type": "stream", "text": [ "Usage:\n", " $ ../../../utils/synth_wav.sh \n", "\n", "Example:\n", " # make text file and then generate it\n", " echo \"This is a demonstration of text to speech.\" > example.txt\n", " ../../../utils/synth_wav.sh example.txt\n", "\n", " # you can specify the pretrained models\n", " ../../../utils/synth_wav.sh --models ljspeech.transformer.v3 example.txt\n", "\n", " # also you can specify vocoder model\n", " ../../../utils/synth_wav.sh --vocoder_models ljspeech.wavenet.mol.v2 --stop_stage 4 example.txt\n", "\n", "Available models:\n", " - ljspeech.tacotron2.v1\n", " - ljspeech.tacotron2.v2\n", " - ljspeech.tacotron2.v3\n", " - ljspeech.transformer.v1\n", " - ljspeech.transformer.v2\n", " - ljspeech.transformer.v3\n", " - ljspeech.fastspeech.v1\n", " - ljspeech.fastspeech.v2\n", " - ljspeech.fastspeech.v3\n", " - libritts.tacotron2.v1\n", " - libritts.transformer.v1\n", " - jsut.transformer.v1\n", " - jsut.tacotron2.v1\n", " - csmsc.transformer.v1\n", " - csmsc.fastspeech.v3\n", "\n", "Available vocoder models:\n", " - ljspeech.wavenet.softmax.ns.v1\n", " - ljspeech.wavenet.mol.v1\n", " - ljspeech.parallel_wavegan.v1\n", " - libritts.wavenet.mol.v1\n", " - jsut.wavenet.mol.v1\n", " - jsut.parallel_wavegan.v1\n", " - csmsc.wavenet.mol.v1\n", " - csmsc.parallel_wavegan.v1\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "CjjI35brBne3", "colab_type": "code", "colab": {} }, "source": [ "" ], "execution_count": 0, "outputs": [] } ] }