From 58bf3244ac319d679ddec6ae8c393b7a02fee311 Mon Sep 17 00:00:00 2001 From: nmstoker Date: Mon, 11 Nov 2019 00:57:01 +0000 Subject: [PATCH 1/3] Add Bokeh interactive plotting --- speaker_encoder/compute_embeddings.py | 34 +- .../notebooks/PlotUmapLibriTTS.ipynb | 663 ++++++++++++++++-- 2 files changed, 627 insertions(+), 70 deletions(-) diff --git a/speaker_encoder/compute_embeddings.py b/speaker_encoder/compute_embeddings.py index ff90acb7..69fbc32c 100644 --- a/speaker_encoder/compute_embeddings.py +++ b/speaker_encoder/compute_embeddings.py @@ -28,7 +28,7 @@ parser.add_argument( parser.add_argument( 'data_path', type=str, - help='Defines the data path. It overwrites config.json.') + help='Data path for wav files - directory or CSV file') parser.add_argument( 'output_path', type=str, @@ -36,14 +36,42 @@ parser.add_argument( parser.add_argument( '--use_cuda', type=bool, help='flag to set cuda.', default=False ) +parser.add_argument( + '--separator', type=str, help='Separator used in file if CSV is passed for data_path', default='|' +) args = parser.parse_args() c = load_config(args.config_path) ap = AudioProcessor(**c['audio']) -wav_files = glob.glob(args.data_path + '/**/*.wav', recursive=True) -output_files = [wav_file.replace(args.data_path, args.output_path).replace( +data_path = args.data_path +split_ext = os.path.splitext(data_path) +sep = args.separator + +if len(split_ext) > 0 and split_ext[1].lower() == '.csv': + # Parse CSV + print(f'CSV file: {data_path}') + with open(data_path) as f: + wav_path = os.path.join(os.path.dirname(data_path), 'wavs') + wav_files = [] + print(f'Separator is: {sep}') + for line in f: + components = line.split(sep) + if len(components) != 2: + print("Invalid line") + continue + wav_file = os.path.join(wav_path, components[0] + '.wav') + #print(f'wav_file: {wav_file}') + if os.path.exists(wav_file): + wav_files.append(wav_file) + print(f'Count of wavs imported: {len(wav_files)}') +else: + # Parse all wav files in data_path + wav_path = data_path + wav_files = glob.glob(data_path + '/**/*.wav', recursive=True) + +output_files = [wav_file.replace(wav_path, args.output_path).replace( '.wav', '.npy') for wav_file in wav_files] for output_file in output_files: diff --git a/speaker_encoder/notebooks/PlotUmapLibriTTS.ipynb b/speaker_encoder/notebooks/PlotUmapLibriTTS.ipynb index 4171659a..bc0a869a 100644 --- a/speaker_encoder/notebooks/PlotUmapLibriTTS.ipynb +++ b/speaker_encoder/notebooks/PlotUmapLibriTTS.ipynb @@ -1,27 +1,421 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Overview\n", + "\n", + "This notebook can be used with both a single or multi- speaker corpus and allows the interactive plotting of speaker embeddings linked to underlying audio (see instructions in the repo's speaker_embedding directory)\n", + "\n", + "Depending on the directory structure used for your corpus, you may need to adjust handling of **speaker_to_utter** and **locations**." + ] + }, { "cell_type": "code", "execution_count": 1, "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import glob\n", + "import random\n", + "import numpy as np\n", + "import torch\n", + "import umap\n", + "\n", + "from TTS.speaker_encoder.model import SpeakerEncoder\n", + "from TTS.utils.audio import AudioProcessor\n", + "from TTS.utils.generic_utils import load_config\n", + "\n", + "from bokeh.io import output_notebook, show\n", + "from bokeh.plotting import figure\n", + "from bokeh.models import HoverTool, ColumnDataSource, BoxZoomTool, ResetTool, OpenURL, TapTool\n", + "from bokeh.transform import factor_cmap, factor_mark\n", + "from bokeh.palettes import Category10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For larger sets of speakers, you can use **Category20**, but you need to change it in the **pal** variable too\n", + "\n", + "List of Bokeh palettes here: http://docs.bokeh.org/en/1.4.0/docs/reference/palettes.html\n", + "\n", + "**NB:** if you have problems with other palettes, first see https://stackoverflow.com/questions/48333820/why-do-some-bokeh-palettes-raise-a-valueerror-when-used-in-factor-cmap" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " Loading BokehJS ...\n", + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "\n", + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " var force = true;\n", + "\n", + " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + " var JS_MIME_TYPE = 'application/javascript';\n", + " var HTML_MIME_TYPE = 'text/html';\n", + " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " var CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " var script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " var cell = handle.cell;\n", + "\n", + " var id = cell.output_area._bokeh_element_id;\n", + " var server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " var id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " var output_area = handle.output_area;\n", + " var output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!output.data.hasOwnProperty(EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " var bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " var script_attrs = bk_div.children[0].attributes;\n", + " for (var i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " var toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " var events = require('base/js/events');\n", + " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + "\n", + " \n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " var NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " var el = document.getElementById(\"1001\");\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + "\n", + " function on_error() {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " for (var i = 0; i < css_urls.length; i++) {\n", + " var url = css_urls[i];\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " for (var i = 0; i < js_urls.length; i++) {\n", + " var url = js_urls[i];\n", + " var element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error;\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " };var element = document.getElementById(\"1001\");\n", + " if (element == null) {\n", + " console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n", + " return false;\n", + " }\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.3.4.min.js\"];\n", + " var css_urls = [];\n", + "\n", + " var inline_js = [\n", + " function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + " \n", + " function(Bokeh) {\n", + " \n", + " },\n", + " function(Bokeh) {} // ensure no trailing comma for IE\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " \n", + " if ((root.Bokeh !== undefined) || (force === true)) {\n", + " for (var i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }if (force === true) {\n", + " display_loaded();\n", + " }} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + "\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(css_urls, js_urls, function() {\n", + " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(\"1001\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error() {\n console.error(\"failed to load \" + url);\n }\n\n for (var i = 0; i < css_urls.length; i++) {\n var url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error;\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (var i = 0; i < js_urls.length; i++) {\n var url = js_urls[i];\n var element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error;\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };var element = document.getElementById(\"1001\");\n if (element == null) {\n console.error(\"Bokeh: ERROR: autoload.js configured with elementid '1001' but no matching script tag was found. \")\n return false;\n }\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n var js_urls = [\"https://cdn.pydata.org/bokeh/release/bokeh-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-widgets-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-tables-1.3.4.min.js\", \"https://cdn.pydata.org/bokeh/release/bokeh-gl-1.3.4.min.js\"];\n var css_urls = [];\n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n \n function(Bokeh) {\n \n },\n function(Bokeh) {} // ensure no trailing comma for IE\n ];\n\n function run_inline_js() {\n \n if ((root.Bokeh !== undefined) || (force === true)) {\n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }if (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(\"1001\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "output_notebook()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should also adjust all the path constants to point at the relevant locations for you locally" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "MODEL_RUN_PATH = \"/home/neil/main/Projects/TTS3/speaker_encoder/libritts_360-half-September-28-2019_10+46AM-8565c50/\"\n", + "MODEL_PATH = MODEL_RUN_PATH + \"best_model.pth.tar\"\n", + "CONFIG_PATH = MODEL_RUN_PATH + \"config.json\"\n", + "\n", + "# My single speaker locations\n", + "#EMBED_PATH = \"/home/neil/main/Projects/TTS3/embeddings/neil14/\"\n", + "#AUDIO_PATH = \"/home/neil/data/Projects/NeilTTS/neil14/wavs/\"\n", + "\n", + "# My multi speaker locations\n", + "EMBED_PATH = \"/home/neil/main/Projects/TTS3/embeddings/libritts_360/\"\n", + "AUDIO_PATH = \"/home/neil/main/Projects/LibriTTS/LibriTTS/train-clean-360/\"" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "checkpoint_10000.pth.tar config.json\n", - "checkpoint_20000.pth.tar events.out.tfevents.1567518806.erogol-desktop\n", - "checkpoint_30000.pth.tar\n" + "best_model.pth.tar\r\n", + "config.json\r\n", + "events.out.tfevents.1569660396.erogol-desktop\r\n" ] } ], "source": [ - "!ls /media/erogol/data_ssd/Models/libri_tts/speaker_encoder/libritts_360-September-03-2019_03+53PM-dc69074/" + "!ls -1 $MODEL_RUN_PATH" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -29,7 +423,7 @@ "output_type": "stream", "text": [ " > Setting up Audio Processor...\n", - " | > sample_rate:16000\n", + " | > sample_rate:24000\n", " | > num_mels:40\n", " | > min_level_db:-100\n", " | > frame_shift_ms:12.5\n", @@ -46,61 +440,62 @@ " | > max_norm:4.0\n", " | > clip_norm:True\n", " | > do_trim_silence:False\n", + " | > sound_norm:False\n", " | > n_fft:2048\n", - " | > hop_length:200\n", - " | > win_length:800\n" + " | > hop_length:300\n", + " | > win_length:1200\n" ] } ], "source": [ - "import torch\n", - "import os\n", - "import umap\n", - "import random\n", - "import glob\n", - "import numpy as np\n", - "\n", - "from TTS.speaker_encoder.model import SpeakerEncoder\n", - "from TTS.utils.audio import AudioProcessor\n", - "from TTS.utils.generic_utils import load_config\n", - "\n", - "MODEL_PATH = \"/media/erogol/data_ssd/Models/libri_tts/speaker_encoder/libritts_360-half-September-28-2019_10+46AM-8565c50/best_model.pth.tar\"\n", - "CONFIG_PATH = \"/media/erogol/data_ssd/Models/libri_tts/speaker_encoder/libritts_360-September-03-2019_03+53PM-dc69074/config.json\"\n", - "EMBED_PATH = \"/home/erogol/Data/Libri-TTS/train-clean-360-embed_128/\"\n", "CONFIG = load_config(CONFIG_PATH)\n", "ap = AudioProcessor(**CONFIG['audio'])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Bring in the embeddings created by **compute_embeddings.py**" + ] + }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "116500\n" + "Embeddings found: 116500\n" ] } ], "source": [ "embed_files = glob.glob(EMBED_PATH+\"/**/*.npy\", recursive=True)\n", - "print(len(embed_files))" + "print(f'Embeddings found: {len(embed_files)}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Check that we did indeed find an embedding" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'/home/erogol/Data/Libri-TTS/train-clean-360-embed_128/1025/75365/1025_75365_000002_000002.npy'" + "'/home/neil/main/Projects/TTS3/embeddings/libritts_360/7732/107520/7732_107520_000009_000003.npy'" ] }, - "execution_count": 3, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -109,16 +504,25 @@ "embed_files[0]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Process the speakers\n", + "\n", + "Assumes count of **speaker_paths** corresponds to number of speakers (so a corpus in just one directory would be treated like a single speaker and the multiple directories of LibriTTS are treated as distinct speakers)" + ] + }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "904\n" + "Speaker count: 904\n" ] } ], @@ -131,19 +535,37 @@ " speaker_to_utter[speaker_path].append(embed_file)\n", " except:\n", " speaker_to_utter[speaker_path]=[embed_file]\n", - "print(len(speaker_paths))" + "print(f'Speaker count: {len(speaker_paths)}')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up the embeddings\n", + "\n", + "Adjust the number of speakers to select and the number of utterances from each speaker and they will be randomly sampled from the corpus" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "embeds = []\n", "labels = []\n", - "num_speakers = 20\n", - "num_utters = 10\n", + "locations = []\n", + "\n", + "# single speaker \n", + "#num_speakers = 1\n", + "#num_utters = 1000\n", + "\n", + "# multi speaker\n", + "num_speakers = 10\n", + "num_utters = 20\n", + "\n", + "\n", "speaker_idxs = np.random.choice(range(len(speaker_paths)), num_speakers, replace=False )\n", "\n", "for speaker_num, speaker_idx in enumerate(speaker_idxs):\n", @@ -154,69 +576,176 @@ " embed_path = speaker_to_utter[speaker_path][utter_idx]\n", " embed = np.load(embed_path)\n", " embeds.append(embed)\n", - " labels.append(speaker_num)\n", + " labels.append(str(speaker_num))\n", + " locations.append(embed_path.replace(EMBED_PATH, '').replace('.npy','.wav'))\n", "embeds = np.concatenate(embeds)" ] }, { - "cell_type": "code", - "execution_count": 6, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "from matplotlib import cm\n", - "viridis = cm.get_cmap('tab20', num_speakers)" + "Load embeddings with UMAP" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 10, "metadata": {}, + "outputs": [], + "source": [ + "model = umap.UMAP()\n", + "projection = model.fit_transform(embeds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Interactively charting the data in Bokeh\n", + "\n", + "Set up various details for Bokeh to plot the data\n", + "\n", + "You can use the regular Bokeh [tools](http://docs.bokeh.org/en/1.4.0/docs/user_guide/tools.html?highlight=tools) to explore the data, with reset setting it back to normal\n", + "\n", + "Once you have started the local server (see cell below) you can then click on plotted points which will open a tab to play the audio for that point, enabling easy exploration of your corpus\n", + "\n", + "File location in the tooltip is given relative to **AUDIO_PATH**" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": false + }, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/erogol/miniconda3/lib/python3.7/site-packages/sklearn/metrics/pairwise.py:258: RuntimeWarning: invalid value encountered in sqrt\n", - " return distances if squared else np.sqrt(distances, out=distances)\n", - "/home/erogol/miniconda3/lib/python3.7/site-packages/umap/spectral.py:229: UserWarning: Embedding a total of 5 separate connected components using meta-embedding (experimental)\n", - " n_components\n" - ] + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] + "application/javascript": [ + "(function(root) {\n", + " function embed_document(root) {\n", + " \n", + " var docs_json = {\"95a95da2-6471-485d-aafc-7fcb3a90c6fa\":{\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1016\",\"type\":\"LinearAxis\"}],\"center\":[{\"id\":\"1020\",\"type\":\"Grid\"},{\"id\":\"1025\",\"type\":\"Grid\"}],\"left\":[{\"id\":\"1021\",\"type\":\"LinearAxis\"}],\"plot_height\":400,\"renderers\":[{\"id\":\"1035\",\"type\":\"GlyphRenderer\"}],\"title\":{\"id\":\"1038\",\"type\":\"Title\"},\"toolbar\":{\"id\":\"1026\",\"type\":\"Toolbar\"},\"x_range\":{\"id\":\"1008\",\"type\":\"DataRange1d\"},\"x_scale\":{\"id\":\"1012\",\"type\":\"LinearScale\"},\"y_range\":{\"id\":\"1010\",\"type\":\"DataRange1d\"},\"y_scale\":{\"id\":\"1014\",\"type\":\"LinearScale\"}},\"id\":\"1007\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"source\":{\"id\":\"1002\",\"type\":\"ColumnDataSource\"}},\"id\":\"1036\",\"type\":\"CDSView\"},{\"attributes\":{\"text\":\"\"},\"id\":\"1038\",\"type\":\"Title\"},{\"attributes\":{\"callback\":null},\"id\":\"1008\",\"type\":\"DataRange1d\"},{\"attributes\":{\"url\":\"http://localhost:8000/@desc\"},\"id\":\"1046\",\"type\":\"OpenURL\"},{\"attributes\":{\"callback\":null},\"id\":\"1010\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1039\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"active_drag\":\"auto\",\"active_inspect\":\"auto\",\"active_multi\":null,\"active_scroll\":\"auto\",\"active_tap\":\"auto\",\"tools\":[{\"id\":\"1003\",\"type\":\"HoverTool\"},{\"id\":\"1004\",\"type\":\"BoxZoomTool\"},{\"id\":\"1005\",\"type\":\"ResetTool\"},{\"id\":\"1006\",\"type\":\"TapTool\"}]},\"id\":\"1026\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1014\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1044\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"BasicTicker\"},{\"attributes\":{\"ticker\":{\"id\":\"1017\",\"type\":\"BasicTicker\"}},\"id\":\"1020\",\"type\":\"Grid\"},{\"attributes\":{\"callback\":{\"id\":\"1046\",\"type\":\"OpenURL\"}},\"id\":\"1006\",\"type\":\"TapTool\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_color\":{\"field\":\"label\",\"transform\":{\"id\":\"1031\",\"type\":\"CategoricalColorMapper\"}},\"line_color\":{\"field\":\"label\",\"transform\":{\"id\":\"1031\",\"type\":\"CategoricalColorMapper\"}},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1033\",\"type\":\"Circle\"},{\"attributes\":{\"formatter\":{\"id\":\"1041\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1017\",\"type\":\"BasicTicker\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":{\"value\":0.5},\"fill_color\":{\"value\":\"lightgrey\"},\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":{\"value\":1.0},\"line_color\":{\"value\":\"black\"},\"line_dash\":[4,4],\"line_width\":{\"value\":2},\"render_mode\":\"css\",\"right_units\":\"screen\",\"top_units\":\"screen\"},\"id\":\"1043\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"formatter\":{\"id\":\"1039\",\"type\":\"BasicTickFormatter\"},\"ticker\":{\"id\":\"1022\",\"type\":\"BasicTicker\"}},\"id\":\"1021\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1041\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"file\",\"@desc\"],[\"speaker\",\"@label\"]]},\"id\":\"1003\",\"type\":\"HoverTool\"},{\"attributes\":{\"callback\":null,\"data\":{\"desc\":[\"8193/116804/8193_116804_000036_000003.wav\",\"8193/116805/8193_116805_000019_000000.wav\",\"8193/116804/8193_116804_000071_000003.wav\",\"8193/116805/8193_116805_000013_000000.wav\",\"8193/116805/8193_116805_000009_000001.wav\",\"8193/116805/8193_116805_000058_000000.wav\",\"8193/116805/8193_116805_000005_000000.wav\",\"8193/116804/8193_116804_000047_000000.wav\",\"8193/116805/8193_116805_000015_000003.wav\",\"8193/116804/8193_116804_000035_000000.wav\",\"8193/116805/8193_116805_000036_000001.wav\",\"8193/116804/8193_116804_000070_000001.wav\",\"8193/116805/8193_116805_000012_000000.wav\",\"8193/116805/8193_116805_000014_000000.wav\",\"8193/116804/8193_116804_000055_000003.wav\",\"8193/116805/8193_116805_000039_000003.wav\",\"8193/116805/8193_116805_000016_000000.wav\",\"8193/116804/8193_116804_000017_000003.wav\",\"8193/116804/8193_116804_000070_000001.wav\",\"8193/116805/8193_116805_000065_000001.wav\",\"829/123192/829_123192_000032_000000.wav\",\"829/123192/829_123192_000059_000000.wav\",\"829/123192/829_123192_000059_000000.wav\",\"829/123191/829_123191_000006_000000.wav\",\"829/123191/829_123191_000053_000001.wav\",\"829/123192/829_123192_000059_000000.wav\",\"829/123192/829_123192_000076_000000.wav\",\"829/123191/829_123191_000077_000003.wav\",\"829/123192/829_123192_000069_000000.wav\",\"829/123192/829_123192_000025_000000.wav\",\"829/123192/829_123192_000011_000000.wav\",\"829/123191/829_123191_000023_000000.wav\",\"829/123192/829_123192_000027_000000.wav\",\"829/123192/829_123192_000011_000000.wav\",\"829/123191/829_123191_000020_000000.wav\",\"829/123191/829_123191_000036_000000.wav\",\"829/123192/829_123192_000025_000002.wav\",\"829/123191/829_123191_000032_000001.wav\",\"829/123192/829_123192_000011_000000.wav\",\"829/123191/829_123191_000048_000000.wav\",\"2577/157236/2577_157236_000055_000001.wav\",\"2577/157236/2577_157236_000179_000001.wav\",\"2577/157236/2577_157236_000067_000000.wav\",\"2577/157236/2577_157236_000031_000001.wav\",\"2577/157236/2577_157236_000176_000001.wav\",\"2577/157236/2577_157236_000164_000000.wav\",\"2577/157236/2577_157236_000179_000001.wav\",\"2577/157236/2577_157236_000023_000001.wav\",\"2577/157236/2577_157236_000158_000000.wav\",\"2577/157236/2577_157236_000179_000003.wav\",\"2577/157236/2577_157236_000180_000000.wav\",\"2577/157236/2577_157236_000164_000001.wav\",\"2577/157236/2577_157236_000179_000001.wav\",\"2577/157236/2577_157236_000126_000004.wav\",\"2577/157236/2577_157236_000118_000000.wav\",\"2577/157236/2577_157236_000045_000000.wav\",\"2577/157236/2577_157236_000017_000001.wav\",\"2577/157236/2577_157236_000102_000005.wav\",\"2577/157236/2577_157236_000044_000000.wav\",\"2577/157236/2577_157236_000105_000001.wav\",\"511/131228/511_131228_000094_000001.wav\",\"511/131228/511_131228_000078_000001.wav\",\"511/131226/511_131226_000051_000000.wav\",\"511/131228/511_131228_000084_000000.wav\",\"511/131228/511_131228_000078_000001.wav\",\"511/131226/511_131226_000041_000001.wav\",\"511/131226/511_131226_000060_000000.wav\",\"511/131228/511_131228_000040_000001.wav\",\"511/131226/511_131226_000074_000000.wav\",\"511/131226/511_131226_000032_000000.wav\",\"511/131226/511_131226_000042_000000.wav\",\"511/131226/511_131226_000035_000000.wav\",\"511/131228/511_131228_000078_000001.wav\",\"511/131228/511_131228_000067_000000.wav\",\"511/131228/511_131228_000029_000000.wav\",\"511/131226/511_131226_000019_000000.wav\",\"511/131228/511_131228_000087_000002.wav\",\"511/131226/511_131226_000040_000007.wav\",\"511/131226/511_131226_000020_000000.wav\",\"511/131228/511_131228_000026_000000.wav\",\"5583/38026/5583_38026_000050_000000.wav\",\"5583/41919/5583_41919_000007_000002.wav\",\"5583/38026/5583_38026_000008_000000.wav\",\"5583/41919/5583_41919_000012_000001.wav\",\"5583/41259/5583_41259_000007_000002.wav\",\"5583/41919/5583_41919_000010_000002.wav\",\"5583/38026/5583_38026_000023_000001.wav\",\"5583/38026/5583_38026_000064_000000.wav\",\"5583/38026/5583_38026_000050_000000.wav\",\"5583/38026/5583_38026_000019_000000.wav\",\"5583/41259/5583_41259_000022_000000.wav\",\"5583/41919/5583_41919_000014_000003.wav\",\"5583/38026/5583_38026_000023_000000.wav\",\"5583/38026/5583_38026_000054_000002.wav\",\"5583/41259/5583_41259_000017_000001.wav\",\"5583/38026/5583_38026_000021_000002.wav\",\"5583/38026/5583_38026_000037_000000.wav\",\"5583/41259/5583_41259_000007_000005.wav\",\"5583/38026/5583_38026_000015_000000.wav\",\"5583/41259/5583_41259_000001_000003.wav\",\"1827/143625/1827_143625_000069_000000.wav\",\"1827/143625/1827_143625_000031_000005.wav\",\"1827/143625/1827_143625_000034_000009.wav\",\"1827/143625/1827_143625_000004_000000.wav\",\"1827/143625/1827_143625_000006_000000.wav\",\"1827/143625/1827_143625_000054_000000.wav\",\"1827/143625/1827_143625_000021_000001.wav\",\"1827/143625/1827_143625_000010_000000.wav\",\"1827/143625/1827_143625_000006_000000.wav\",\"1827/143625/1827_143625_000002_000004.wav\",\"1827/143625/1827_143625_000026_000005.wav\",\"1827/143625/1827_143625_000006_000000.wav\",\"1827/143625/1827_143625_000029_000003.wav\",\"1827/143625/1827_143625_000029_000003.wav\",\"1827/143625/1827_143625_000025_000000.wav\",\"1827/143625/1827_143625_000026_000004.wav\",\"1827/143625/1827_143625_000054_000000.wav\",\"1827/143625/1827_143625_000054_000000.wav\",\"1827/143625/1827_143625_000071_000000.wav\",\"1827/143625/1827_143625_000002_000010.wav\",\"4222/12898/4222_12898_000015_000000.wav\",\"4222/12898/4222_12898_000018_000002.wav\",\"4222/12898/4222_12898_000020_000000.wav\",\"4222/187005/4222_187005_000030_000002.wav\",\"4222/12898/4222_12898_000007_000004.wav\",\"4222/12898/4222_12898_000045_000007.wav\",\"4222/187005/4222_187005_000005_000000.wav\",\"4222/187005/4222_187005_000031_000000.wav\",\"4222/12898/4222_12898_000014_000000.wav\",\"4222/187006/4222_187006_000026_000000.wav\",\"4222/187005/4222_187005_000035_000001.wav\",\"4222/12898/4222_12898_000040_000000.wav\",\"4222/12898/4222_12898_000007_000005.wav\",\"4222/187005/4222_187005_000031_000000.wav\",\"4222/187006/4222_187006_000007_000001.wav\",\"4222/187005/4222_187005_000001_000000.wav\",\"4222/12898/4222_12898_000044_000000.wav\",\"4222/187005/4222_187005_000033_000001.wav\",\"4222/12898/4222_12898_000040_000001.wav\",\"4222/187005/4222_187005_000014_000000.wav\",\"1046/133224/1046_133224_000021_000008.wav\",\"1046/133225/1046_133225_000041_000002.wav\",\"1046/133225/1046_133225_000036_000005.wav\",\"1046/133224/1046_133224_000015_000001.wav\",\"1046/133225/1046_133225_000044_000000.wav\",\"1046/133225/1046_133225_000036_000003.wav\",\"1046/133225/1046_133225_000010_000001.wav\",\"1046/133224/1046_133224_000021_000001.wav\",\"1046/133224/1046_133224_000015_000000.wav\",\"1046/133225/1046_133225_000027_000000.wav\",\"1046/133225/1046_133225_000021_000000.wav\",\"1046/133224/1046_133224_000021_000007.wav\",\"1046/133225/1046_133225_000013_000001.wav\",\"1046/133224/1046_133224_000015_000003.wav\",\"1046/133224/1046_133224_000013_000006.wav\",\"1046/133225/1046_133225_000009_000000.wav\",\"1046/133225/1046_133225_000006_000000.wav\",\"1046/133225/1046_133225_000018_000001.wav\",\"1046/133225/1046_133225_000013_000001.wav\",\"1046/133224/1046_133224_000021_000001.wav\",\"1903/132499/1903_132499_000068_000000.wav\",\"1903/132499/1903_132499_000025_000000.wav\",\"1903/132499/1903_132499_000036_000003.wav\",\"1903/132499/1903_132499_000069_000002.wav\",\"1903/132499/1903_132499_000068_000002.wav\",\"1903/132499/1903_132499_000090_000004.wav\",\"1903/132499/1903_132499_000036_000000.wav\",\"1903/132499/1903_132499_000027_000002.wav\",\"1903/132499/1903_132499_000088_000018.wav\",\"1903/132499/1903_132499_000022_000001.wav\",\"1903/132499/1903_132499_000076_000000.wav\",\"1903/132499/1903_132499_000016_000003.wav\",\"1903/132499/1903_132499_000034_000003.wav\",\"1903/132499/1903_132499_000069_000000.wav\",\"1903/132499/1903_132499_000036_000003.wav\",\"1903/132499/1903_132499_000057_000009.wav\",\"1903/132499/1903_132499_000024_000003.wav\",\"1903/132499/1903_132499_000075_000003.wav\",\"1903/132499/1903_132499_000088_000007.wav\",\"1903/132499/1903_132499_000043_000001.wav\",\"6727/10344/6727_10344_000004_000000.wav\",\"6727/10344/6727_10344_000046_000001.wav\",\"6727/10344/6727_10344_000025_000000.wav\",\"6727/10344/6727_10344_000055_000002.wav\",\"6727/10344/6727_10344_000039_000004.wav\",\"6727/10344/6727_10344_000004_000000.wav\",\"6727/10344/6727_10344_000035_000002.wav\",\"6727/10344/6727_10344_000025_000006.wav\",\"6727/10344/6727_10344_000037_000009.wav\",\"6727/10344/6727_10344_000011_000000.wav\",\"6727/10344/6727_10344_000003_000000.wav\",\"6727/10344/6727_10344_000056_000000.wav\",\"6727/10344/6727_10344_000035_000002.wav\",\"6727/10344/6727_10344_000035_000001.wav\",\"6727/10344/6727_10344_000037_000008.wav\",\"6727/10344/6727_10344_000046_000001.wav\",\"6727/10344/6727_10344_000026_000000.wav\",\"6727/10344/6727_10344_000025_000005.wav\",\"6727/10344/6727_10344_000056_000003.wav\",\"6727/10344/6727_10344_000003_000000.wav\"],\"label\":[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"1\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"2\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"3\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"4\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"5\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"6\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"7\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"8\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\",\"9\"],\"x\":[-3.1606812477111816,-2.77486515045166,-2.711012363433838,-3.2670810222625732,-3.1857569217681885,-2.6762382984161377,-2.798220634460449,-2.858726978302002,-2.9737770557403564,-2.956408739089966,-3.2381250858306885,-2.7951786518096924,-3.1397297382354736,-3.0064949989318848,-2.912095785140991,-3.1187150478363037,-3.173401117324829,-2.726390838623047,-2.8833956718444824,-2.947739839553833,-4.567573547363281,-4.578644752502441,-4.489212989807129,-4.270125865936279,-4.242483139038086,-4.417922496795654,-4.561956882476807,-3.563723564147949,-4.580752849578857,-4.431382179260254,-4.529460430145264,-4.122570991516113,-4.557018280029297,-4.619349002838135,-3.9843428134918213,-4.022738933563232,-4.3805060386657715,-3.8634088039398193,-4.519543647766113,-4.133539199829102,-10.116006851196289,-10.468204498291016,-10.254526138305664,-9.573077201843262,-9.981188774108887,-10.456389427185059,-10.501800537109375,-9.995732307434082,-10.34338665008545,-9.893121719360352,-10.395406723022461,-10.239717483520508,-10.539709091186523,-10.006428718566895,-9.72574520111084,-10.0088529586792,-10.255437850952148,-9.602444648742676,-7.1522746086120605,-9.79308795928955,-3.1828737258911133,-2.590296983718872,-2.440516948699951,-3.13976788520813,-2.631514549255371,-3.0425379276275635,-3.19071364402771,-2.4660489559173584,-2.8677256107330322,-2.691175937652588,-2.5749831199645996,-2.580756902694702,-2.5031492710113525,-3.0418972969055176,-2.584686756134033,-2.504948377609253,-2.7618863582611084,-2.7913360595703125,-3.0896430015563965,-2.5815749168395996,-6.891053676605225,-7.192995071411133,-6.7999091148376465,-6.9263997077941895,-7.041645050048828,-6.889425754547119,-7.002328395843506,-7.757612705230713,-6.999520778656006,-7.205618858337402,-7.174541473388672,-6.9610066413879395,-7.220072269439697,-7.408241271972656,-7.139148712158203,-7.064228534698486,-7.006400108337402,-6.549012660980225,-7.300623416900635,-7.20405387878418,-10.411309242248535,-10.857507705688477,-10.736696243286133,-10.88607120513916,-10.718442916870117,-10.645585060119629,-10.463425636291504,-10.558672904968262,-10.757495880126953,-10.860898971557617,-10.468467712402344,-10.784775733947754,-10.311744689941406,-10.550034523010254,-10.568222045898438,-10.75507640838623,-10.651739120483398,-10.556307792663574,-2.4752986431121826,-10.332552909851074,4.079848289489746,4.148099899291992,3.9534146785736084,3.423797369003296,3.4712212085723877,4.227757930755615,3.6290574073791504,3.791252613067627,4.359233379364014,4.4114155769348145,3.4708900451660156,4.244836807250977,3.6779139041900635,3.5986037254333496,3.8014416694641113,3.966369152069092,4.181628227233887,3.544233798980713,4.110950946807861,3.6406750679016113,6.199300289154053,6.082859992980957,6.082491874694824,6.0002546310424805,6.251781940460205,6.489964962005615,6.091195106506348,6.56417989730835,5.920825958251953,-3.5338377952575684,5.9702935218811035,6.291346549987793,6.024093151092529,6.016243934631348,6.132412910461426,6.1469197273254395,6.090811729431152,6.089906692504883,5.971016883850098,6.564464569091797,-3.8190841674804688,-4.3313164710998535,-4.202746391296387,-3.847559690475464,-4.692848205566406,-4.631866931915283,-4.271998405456543,-4.553844451904297,-4.715179443359375,-4.688408851623535,-4.05075216293335,-3.789729118347168,-4.062368869781494,-4.068924903869629,-4.206252574920654,-3.922722339630127,-4.003933429718018,-3.9797093868255615,-4.593817234039307,-3.7913308143615723,-2.7009692192077637,-3.2700228691101074,-3.022752523422241,-2.9041662216186523,-3.153395652770996,-2.8796653747558594,-2.957716703414917,-3.0767505168914795,-3.1752121448516846,-3.0709822177886963,-2.7455992698669434,-3.1914548873901367,-2.894855260848999,-3.2783260345458984,-2.998671054840088,-3.2107696533203125,-2.730574131011963,-2.7013425827026367,-2.952733039855957,-2.774390697479248],\"y\":[6.166264057159424,6.380192756652832,6.683015823364258,6.252046585083008,6.0565185546875,6.164169788360596,6.067956924438477,6.222115993499756,6.460431098937988,6.349257469177246,6.389455795288086,6.617327690124512,6.003944396972656,6.220587730407715,6.522432327270508,6.430699825286865,6.511539936065674,6.61389684677124,6.66624641418457,6.270698070526123,9.375914573669434,9.911813735961914,9.927233695983887,8.124340057373047,8.134218215942383,10.012815475463867,9.81711483001709,6.935359001159668,9.927690505981445,9.367259979248047,9.5027437210083,8.045830726623535,9.794713973999023,9.574983596801758,8.256868362426758,8.26749038696289,9.32170581817627,7.726580619812012,9.437990188598633,8.230162620544434,11.174026489257812,10.898594856262207,10.980513572692871,11.359804153442383,10.978575706481934,11.159407615661621,10.959506034851074,11.395026206970215,11.250273704528809,11.374359130859375,10.816308975219727,11.365285873413086,10.99096393585205,11.222780227661133,11.515741348266602,10.894570350646973,11.09619140625,11.345845222473145,12.66846752166748,11.416616439819336,0.6150201559066772,0.5727664828300476,1.197059988975525,0.6711833477020264,0.8181120157241821,0.7986350059509277,0.5980774760246277,0.5483988523483276,0.8343006372451782,1.3131901025772095,1.2926685810089111,0.8192294836044312,0.60872483253479,0.6371785402297974,1.2419419288635254,0.789923906326294,0.9895642995834351,1.070288896560669,0.6442015767097473,0.9097402095794678,12.529427528381348,12.068403244018555,12.773029327392578,12.189614295959473,11.962052345275879,12.334823608398438,12.443355560302734,12.330665588378906,12.443488121032715,12.466773986816406,11.987349510192871,12.070545196533203,12.491742134094238,12.424216270446777,11.917981147766113,12.826085090637207,12.716790199279785,12.624031066894531,12.453993797302246,12.088994026184082,-5.1096415519714355,-5.317790508270264,-5.642304420471191,-5.1158976554870605,-5.0864081382751465,-5.466678142547607,-5.034519672393799,-5.114104747772217,-4.975529193878174,-5.178981304168701,-5.059814453125,-4.997513294219971,-5.348056793212891,-5.387124538421631,-5.2672247886657715,-5.725089073181152,-5.443286895751953,-5.466362953186035,-4.693160533905029,-5.192424774169922,5.956725120544434,5.905540466308594,5.80776309967041,5.851162910461426,5.585705280303955,5.638182640075684,5.862408638000488,5.927237033843994,5.950323581695557,5.777632713317871,5.926275730133057,5.671252250671387,5.654463768005371,5.951079845428467,5.758546352386475,5.5899858474731445,5.831849575042725,5.761802673339844,5.802149772644043,5.752105712890625,-18.17595100402832,-17.9041690826416,-17.924606323242188,-17.878761291503906,-18.0015869140625,-18.020288467407227,-18.54057502746582,-18.124919891357422,-17.983484268188477,-4.850675582885742,-18.01740264892578,-18.182519912719727,-18.39446258544922,-18.001667022705078,-18.04789924621582,-18.63656234741211,-18.55376625061035,-18.309518814086914,-18.34510040283203,-18.189838409423828,-16.757017135620117,-17.429935455322266,-17.380504608154297,-16.918798446655273,-17.39818000793457,-17.20540428161621,-17.333026885986328,-17.362947463989258,-17.398563385009766,-17.306306838989258,-16.770545959472656,-17.02341651916504,-17.152599334716797,-16.911453247070312,-17.31295394897461,-16.897735595703125,-17.118011474609375,-17.056303024291992,-17.276948928833008,-17.049142837524414,-4.215534210205078,-5.0766801834106445,-4.91635274887085,-4.7257232666015625,-4.711700439453125,-4.1083807945251465,-4.3584303855896,-5.018618583679199,-4.9661865234375,-4.581928730010986,-4.2590484619140625,-5.0669074058532715,-4.388965129852295,-5.096145153045654,-4.534728050231934,-5.012913227081299,-4.557061672210693,-4.7465009689331055,-4.890029430389404,-4.341127872467041]},\"selected\":{\"id\":\"1044\",\"type\":\"Selection\"},\"selection_policy\":{\"id\":\"1045\",\"type\":\"UnionRenderers\"}},\"id\":\"1002\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"data_source\":{\"id\":\"1002\",\"type\":\"ColumnDataSource\"},\"glyph\":{\"id\":\"1033\",\"type\":\"Circle\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1034\",\"type\":\"Circle\"},\"selection_glyph\":null,\"view\":{\"id\":\"1036\",\"type\":\"CDSView\"}},\"id\":\"1035\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1034\",\"type\":\"Circle\"},{\"attributes\":{\"overlay\":{\"id\":\"1043\",\"type\":\"BoxAnnotation\"}},\"id\":\"1004\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"factors\":[\"1\",\"6\",\"3\",\"4\",\"0\",\"7\",\"9\",\"2\",\"8\",\"5\"],\"palette\":[\"#1f77b4\",\"#ff7f0e\",\"#2ca02c\",\"#d62728\",\"#9467bd\",\"#8c564b\",\"#e377c2\",\"#7f7f7f\",\"#bcbd22\",\"#17becf\"]},\"id\":\"1031\",\"type\":\"CategoricalColorMapper\"},{\"attributes\":{\"dimension\":1,\"ticker\":{\"id\":\"1022\",\"type\":\"BasicTicker\"}},\"id\":\"1025\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1005\",\"type\":\"ResetTool\"}],\"root_ids\":[\"1007\"]},\"title\":\"Bokeh Application\",\"version\":\"1.3.4\"}};\n", + " var render_items = [{\"docid\":\"95a95da2-6471-485d-aafc-7fcb3a90c6fa\",\"roots\":{\"1007\":\"e515e894-9f0f-4373-b879-972fbfc359fa\"}}];\n", + " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", + "\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " embed_document(root);\n", + " } else {\n", + " var attempts = 0;\n", + " var timer = setInterval(function(root) {\n", + " if (root.Bokeh !== undefined) {\n", + " embed_document(root);\n", + " clearInterval(timer);\n", + " }\n", + " attempts++;\n", + " if (attempts > 100) {\n", + " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", + " clearInterval(timer);\n", + " }\n", + " }, 10, root)\n", + " }\n", + "})(window);" + ], + "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { - "needs_background": "light" + "application/vnd.bokehjs_exec.v0+json": { + "id": "1007" + } }, "output_type": "display_data" } ], "source": [ - "from matplotlib import pylab as plt\n", - "%matplotlib inline\n", + "source_wav_stems = ColumnDataSource(\n", + " data=dict(\n", + " x = projection.T[0].tolist(),\n", + " y = projection.T[1].tolist(),\n", + " desc=locations,\n", + " label=labels\n", + " )\n", + " )\n", "\n", - "model = umap.UMAP()\n", - "projection = model.fit_transform(embeds)\n", - "colors = [viridis(i) for i in labels]\n", + "hover = HoverTool(\n", + " tooltips=[\n", + " (\"file\", \"@desc\"),\n", + " (\"speaker\", \"@label\"),\n", + " ]\n", + " )\n", "\n", - "fig, ax = plt.subplots(figsize=(16, 10))\n", - "im = ax.scatter(projection[:, 0], projection[:, 1], c=colors)\n", - "plt.gca().set_aspect(\"equal\", \"datalim\")\n", - "plt.title(\"UMAP projection\")\n", - "plt.tight_layout()" + "# optionally consider adding these to the tooltips if you want additional detail\n", + "# for the coordinates: (\"(x,y)\", \"($x, $y)\"),\n", + "# for the index of the embedding / wav file: (\"index\", \"$index\"),\n", + "\n", + "factors = list(set(labels))\n", + "pal_size = max(len(factors), 3)\n", + "pal = Category10[pal_size]\n", + "\n", + "p = figure(plot_width=600, plot_height=400, tools=[hover,BoxZoomTool(), ResetTool(), TapTool()])\n", + "\n", + "\n", + "p.circle('x', 'y', source=source_wav_stems, color=factor_cmap('label', palette=pal, factors=factors),)\n", + "\n", + "url = \"http://localhost:8000/@desc\"\n", + "taptool = p.select(type=TapTool)\n", + "taptool.callback = OpenURL(url=url)\n", + "\n", + "show(p)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Local server to serve wav files from corpus\n", + "\n", + "This is required so that when you click on a data point the hyperlink associated with it will be served the file locally.\n", + "\n", + "There are other ways to serve this if you prefer and you can also run the commands manually on the command line\n", + "\n", + "The server will continue to run until stopped. To stop it simply interupt the kernel (ie square button or under Kernel menu)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/neil/main/Projects/LibriTTS/LibriTTS/train-clean-360\n", + "Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...\n", + "^C\n", + "\n", + "Keyboard interrupt received, exiting.\n" + ] + } + ], + "source": [ + "%cd $AUDIO_PATH\n", + "%pwd\n", + "!python -m http.server" + ] }, { "cell_type": "code", From f8b883fabe19761747f9794122db66e39fdd54f0 Mon Sep 17 00:00:00 2001 From: nmstoker Date: Mon, 11 Nov 2019 23:05:02 +0000 Subject: [PATCH 2/3] Update README --- speaker_encoder/README.md | 6 +++++- speaker_encoder/umap.png | Bin 23864 -> 24616 bytes 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/speaker_encoder/README.md b/speaker_encoder/README.md index 53f77724..f9a170b8 100644 --- a/speaker_encoder/README.md +++ b/speaker_encoder/README.md @@ -1,6 +1,10 @@ ### Speaker embedding (Experimental) -This is an implementation of https://arxiv.org/abs/1710.10467. This model can be used for voice and speaker embedding. So you can generate d-vectors for multi-speaker TTS or prune bad samples from your TTS dataset. Below is an example showing embedding results of various speakers. You can generate the same plot with the provided notebook. +This is an implementation of https://arxiv.org/abs/1710.10467. This model can be used for voice and speaker embedding. + +With the code here you can generate d-vectors for both multi-speaker and single-speaker TTS datasets, then visualise and explore them along with the associated audio files in an interactive chart. + +Below is an example showing embedding results of various speakers. You can generate the same plot with the provided notebook as demonstrated in [this video](https://youtu.be/KW3oO7JVa7Q). ![](https://user-images.githubusercontent.com/1402048/64603079-7fa5c100-d3c8-11e9-88e7-88a00d0e37d1.png) diff --git a/speaker_encoder/umap.png b/speaker_encoder/umap.png index 94cd32541b9937940ccdb1be35625e15b089ccf0..ca8aefeac8cbe616983b35e968c9c9133eb41ede 100644 GIT binary patch literal 24616 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 Date: Mon, 11 Nov 2019 23:14:51 +0000 Subject: [PATCH 3/3] Update README image --- speaker_encoder/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/speaker_encoder/README.md b/speaker_encoder/README.md index f9a170b8..38b4bb1b 100644 --- a/speaker_encoder/README.md +++ b/speaker_encoder/README.md @@ -6,7 +6,7 @@ With the code here you can generate d-vectors for both multi-speaker and single- Below is an example showing embedding results of various speakers. You can generate the same plot with the provided notebook as demonstrated in [this video](https://youtu.be/KW3oO7JVa7Q). -![](https://user-images.githubusercontent.com/1402048/64603079-7fa5c100-d3c8-11e9-88e7-88a00d0e37d1.png) +![](umap.png) Download a pretrained model from [Released Models](https://github.com/mozilla/TTS/wiki/Released-Models) page.