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",
+ " \"re-rerun `output_notebook()` to attempt to load from CDN again, or \\n\"+\n",
+ " \"use INLINE resources instead, as so: \\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 \"re-rerun `output_notebook()` to attempt to load from CDN again, or \\n\"+\n \"use INLINE resources instead, as so: \\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",