File size: 18,731 Bytes
f3130f1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Supertonic 2 - Lightning-Fast, On-Device Multilingual TTS</title>
<meta name="description"
content="Supertonic 2 - A lightweight, super-fast text-to-speech synthesis system with on-device capabilities. Multi-language support with ONNX Runtime.">
<link rel="stylesheet" href="styles.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap"
rel="stylesheet">
<link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap"
rel="stylesheet">
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/gh/devicons/devicon@latest/devicon.min.css">
<!-- Import map for ES modules -->
<script type="importmap">
{
"imports": {
"onnxruntime-web": "https://cdn.jsdelivr.net/npm/onnxruntime-web@1.23.0/dist/ort.webgpu.min.mjs",
"fft.js": "https://esm.sh/fft.js@4.0.4"
}
}
</script>
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.io/js/pa-GHmWt-afyVp4WuenlUJZX.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
</head>
<body>
<!-- Interactive TTS Demo Section -->
<section class="interactive-demo" id="interactive-demo">
<div class="container">
<div class="demo-container">
<div class="demo-content">
<div class="demo-header-wrapper">
<img src="img/supertonic_lighteninggraphic.svg" alt="Lightning" class="demo-header-icon" />
<h2 class="demo-header">
<span class="demo-header-text"><span class="demo-header-bold">Supertonic 2</span> | Lightning Fast, On-Device, Multilingual TTS</span>
<span class="demo-header-links">
<a href="https://github.com/supertone-inc/supertonic/" class="demo-header-link" target="_blank" rel="noopener noreferrer"><svg class="demo-header-link-icon" viewBox="0 0 24 24" fill="currentColor" width="16" height="16"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg>Github</a><a href="https://huggingface.co/Supertone/supertonic-2" class="demo-header-link" target="_blank" rel="noopener noreferrer"><svg class="demo-header-link-icon" viewBox="0 0 95 88" fill="none" width="16" height="16"><path fill="#FFD21E" d="M47.21 76.5a34.75 34.75 0 1 0 0-69.5 34.75 34.75 0 0 0 0 69.5Z" /><path fill="#FF9D0B" d="M81.96 41.75a34.75 34.75 0 1 0-69.5 0 34.75 34.75 0 0 0 69.5 0Zm-73.5 0a38.75 38.75 0 1 1 77.5 0 38.75 38.75 0 0 1-77.5 0Z" /><path fill="#3A3B45" d="M58.5 32.3c1.28.44 1.78 3.06 3.07 2.38a5 5 0 1 0-6.76-2.07c.61 1.15 2.55-.72 3.7-.32ZM34.95 32.3c-1.28.44-1.79 3.06-3.07 2.38a5 5 0 1 1 6.76-2.07c-.61 1.15-2.56-.72-3.7-.32Z" /><path fill="#FF323D" d="M46.96 56.29c9.83 0 13-8.76 13-13.26 0-2.34-1.57-1.6-4.09-.36-2.33 1.15-5.46 2.74-8.9 2.74-7.19 0-13-6.88-13-2.38s3.16 13.26 13 13.26Z" /><path fill="#3A3B45" fillRule="evenodd" d="M39.43 54a8.7 8.7 0 0 1 5.3-4.49c.4-.12.81.57 1.24 1.28.4.68.82 1.37 1.24 1.37.45 0 .9-.68 1.33-1.35.45-.7.89-1.38 1.32-1.25a8.61 8.61 0 0 1 5 4.17c3.73-2.94 5.1-7.74 5.1-10.7 0-2.34-1.57-1.6-4.09-.36l-.14.07c-2.31 1.15-5.39 2.67-8.77 2.67s-6.45-1.52-8.77-2.67c-2.6-1.29-4.23-2.1-4.23.29 0 3.05 1.46 8.06 5.47 10.97Z" clipRule="evenodd" /><path fill="#FF9D0B" d="M70.71 37a3.25 3.25 0 1 0 0-6.5 3.25 3.25 0 0 0 0 6.5ZM24.21 37a3.25 3.25 0 1 0 0-6.5 3.25 3.25 0 0 0 0 6.5ZM17.52 48c-1.62 0-3.06.66-4.07 1.87a5.97 5.97 0 0 0-1.33 3.76 7.1 7.1 0 0 0-1.94-.3c-1.55 0-2.95.59-3.94 1.66a5.8 5.8 0 0 0-.8 7 5.3 5.3 0 0 0-1.79 2.82c-.24.9-.48 2.8.8 4.74a5.22 5.22 0 0 0-.37 5.02c1.02 2.32 3.57 4.14 8.52 6.1 3.07 1.22 5.89 2 5.91 2.01a44.33 44.33 0 0 0 10.93 1.6c5.86 0 10.05-1.8 12.46-5.34 3.88-5.69 3.33-10.9-1.7-15.92-2.77-2.78-4.62-6.87-5-7.77-.78-2.66-2.84-5.62-6.25-5.62a5.7 5.7 0 0 0-4.6 2.46c-1-1.26-1.98-2.25-2.86-2.82A7.4 7.4 0 0 0 17.52 48Zm0 4c.51 0 1.14.22 1.82.65 2.14 1.36 6.25 8.43 7.76 11.18.5.92 1.37 1.31 2.14 1.31 1.55 0 2.75-1.53.15-3.48-3.92-2.93-2.55-7.72-.68-8.01.08-.02.17-.02.24-.02 1.7 0 2.45 2.93 2.45 2.93s2.2 5.52 5.98 9.3c3.77 3.77 3.97 6.8 1.22 10.83-1.88 2.75-5.47 3.58-9.16 3.58-3.81 0-7.73-.9-9.92-1.46-.11-.03-13.45-3.8-11.76-7 .28-.54.75-.76 1.34-.76 2.38 0 6.7 3.54 8.57 3.54.41 0 .7-.17.83-.6.79-2.85-12.06-4.05-10.98-8.17.2-.73.71-1.02 1.44-1.02 3.14 0 10.2 5.53 11.68 5.53.11 0 .2-.03.24-.1.74-1.2.33-2.04-4.9-5.2-5.21-3.16-8.88-5.06-6.8-7.33.24-.26.58-.38 1-.38 3.17 0 10.66 6.82 10.66 6.82s2.02 2.1 3.25 2.1c.28 0 .52-.1.68-.38.86-1.46-8.06-8.22-8.56-11.01-.34-1.9.24-2.85 1.31-2.85Z" /><path fill="#FFD21E" d="M38.6 76.69c2.75-4.04 2.55-7.07-1.22-10.84-3.78-3.77-5.98-9.3-5.98-9.3s-.82-3.2-2.69-2.9c-1.87.3-3.24 5.08.68 8.01 3.91 2.93-.78 4.92-2.29 2.17-1.5-2.75-5.62-9.82-7.76-11.18-2.13-1.35-3.63-.6-3.13 2.2.5 2.79 9.43 9.55 8.56 11-.87 1.47-3.93-1.71-3.93-1.71s-9.57-8.71-11.66-6.44c-2.08 2.27 1.59 4.17 6.8 7.33 5.23 3.16 5.64 4 4.9 5.2-.75 1.2-12.28-8.53-13.36-4.4-1.08 4.11 11.77 5.3 10.98 8.15-.8 2.85-9.06-5.38-10.74-2.18-1.7 3.21 11.65 6.98 11.76 7.01 4.3 1.12 15.25 3.49 19.08-2.12Z" /><path fill="#FF9D0B" d="M77.4 48c1.62 0 3.07.66 4.07 1.87a5.97 5.97 0 0 1 1.33 3.76 7.1 7.1 0 0 1 1.95-.3c1.55 0 2.95.59 3.94 1.66a5.8 5.8 0 0 1 .8 7 5.3 5.3 0 0 1 1.78 2.82c.24.9.48 2.8-.8 4.74a5.22 5.22 0 0 1 .37 5.02c-1.02 2.32-3.57 4.14-8.51 6.1-3.08 1.22-5.9 2-5.92 2.01a44.33 44.33 0 0 1-10.93 1.6c-5.86 0-10.05-1.8-12.46-5.34-3.88-5.69-3.33-10.9 1.7-15.92 2.78-2.78 4.63-6.87 5.01-7.77.78-2.66 2.83-5.62 6.24-5.62a5.7 5.7 0 0 1 4.6 2.46c1-1.26 1.98-2.25 2.87-2.82A7.4 7.4 0 0 1 77.4 48Zm0 4c-.51 0-1.13.22-1.82.65-2.13 1.36-6.25 8.43-7.76 11.18a2.43 2.43 0 0 1-2.14 1.31c-1.54 0-2.75-1.53-.14-3.48 3.91-2.93 2.54-7.72.67-8.01a1.54 1.54 0 0 0-.24-.02c-1.7 0-2.45 2.93-2.45 2.93s-2.2 5.52-5.97 9.3c-3.78 3.77-3.98 6.8-1.22 10.83 1.87 2.75 5.47 3.58 9.15 3.58 3.82 0 7.73-.9 9.93-1.46.1-.03 13.45-3.8 11.76-7-.29-.54-.75-.76-1.34-.76-2.38 0-6.71 3.54-8.57 3.54-.42 0-.71-.17-.83-.6-.8-2.85 12.05-4.05 10.97-8.17-.19-.73-.7-1.02-1.44-1.02-3.14 0-10.2 5.53-11.68 5.53-.1 0-.19-.03-.23-.1-.74-1.2-.34-2.04 4.88-5.2 5.23-3.16 8.9-5.06 6.8-7.33-.23-.26-.57-.38-.98-.38-3.18 0-10.67 6.82-10.67 6.82s-2.02 2.1-3.24 2.1a.74.74 0 0 1-.68-.38c-.87-1.46 8.05-8.22 8.55-11.01.34-1.9-.24-2.85-1.31-2.85Z" /><path fill="#FFD21E" d="M56.33 76.69c-2.75-4.04-2.56-7.07 1.22-10.84 3.77-3.77 5.97-9.3 5.97-9.3s.82-3.2 2.7-2.9c1.86.3 3.23 5.08-.68 8.01-3.92 2.93.78 4.92 2.28 2.17 1.51-2.75 5.63-9.82 7.76-11.18 2.13-1.35 3.64-.6 3.13 2.2-.5 2.79-9.42 9.55-8.55 11 .86 1.47 3.92-1.71 3.92-1.71s9.58-8.71 11.66-6.44c2.08 2.27-1.58 4.17-6.8 7.33-5.23 3.16-5.63 4-4.9 5.2.75 1.2 12.28-8.53 13.36-4.4 1.08 4.11-11.76 5.3-10.97 8.15.8 2.85 9.05-5.38 10.74-2.18 1.69 3.21-11.65 6.98-11.76 7.01-4.31 1.12-15.26 3.49-19.08-2.12Z" /></svg>Models</a><a href="https://chromewebstore.google.com/detail/mdbiaajonlkomihpcaffhkagodbcgbme?utm_source=item-share-cb" class="demo-header-link" target="_blank" rel="noopener noreferrer"><img src="img/chrome.svg" class="demo-header-link-icon" width="16" height="16" alt="Chrome" />Extension</a>
</span>
</h2>
</div>
<div class="demo-controls">
<div class="demo-param">
<div class="speaker-container">
<label class="speaker-label">Speaker: </label>
<div class="speaker-list" id="speakerList">
<span class="speaker-item" data-voice="M1">Alex</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="M2">James</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="M3">Robert</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="M4">Sam</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="M5">Daniel</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="F1">Sarah</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="F2">Lily</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="F3">Jessica</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="F4">Olivia</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-voice="F5">Emily</span>
<span class="speaker-item speaker-item-create" id="createVoiceBtn" style="display: none;">+Create your own voice</span>
</div>
</div>
<div class="language-info">
<label class="speaker-label">Language: </label>
<div class="speaker-list" id="languageList">
<span class="speaker-item" data-language="en">English</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-language="es">Spanish</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-language="pt">Portuguese</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-language="fr">French</span><span class="speaker-separator">, </span>
<span class="speaker-item" data-language="ko">Korean</span>
</div>
</div>
</div>
</div>
<div class="demo-input-section">
<div class="demo-input-label">
<label for="demoTextInput">Enter text to synthesize:</label>
</div>
<div
id="demoTextInput"
contenteditable="true"
spellcheck="false"
class="demo-text-input-editable"
data-placeholder="Type any text here to convert it into speech... (minimum 10 characters)">This text-to-speech system runs entirely in your browser, providing fast and private operation without sending any data to external servers.</div>
<div id="presetControlsRow">
<div id="presetButtonGroup">
<span class="preset-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" width="18" height="18" focusable="false">
<rect x="4" y="6" width="14" height="2" fill="#000"/>
<rect x="4" y="10" width="10" height="2" fill="#000"/>
<rect x="4" y="14" width="14" height="2" fill="#000"/>
<rect x="4" y="18" width="10" height="2" fill="#000"/>
</svg>
</span>
<span class="preset-item" data-preset="freeform" id="freeformBtn">Freeform</span>
<span class="preset-item" data-preset="quote" id="presetQuoteBtn">Quote</span>
<span class="preset-item" data-preset="paragraph" id="presetParagraphBtn">Paragraph</span>
<span class="preset-item" data-preset="script" id="presetScriptBtn">Script</span>
<span class="preset-item" data-preset="book" id="presetBookBtn" style="display: none;">Book</span>
</div>
<span class="demo-char-counter" id="demoCharCounter">
<span class="demo-char-warning" id="demoCharWarning"></span>
<span id="demoCharCount">126</span> characters
</span>
</div>
</div>
<div class="demo-output-section">
<!-- Coming Soon Modal -->
<div id="comingSoonModal" class="coming-soon-modal">
<div class="coming-soon-modal-overlay"></div>
<div class="coming-soon-modal-content">
<div class="coming-soon-modal-header">
<h3>Coming Soon</h3>
</div>
<div class="coming-soon-modal-body">
<p>Custom voice creation feature will be available soon.</p>
</div>
<div class="coming-soon-modal-footer">
<button class="coming-soon-modal-btn" id="comingSoonCloseBtn">OK</button>
</div>
</div>
</div>
<!-- Parameters in horizontal layout -->
<div class="demo-params-row">
<div class="demo-param">
<div class="demo-param-header">
<label for="demoTotalSteps">
Quality: <span class="param-value" id="demoTotalStepsValue">5 Steps</span>
</label>
</div>
<input type="range" id="demoTotalSteps" value="5" min="2" max="16" step="1">
</div>
<div class="demo-param">
<div class="demo-param-header">
<label for="demoSpeed">
Speech Speed: <span class="param-value" id="demoSpeedValue">1.0x</span>
</label>
</div>
<input type="range" id="demoSpeed" value="1.0" min="0.8" max="1.3" step="0.05">
</div>
<button id="demoGenerateBtn" class="demo-generate-btn" disabled>
<img src="img/supertonic_lighteninggraphic.svg" alt="Generate" width="20" height="20" />
<span class="text">Generate Speech</span>
<span class="shimmer" aria-hidden="true"></span>
</button>
</div>
</div>
<div id="demoResults" class="demo-results">
<div class="demo-placeholder">
<div class="demo-placeholder-icon">🎙️</div>
<p>Your generated speech will appear here</p>
</div>
</div>
</div>
<!-- Moved below content: status box and info banner -->
<div class="demo-status-box" id="demoStatusBox">
<div class="demo-status-content">
<div class="demo-status-text" id="demoStatusText">
<strong>Initializing...</strong> Loading models...
</div>
</div>
</div>
<div id="wasmWarningBanner" class="wasm-warning-banner" style="display: none;">
Currently using WASM backend. For optimal performance, we recommend using a browser with WebGPU support (Chrome 113+ or Edge 113+).
</div>
<div id="demoError" class="demo-error"></div>
</div>
</div>
</section>
<script src="preset-texts.js"></script>
<!-- Speaker Tooltip -->
<div id="speakerTooltip" class="speaker-tooltip"></div>
<!-- Language Auto-Detection Toast -->
<div id="languageToast" class="language-toast">
<span class="language-toast-icon">⚠️</span>
<span class="language-toast-message" id="languageToastMessage"></span>
</div>
<script type="module" src="script.js"></script>
</body>
</html>
|