tacotron2/final.ipynb

318 lines
769 KiB
Plaintext
Raw Normal View History

2019-06-28 04:16:46 +00:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ubuntu/tacotron2/plotting_utils.py:2: UserWarning: \n",
"This call to matplotlib.use() has no effect because the backend has already\n",
"been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n",
"or matplotlib.backends is imported for the first time.\n",
"\n",
"The backend was *originally* set to 'module://ipykernel.pylab.backend_inline' by the following code:\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/runpy.py\", line 193, in _run_module_as_main\n",
" \"__main__\", mod_spec)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/runpy.py\", line 85, in _run_code\n",
" exec(code, run_globals)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/__main__.py\", line 3, in <module>\n",
" app.launch_new_instance()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/traitlets/config/application.py\", line 658, in launch_instance\n",
" app.start()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/kernelapp.py\", line 505, in start\n",
" self.io_loop.start()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/platform/asyncio.py\", line 148, in start\n",
" self.asyncio_loop.run_forever()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/asyncio/base_events.py\", line 438, in run_forever\n",
" self._run_once()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/asyncio/base_events.py\", line 1451, in _run_once\n",
" handle._run()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/asyncio/events.py\", line 145, in _run\n",
" self._callback(*self._args)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/ioloop.py\", line 690, in <lambda>\n",
" lambda f: self._run_callback(functools.partial(callback, future))\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/ioloop.py\", line 743, in _run_callback\n",
" ret = callback()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/gen.py\", line 781, in inner\n",
" self.run()\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/gen.py\", line 742, in run\n",
" yielded = self.gen.send(value)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 357, in process_one\n",
" yield gen.maybe_future(dispatch(*args))\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/gen.py\", line 209, in wrapper\n",
" yielded = next(result)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 267, in dispatch_shell\n",
" yield gen.maybe_future(handler(stream, idents, msg))\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/gen.py\", line 209, in wrapper\n",
" yielded = next(result)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/kernelbase.py\", line 534, in execute_request\n",
" user_expressions, allow_stdin,\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/tornado/gen.py\", line 209, in wrapper\n",
" yielded = next(result)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/ipkernel.py\", line 294, in do_execute\n",
" res = shell.run_cell(code, store_history=store_history, silent=silent)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/ipykernel/zmqshell.py\", line 536, in run_cell\n",
" return super(ZMQInteractiveShell, self).run_cell(*args, **kwargs)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 2848, in run_cell\n",
" raw_cell, store_history, silent, shell_futures)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 2874, in _run_cell\n",
" return runner(coro)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/IPython/core/async_helpers.py\", line 67, in _pseudo_sync_runner\n",
" coro.send(None)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3049, in run_cell_async\n",
" interactivity=interactivity, compiler=compiler, result=result)\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3214, in run_ast_nodes\n",
" if (yield from self.run_code(code, result)):\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/IPython/core/interactiveshell.py\", line 3296, in run_code\n",
" exec(code_obj, self.user_global_ns, self.user_ns)\n",
" File \"<ipython-input-1-e58092d83371>\", line 3, in <module>\n",
" import matplotlib.pylab as plt\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/matplotlib/pylab.py\", line 257, in <module>\n",
" from matplotlib import cbook, mlab, pyplot as plt\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/matplotlib/pyplot.py\", line 69, in <module>\n",
" from matplotlib.backends import pylab_setup\n",
" File \"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/matplotlib/backends/__init__.py\", line 14, in <module>\n",
" line for line in traceback.format_stack()\n",
"\n",
"\n",
" matplotlib.use(\"Agg\")\n"
]
}
],
"source": [
"import matplotlib\n",
"#%matplotlib inline\n",
"import matplotlib.pylab as plt\n",
"\n",
"import IPython.display as ipd\n",
"\n",
"import sys\n",
"sys.path.append('waveglow/')\n",
"import numpy as np\n",
"import torch\n",
"\n",
"from hparams import create_hparams\n",
"from model import Tacotron2\n",
"from layers import TacotronSTFT, STFT\n",
"from audio_processing import griffin_lim\n",
"from train import load_model\n",
"from text import text_to_sequence\n",
"from denoiser import Denoiser"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import os"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"WARNING: The TensorFlow contrib module will not be included in TensorFlow 2.0.\n",
"For more information, please see:\n",
" * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n",
" * https://github.com/tensorflow/addons\n",
"If you depend on functionality not listed there, please file an issue.\n",
"\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/torch/serialization.py:454: SourceChangeWarning: source code of class 'glow.WaveGlow' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n",
" warnings.warn(msg, SourceChangeWarning)\n",
"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/torch/serialization.py:454: SourceChangeWarning: source code of class 'torch.nn.modules.conv.ConvTranspose1d' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n",
" warnings.warn(msg, SourceChangeWarning)\n",
"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/torch/serialization.py:454: SourceChangeWarning: source code of class 'glow.WN' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n",
" warnings.warn(msg, SourceChangeWarning)\n",
"/home/ubuntu/anaconda3/envs/tts/lib/python3.6/site-packages/torch/serialization.py:454: SourceChangeWarning: source code of class 'torch.nn.modules.conv.Conv1d' has changed. you can retrieve the original source code by accessing the object's source attribute or set `torch.nn.Module.dump_patches = True` and use the patch tool to revert the changes.\n",
" warnings.warn(msg, SourceChangeWarning)\n"
]
}
],
"source": [
"hparams = create_hparams()\n",
"hparams.sampling_rate = 22050\n",
"checkpoint_path = \"checkpoint_15000\"\n",
"model = load_model(hparams)\n",
"model.load_state_dict(torch.load(checkpoint_path, map_location = 'cpu')['state_dict']) #added map_location = 'cpu'\n",
"_ = model.eval() #it was originally model.cuda().eval().half()\n",
"waveglow_path = 'waveglow_256channels.pt'\n",
"waveglow = torch.load(waveglow_path, map_location = 'cpu')['model'] #added map_location = 'cpu'\n",
"waveglow.eval() #originally waveglow.cuda().eval().half()\n",
"for k in waveglow.convinv:\n",
" k.float()\n",
"#denoiser = Denoiser(waveglow)\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"import soundfile as sf"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import time"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def convert(array):\n",
" sf.write('sample.wav', array, 22050)\n",
" os.system('ffmpeg -i {0} -filter:a \"atempo=0.80\" {1}'.format('sample.wav', 'sample0.wav'))\n",
" #os.system('ffmpeg -i {0} -ar 8000 {1}'.format('sample0.wav', 'sample1.wav'))\n",
" data, rate = sf.read('sample0.wav')\n",
" os.remove('sample.wav')\n",
" os.remove('sample0.wav')\n",
" #os.remove('sample1.wav')\n",
" return data"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"def speech(t):\n",
" start = time.time()\n",
" text = t\n",
" sequence = np.array(text_to_sequence(text, ['english_cleaners']))[None, :]\n",
" print(sequence)\n",
" sequence = torch.autograd.Variable(\n",
" torch.from_numpy(sequence)).long() #originally torch.from_numpy(sequence)).cuda().long()\n",
" mel_outputs, mel_outputs_postnet, _, alignments = model.inference(sequence)\n",
" with torch.no_grad():\n",
" audio = waveglow.infer(mel_outputs_postnet, sigma=0.666)\n",
" #audio_denoised = denoiser(audio, strength=0.01)[:, 0]\n",
" data = convert(audio[0].data.cpu().numpy())\n",
" #os.system('ffmpeg -i {0} -filter:a \"atempo=0.85\" {1}'.format('harvard_inference/audio/'+str(i)+'.wav', 'harvard_inference/audio_0.85/'+str(i)+'.wav'))\n",
" aud = ipd.Audio(data, rate=22050)\n",
" end = time.time()\n",
" print(end-start)\n",
" return aud"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[46 11 58 51 41 42 55 56 57 38 51 41 11 62 52 58 55 11 43 55 58 56 57 55\n",
" 38 57 46 52 51 11 38 51 41 11 41 46 56 38 53 53 52 46 51 57 50 42 51 57\n",
" 7 11 46 11 38 50 11 56 52 55 55 62 11 57 45 38 57 11 46 57 56 11 45 38\n",
" 53 53 42 51 46 51 44 11 38 51 41 11 46 11 60 52 58 49 41 11 49 46 48 42\n",
" 11 57 52 11 45 42 49 53 11 53 55 42 59 42 51 57 11 46 57 11 46 51 11 57\n",
" 45 42 11 43 58 57 58 55 42 7 11 60 45 38 57 11 56 57 62 49 42 11 52 43\n",
" 11 41 46 38 53 42 55 56 11 41 46 41 11 62 52 58 11 39 58 62 10 11 43 52\n",
" 55 11 46 51 56 57 38 51 40 42 6 11 60 38 56 11 46 57 11 57 45 42 11 56\n",
" 51 58 44 44 49 42 55 56 6 11 53 58 49 49 11 58 53 56 11 52 55 11 39 38\n",
" 39 62 11 41 55 62 7]]\n",
"21.24711561203003\n"
]
},
{
"data": {
"text/html": [
"\n",
" <audio controls=\"controls\" >\n",
" <source src=\"data:audio/wav;base64,UklGRorWCABXQVZFZm10IBAAAAABAAEAIlYAAESsAAACABAAZGF0YWbWCAAAABsAKABAAEoASgBHAC8ABgAAAAAAAAAAAAAAAAAAAP3/AAAAAAAA+v/2//r//f8AABQAKAAvACgAGwAAAAAA+v8AABsAHgAbABAA/f/z/+z/AAAQABcAEAAAAOz/7P/z/wAAAAD6/+n/4v/l//3/AAAAAAAA9v/2//P/AAAKAA0AGwAXAAoA/f/z//b/AwAUABcAFAAGAAAAAAANABsAGwAhABcAAADz/+z/8P8GABsALAAhAAoA+v/z//r/CgAQABcAGwAUABQAFwAhABcAAAAAAAAABgAXACUAHgAbAAYAHgAyACwADQDl/8f/zv/z/xsALAAUAPP/4v/w/xAAHgAXAPr/2P/p/xcATgBzAFsALwAAAOL/8P8NACEALAAKAPr/7P/z/wYAFAAXAAMA8P/w//3/AwAKAAAA8//s/9//8P8AAAoAFAAXABQAAwD2//b/+v8AAAMACgANAAoAAwAQACgAQABHAEMALAAUAAAAAAAGAAYABgADAAYADQAQACgAMgA5ADkAOQA2ACwAFwAbABcADQAAAPr/8//6/wYAJQAvACUAFwANAA0AIQAhAC8ALAAXABsAKAA2AEcAQwA5ACwAGwAXACgAPQBKAD0ALAAGAOX/2P/i//b/DQAUABcAEAAAAAAAAAD6//3/AAAQACEAJQAoACUAGwAQAAoAFwAbABAAAAD9//b//f8DAB4AJQAeAAoAAAAAAA0AJQBAAEcAKAAGAPD/6f/z/wAAFwAXABQADQAUACUAPQBAAEAAHgAAAOn/8/8KACgALAAhAAAA8P/z/wAAFwAyAC8AJQAGAPP/6f/i/+n/6f/p/+z/6f/i/9j/2P/f/+z/+v8KAAoAAwD6//b/+v8AAAYAGwAeABQACgAAAAAAAwAGABQACgAGAAAAAAAGAAAA9v/i/9v/6f/6/wMAAwAAAPP/AAAeACwAIQAAAPD/7P8DAD0AVABAABsADQAUACwAQABHADkAKAAoACwALwAoAA0ABgAAAAAA+v/p/9j/0f/K/9H/0f/O/9T/8P8DABsAFwANAP3/8P8AABAAIQAlAA0AAAD2//r/AAAKABQADQADAAYABgAKAA0ABgAAAAAA/f8UACgAIQAQAP3/5f/b/+L/9v8AAAoAFAAlACUAJQAQABQAGwAhAB4ACgD9/+n/2//6/xQALAAyACEACgDz/9v/6f8AABAAFwAXABAACgADAAoAAwD6/+L/3//l//3/DQAhACwALAAsACwAIQAXAAoAEAAXABsAGwANAAYACgAUACgAKAANAPb/4v/s/wYALABHADkAFwAAAPr//f8GAAMABgADAAAACgANAA0AAADs/+n/7P/2/wAABgANABAADQAGAAAAAAAAAAYAEAAGAP3/9v/9/wAADQAXAB4AFwAKAAoAAAAAAPP/8//6/woALwBHAEMAJQADAPP/8/8AAAoAGwAXABAAAwADAAoAIQA9AFsAaQBRACgACgAAAAoAKABHAFEAQAAlABcADQAXABcAHgAeABcAFwAXAB4AIQAXABsAFwAeAB4AHgAeAA0AAAAAAAMAAwAAAP3/9v/6//b/CgAeACUAGwAKAAAA+v8AABAAIQAoAC8ANgA9AEMANgAsABcACgAKABAAFAAXAA0AFAAXABAADQAAAAAAAAAAAAYABgAAAAAA8P/l/+L/5f/6/wAAAADz/+z/7P/2/wAAAADz/+L/4v/6/wMAIQAeAB4AHgAUABsAFwAQAA0ACgAbACwALwAhAA0A/f/6/wAAFAAeABcABgAAAAAAAAD9//r/9v8AAA0AJQAvAC8AJQAeABsAHgAhACUAKAAvACUAIQANAP3/8//w//b/BgAbADIAPQBHAEMASgBHAEMAQwBAAC8AEADz/9//4v8AABQAGwADAOX/yv/K/9j/8//9/wAAAAAGABAAFwAXABsAGwAhAB4AGwAKAAAA+v/6//r/AAADAAMAAAAAAPb/8//2/wAAFAAhACUAHgAUABAACgAKAAAAAAADAA0AEAAUAA0AFAAUACUAJQAeABsAGwAlAC8ALAAeAAYAAAAGABsALwA9ADYAIQAAAOn/5f/w/wAADQAQAAoAAAD9//r/AADz//P/8/8AAA0AFwAUAAAA6f/s//3/FwA2AD0AJQADAOn/8P8AACEAMgAoAB4ABgAAAPr/6f/p/9//6f8AABAAFwANAP3/8P/i/+n//f8UAB4AIQAGAOX/w/+v/7b/yv/i//r/AAAKAAAABgAXACgAOQA9AC8AIQADAOX/zv/A/8P/0f/U/9j/2//z/xcATgBpAF8AKAD9/9H/2P/6/x4ALwA5ADkAOQAyABsAAwD9//3/IQBDAFQARwAoAA0ABgAKAB4AKAAlAA0A9v/i/9v/4v/6/wAAAwD6//r/CgBAAHYAhwB2AEoAFwAAAA0AJQA5ADYAHgAGAAAAAAAUACgAFwADAOX/0f/K/9v/6f/2//b/AwANABsAEAD6/+L/0f/l/woANgBOAD0AFwAKABcAPQBsAHAAUQAbAPP/5f8AACUAWAB2AHYAdgBYADkALAAUACwAQABRAEoALAAKABAAOQCSAL4AtwBlAPb/m/9//57/0f/s//3/AAAeAFsAkgCjAIEAIQC9/3L/aP+X/wAAWACBAFEA+v+h/4P/w/8sAJIAnABKAPr/x//z/0MAkgCBAAoAef8T/w//bv/s/zkAMgDl/43/f/+s//3/HgD2/3n//v7j/kz/AACjAAwBFgHqAL4AhwBHAOL/a/81/3//LwAnAdUB5gFTAT0AOP+w/vv+QADVAfUC/ALbAT0ACP+z/mT/LwCEADYAkP9Q/73/ugByAWEBsACX/9z+sP73/mT/ef9X/1P/a/8AANYArAFLAhwCJwHi/5j+Sv4M/2UAtgHiAfsAtv+p/qb+Wv8NAEoAw/8M/+D+Xf9pADEBQgGVAMr/aP+2/1sA9AAxAQwBqQBHAPD/of9a/0z/of8oAK0AtAAeAHz/Hf91/1sAPwF8AdwArP+3/mX+z/6N/zIAowDxABoBMQH4AGkAw/87/w//TP+U/8P/w//D/xcA6gCzATAC6QErAWkA6f/O/wYAKABAAC8AEAADANv/tv+Q/yr/rf7d/Uj9YP1N/vP/dQHmASsB5f8n/8P/GgEfAtgB8P+n/TT8YfzQ/Wj/SgCBAH0APAGaAtIDAgTNAgUBm/8I/zH/P//7/mn+Of41/zUBNgPgA1wCYf9r/Cv7Xfxu/20CBQR6A6gB/f95/wMAAgFQAdYA0f/q/r7+O/8AAJ8AnwBUAAAA5f8yAHoARwA//z79dvvh+iD8D/8pAjgEgwTyAhMBr/87/7L/+v8AAM7/a//b/7QAxAGkAmcCHQFM/0/9mvxI/fv+ywB1AQ8BXwAAAOoAHAJjAl4BIP9t/bH9ef8EAn0DaQOdAsABlAG9AfQARv/i/Dn7L/vH/Az/PwHJArsDEwQ2AyABPP5v+5L65vvq/hwCowNOA6UBkP9D/oj9Y/3T/an+FwDHAfICQAM+AoQA9P4D/vz9Kv/tAIgDTgZxCK0JRAmKBz4FZwL9/6T9lfvT+n37xv0kAZIDlARKAywAM/2M+jH5YflO+mf8Yv5//9v/Rv/m/un/9wELBY0HvQc2BoED+ACjALAAMQHLAMj+zP2//Wj/qwIrBFME3wFx/Rv6Y/cY95X4/fkP/On8Pv3a/WL+4v+bAasCGwM0AlQAcv/2//oBUgU1ByYIAQj7BjwHgQbxA+z/FvlO9M7yCfX7+wsCWwZ5B0IETQGC/d365Ppe+1j+6QHiBHsI5Al2CmsKpwjuBq8EvQF5/3L8UPmd9xj33vlQ/5EEqwh2B4ABEfp4803ybvbK/IQDKQZnBUADyADPAOIBbQJZAtj/BP12+7r7f/9aBGcILgorB6IBxPvC9y/44foG/hQAa/9N/u79ov5zAA8B/f8J/sj7Mvvw+9j8T/1I/T79/v4fAk8
" Your browser does not support the audio element.\n",
" </audio>\n",
" "
],
"text/plain": [
"<IPython.lib.display.Audio object>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"speech('I understand your frustration and disappointment. I am sorry that its happening and I would like to help prevent it in the future. What style of diapers did you buy? For instance, was it the snugglers, pull ups or baby dry.')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'sequence' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-9-5b150d1f0ed0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0msequence\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'sequence' is not defined"
]
}
],
"source": []
},
{
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}