{
"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",
"[](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": []
}
]
}