|
|
|
|
|
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
<html>
|
|
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=1200px, initial-scale=1.0">
|
|
<title>SingVisio: Visual Analytics of Diffusion Model for Singing Voice Conversion</title>
|
|
<script>
|
|
const baseLink = 'https://dsvc.openmmlab.org.cn';
|
|
</script>
|
|
|
|
<script src="./resources/tailwind.js"></script>
|
|
<script src="./resources/d3.v4.min.js"></script>
|
|
<script src="./resources/htl.min.js"></script>
|
|
<script src="./resources/d3-scale-chromatic.v1.min.js"></script>
|
|
<script src="./resources/d3-contour.v1.min.js"></script>
|
|
|
|
<script src="./resources/driver.js.iife.min.js"></script>
|
|
<link rel="stylesheet" href="./resources/driver.min.css">
|
|
|
|
<script type="module">
|
|
import cfg from "./tailwind.config.js";
|
|
tailwind.config = cfg;
|
|
</script>
|
|
<style type="text/tailwindcss">
|
|
@layer components {
|
|
.btn-small {
|
|
@apply px-3 py-2 text-xs font-medium text-center text-gray-900 focus:outline-none bg-white rounded-lg border border-gray-200 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700
|
|
}
|
|
.btn {
|
|
@apply text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 mr-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800;
|
|
}
|
|
.btn-sec {
|
|
@apply py-2.5 px-5 mr-2 mb-2 text-sm font-medium text-gray-900 focus:outline-none bg-white rounded-lg border border-gray-200 hover:bg-gray-100 hover:text-blue-700 focus:z-10 focus:ring-4 focus:ring-gray-200 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700
|
|
}
|
|
.select-select {
|
|
@apply my-0 py-2 px-1 bg-gray-50 border border-gray-300 text-gray-900 text-xs rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500
|
|
}
|
|
.select-label {
|
|
@apply block text-sm font-medium text-gray-900 dark:text-white;
|
|
}
|
|
.card {
|
|
@apply p-6 bg-white border border-gray-200 rounded-lg dark:bg-gray-800 dark:border-gray-700
|
|
}
|
|
.card-title {
|
|
@apply mb-2 text-base font-bold tracking-tight text-gray-900 dark:text-white
|
|
}
|
|
.timeline-point {
|
|
@apply absolute w-3 h-3 bg-gray-200 rounded-full mt-1.5 -left-1.5 border border-white dark:border-gray-900 dark:bg-gray-700
|
|
}
|
|
.timeline-title {
|
|
@apply text-lg font-semibold text-gray-900 dark:text-white
|
|
}
|
|
.timeline-subtitle {
|
|
@apply text-base font-normal text-gray-500 dark:text-gray-400
|
|
}
|
|
.small-input {
|
|
@apply block w-full p-2 text-gray-900 border border-gray-300 rounded-lg bg-gray-50 sm:text-xs focus:ring-blue-500 focus:border-blue-500 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500;
|
|
}
|
|
.checkbox {
|
|
@apply w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600
|
|
}
|
|
.dropdown_button_text {
|
|
@apply w-full text-xs font-normal text-gray-900 dark:text-white text-left
|
|
}
|
|
.dropdown_button {
|
|
@apply btn-sec text-xs flex items-center w-full px-2 py-2 my-0 disabled:cursor-not-allowed disabled:opacity-50
|
|
}
|
|
}
|
|
</style>
|
|
<style>
|
|
input.step-axis {
|
|
outline: none;
|
|
-webkit-appearance: none;
|
|
background: #0000002b;
|
|
height: 8px;
|
|
}
|
|
|
|
input.step-axis::-webkit-slider-thumb {
|
|
-webkit-appearance: none;
|
|
position: relative;
|
|
width: 18px;
|
|
height: 18px;
|
|
background: url("./img/syllable.png") no-repeat;
|
|
background-size: 18px;
|
|
border-radius: 50%;
|
|
cursor: pointer;
|
|
}
|
|
|
|
audio {
|
|
outline: none;
|
|
height: 34px;
|
|
}
|
|
|
|
|
|
.inputs {
|
|
display: block;
|
|
width: 100%;
|
|
height: 10px;
|
|
|
|
}
|
|
|
|
.inputs input {
|
|
position: absolute;
|
|
}
|
|
|
|
.inputs input::-webkit-slider-thumb {
|
|
pointer-events: all;
|
|
z-index: 2;
|
|
}
|
|
|
|
.inputs input::-webkit-slider-runnable-track {
|
|
pointer-events: none;
|
|
z-index: 1;
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body class="bg-gray-100 dark:bg-gray-900">
|
|
<div id="alert"
|
|
class="hidden fixed top-0 right-0 left-0 z-50 w-full h-[100vh] bg-black bg-opacity-50 justify-center items-center overflow-y-hidden">
|
|
<div class="card flex flex-col min-w-[400px] max-w-2xl max-h-[80vh] p-0 overflow-hidden">
|
|
|
|
<div class="flex items-center justify-between p-4 md:p-5 border-b rounded-t dark:border-gray-600">
|
|
<h3 id="alert_title" class="text-xl font-semibold text-gray-900 dark:text-white">
|
|
Title
|
|
</h3>
|
|
<button id="close_alert" type="button"
|
|
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white">
|
|
<svg class="w-3 h-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
|
|
viewBox="0 0 14 14">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
|
|
d="m1 1 6 6m0 0 6 6M7 7l6-6M7 7l-6 6" />
|
|
</svg>
|
|
<span class="sr-only">Close modal</span>
|
|
</button>
|
|
</div>
|
|
|
|
<div id="alert_text"
|
|
class="p-4 md:p-5 space-y-4 text-base leading-relaxed text-gray-700 dark:text-gray-200 overflow-y-auto">
|
|
Text
|
|
</div>
|
|
|
|
<div class="flex items-center p-4 md:p-5 border-t border-gray-200 rounded-b dark:border-gray-600">
|
|
<button id="finish_alert" type="button"
|
|
class="ml-auto text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800">OK</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="bg-white dark:bg-gray-800 w-full py-4 px-6 border border-b border-gray-200 dark:border-gray-600">
|
|
<div class="mx-auto max-w-[1490px] grid grid-cols-6 align-center items-center">
|
|
|
|
|
|
<span class="col-span-1"></span>
|
|
<span id="title" class="col-span-4 mx-auto font-[800] text-[20px] dark:text-white">SingVisio: Visual
|
|
Analytics of Diffusion Model for Singing Voice Conversion</span>
|
|
|
|
|
|
<div class="flex">
|
|
<button class="btn-small ml-auto" id="mode_change">Switch to _</button>
|
|
<button class="btn-small ml-2" id="help">Help?</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="max-w-[1500px] m-auto">
|
|
<div class="flex flex-row items-start gap-0.5 py-3 p-1">
|
|
<div class="w-[300px] flex flex-col flex-none">
|
|
<div id="performance" class="card p-2 mb-2 flex flex-col flex-none relative">
|
|
<button class="absolute right-1 top-1 btn-small px-1.5 py-0.5 ml-auto rounded-full"
|
|
id="metrics_help">?</button>
|
|
<div class="flex flex-row">
|
|
<div id="histogram" class="flex-none"></div>
|
|
<div id="histogram2" class="flex-none"></div>
|
|
</div>
|
|
<span class="text-[12px] mx-auto dark:text-white">Metrics</span>
|
|
</div>
|
|
|
|
<div id="touch_map" class="card p-2 relative">
|
|
<button class="absolute right-1 top-1 btn-small px-1.5 py-0.5 ml-auto rounded-full"
|
|
id="projection_help">?</button>
|
|
<div class="flex mb-1 align-center items-center space-between dark:text-white">
|
|
<div class="ml-1 text-sm">Step: <span id="current_step_display_number"></span></div>
|
|
<div class="ml-auto flex mr-2">
|
|
<button class="btn-sec h-9 w-9 p-2.5 mb-0" id="reset_map">
|
|
<svg class="w-3.5 h-3.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
|
|
fill="none" viewBox="0 0 18 20">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M16 1v5h-5M2 19v-5h5m10-4a8 8 0 0 1-14.947 3.97M1 10a8 8 0 0 1 14.947-3.97" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div id="dataviz_axisZoom" class="flex flex-wrap border bg-white dark:bg-gray-800 relative"></div>
|
|
</div>
|
|
</div>
|
|
<div class="w-full">
|
|
<div id="step_preview" class="flex min-w-[500px] w-full bg-white dark:bg-gray-800 p-2 card mb-2">
|
|
<div class="mx-auto" id="preview_container">
|
|
</div>
|
|
<div class="mx-auto" id="preview_container2">
|
|
</div>
|
|
<div class="flex flex-col">
|
|
<button class="btn-sec" id="refreshpreview">
|
|
<svg class="w-4 h-4" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none"
|
|
viewBox="0 0 18 20">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
|
|
stroke-width="2"
|
|
d="M16 1v5h-5M2 19v-5h5m10-4a8 8 0 0 1-14.947 3.97M1 10a8 8 0 0 1 14.947-3.97" />
|
|
</svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
<div id="mel_card_container" class="grid grid-cols-3 min-w-[915px] w-full gap-1 justify-items-center">
|
|
</div>
|
|
<div id="tips">
|
|
</div>
|
|
<div id="tooltip" role="tooltip"
|
|
class="invisible absolute z-10 inline-block px-3 py-2 text-sm font-medium text-white bg-gray-900 rounded-lg shadow-sm opacity-[0.9] dark:bg-gray-700">
|
|
Tooltip content
|
|
</div>
|
|
</div>
|
|
<div class="shrink-0 w-[180px]">
|
|
|
|
<div class="card py-2 px-3 relative">
|
|
<button class="absolute right-1 top-1 btn-small px-1.5 py-0.5 ml-auto rounded-full"
|
|
id="control_help">?</button>
|
|
<div class="flex items-center">
|
|
<h5 class="card-title my-1 text-lg">Control Panel</h5>
|
|
</div>
|
|
<div class="flex flex-col w-full rounded-lg gap-0.5" id="control_panel">
|
|
<div>
|
|
<label for="mode_id" class="select-label">Display Mode</label>
|
|
<select id="mode_id" class="select-select"></select>
|
|
</div>
|
|
<div>
|
|
<label for="sourcesinger_id" class="select-label">Source Singer</label>
|
|
<button id="sourcesinger_id" class="dropdown_button" type="button">
|
|
<span class="dropdown_button_text" id="sourcesinger_id_text">Choose Singer</span> <svg
|
|
class="w-2.5 h-2.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
|
|
fill="none" viewBox="0 0 10 6">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
|
|
stroke-width="2" d="m1 1 4 4 4-4" />
|
|
</svg>
|
|
</button>
|
|
|
|
<div id="sourcesinger_id_dropdown"
|
|
class="absolute z-10 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700">
|
|
<ul class="py-2 text-sm text-gray-700 dark:text-gray-200">
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<label for="song_id" class="select-label">Song</label>
|
|
<button id="song_id" class="dropdown_button" type="button">
|
|
<span class="dropdown_button_text" id="song_id_text">Choose Song</span> <svg
|
|
class="w-2.5 h-2.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
|
|
fill="none" viewBox="0 0 10 6">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
|
|
stroke-width="2" d="m1 1 4 4 4-4" />
|
|
</svg>
|
|
</button>
|
|
|
|
<div id="song_id_dropdown"
|
|
class="absolute z-10 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700">
|
|
<ul class="py-2 text-sm text-gray-700 dark:text-gray-200">
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<label for="target_id" class="select-label">Target Singer</label>
|
|
<button id="target_id" class="dropdown_button" type="button">
|
|
<span class="dropdown_button_text" id="target_id_text">Target Singer</span> <svg
|
|
class="w-2.5 h-2.5" aria-hidden="true" xmlns="http://www.w3.org/2000/svg"
|
|
fill="none" viewBox="0 0 10 6">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"
|
|
stroke-width="2" d="m1 1 4 4 4-4" />
|
|
</svg>
|
|
</button>
|
|
|
|
<div id="target_id_dropdown"
|
|
class="absolute z-10 hidden bg-white divide-y divide-gray-100 rounded-lg shadow w-44 dark:bg-gray-700">
|
|
<ul class="py-2 text-sm text-gray-700 dark:text-gray-200">
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div class="relative">
|
|
<label for="pic_id" class="select-label">Projection Embedding</label>
|
|
<select id="pic_id" class="select-select"></select>
|
|
</div>
|
|
<div class="relative" id="components">
|
|
<label for="components" class="select-label">Components</label>
|
|
<div class="flex flex-col gap-0.5">
|
|
<div class="flex items-center">
|
|
<input id="components_pitch" type="checkbox" checked class="checkbox">
|
|
<label for="components_pitch"
|
|
class="ml-1 text-[0.775rem] font-normal text-gray-900 dark:text-gray-300">F0
|
|
contour</label>
|
|
</div>
|
|
<div class="flex items-start">
|
|
<input id="components_frequncy" type="checkbox" checked class="checkbox">
|
|
<div class="flex flex-col gap-0.5 grow">
|
|
<label for="components_frequncy"
|
|
class="ml-1 mb-1 text-[0.775rem] font-normal text-gray-900 dark:text-gray-300">Frequency</label>
|
|
<div class="flex inputs w-full">
|
|
<input id="inputs_min" type="range"
|
|
class="h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
|
value="0" min="0">
|
|
<input id="inputs_max" type="range"
|
|
class="h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
|
value="100" max="100">
|
|
</div>
|
|
<div class="flex w-full">
|
|
<span id="inputs_left" class="ml-1 mr-auto text-[0.7rem] font-normal text-gray-900 dark:text-white">0</span>
|
|
<span id="inputs_right" class="mr-2 ml-auto text-[0.7rem] font-normal text-gray-900 dark:text-white">100</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="flex items-start">
|
|
<input id="sampling_steps" type="checkbox" class="checkbox">
|
|
<div class="flex flex-col grow">
|
|
<label for="sampling_steps"
|
|
class="ml-1 text-[0.775rem] font-normal text-gray-900 dark:text-gray-300">Sampling
|
|
steps</label>
|
|
<div class="flex flex-row h-[32px]">
|
|
<span class="my-auto mx-1 text-[0.775rem] font-normal text-gray-900 dark:text-white">Step count:</span>
|
|
<input type="text"
|
|
class="small-input flex-none w-[50px] text-center bg-white dark:bg-gray-800"
|
|
id="sampling_num" value="100">
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="step_axis">
|
|
<label for="range" class="select-label">Step Axis</label>
|
|
|
|
<div
|
|
class="items-center w-full rounded-lg bg-gray-50 flex flex-row gap-2 px-2 py-0.5 border border-gray-300 dark:border-gray-600 dark:text-white dark:bg-gray-700">
|
|
|
|
<input class="step-axis my-2 w-full" id="range" type="range" min="0" max="999" value="0"
|
|
step="1">
|
|
<button class="btn-small" id="controls">
|
|
<svg id="icon_play" style="display: none" class="w-3 h-3" aria-hidden="true"
|
|
xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 14 16">
|
|
<path
|
|
d="M0 .984v14.032a1 1 0 0 0 1.506.845l12.006-7.016a.974.974 0 0 0 0-1.69L1.506.139A1 1 0 0 0 0 .984Z" />
|
|
</svg>
|
|
<svg id="icon_stop" class="w-3 h-3" aria-hidden="true"
|
|
xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 12 16">
|
|
<path
|
|
d="M3 0H2a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2Zm7 0H9a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2Z" />
|
|
</svg>
|
|
</button>
|
|
|
|
</div>
|
|
<div class="flex gap-1 mt-2">
|
|
<span class="my-auto mr-1 text-sm font-medium text-gray-900 dark:text-white">Step:</span>
|
|
<input type="text"
|
|
class="small-input flex-none w-[60px] text-center bg-white dark:bg-gray-800" id="value">
|
|
<button class="btn-small" id="add_preview">
|
|
Pin
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<script src="./resources/init.js"></script>
|
|
<script src="./resources/function.js"></script>
|
|
<script src="./resources/event.js"></script>
|
|
<script>
|
|
initConfig('./config/default.json')
|
|
</script>
|
|
</body> |