Kokoro-FastAPI/web/index.html
mpnsk 2f420daad5 use local js file instead of the unpkg cdn
unpg.com was down, which broke the ui.
I guess for stability deps should be local
or at least pinned to a version.
2025-03-15 16:36:03 +01:00

138 lines
7.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FastKoko: Kokoro-based TTS</title>
<link rel="icon" type="image/svg+xml" href="favicon.svg">
<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@400;500;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="styles/base.css">
<link rel="stylesheet" href="styles/layout.css">
<link rel="stylesheet" href="styles/header.css">
<link rel="stylesheet" href="styles/forms.css">
<link rel="stylesheet" href="styles/player.css">
<link rel="stylesheet" href="styles/responsive.css">
<link rel="stylesheet" href="styles/badges.css">
<link rel="stylesheet" href="styles/controls.css">
<script src="./siriwave.js"></script>
<script async defer src="https://buttons.github.io/buttons.js"></script>
</head>
<body>
<div class="sun">
<div class="scanline"></div>
</div>
<div class="overlay"></div>
<div class="grid-overlay"></div>
<div class="badges-container">
<a href="https://huggingface.co/hexgrad/Kokoro-82M" target="_blank" class="badge">
<img src="https://img.shields.io/badge/Powered--by--HexGrad%2FKokoro--82M-black?logo=huggingface&logoColor=white&labelColor=black&style=for-the-badge" alt="HexGrad/Kokoro-82M on Hugging Face">
</a>
<div class="logo-container">
<h1>FastKoko</h1>
<div class="cup">
<div class="handle"></div>
<div class="steam"></div>
</div>
</div>
<div class="badge">
<a class="github-button" href="https://github.com/remsky/Kokoro-FastAPI" data-color-scheme="dark" data-size="large" data-show-count="true" aria-label="Star remsky/Kokoro-FastAPI on GitHub">Kokoro-FastAPI</a>
</div>
</div>
<div class="container">
<main>
<div class="main-column">
<div id="text-editor"></div>
<div class="player-container">
<div class="player-controls">
<button id="play-pause-btn" class="player-btn">Play</button>
<input type="range" id="seek-slider" class="seek-slider" min="0" max="100" value="0">
<div class="volume-control">
<svg class="volume-icon" viewBox="0 0 24 24" width="20" height="20">
<path fill="currentColor" d="M12,4L9.91,6.09L12,8.18M4.27,3L3,4.27L7.73,9H3V15H7L12,20V13.27L16.25,17.53C15.58,18.04 14.83,18.46 14,18.7V20.77C15.38,20.45 16.63,19.82 17.68,18.96L19.73,21L21,19.73L12,10.73M19,12C19,12.94 18.8,13.82 18.46,14.64L19.97,16.15C20.62,14.91 21,13.5 21,12C21,7.72 18,4.14 14,3.23V5.29C16.89,6.15 19,8.83 19,12M16.5,12C16.5,10.23 15.5,8.71 14,7.97V10.18L16.45,12.63C16.5,12.43 16.5,12.21 16.5,12Z"/>
</svg>
<input type="range" id="volume-slider" class="volume-slider" min="0" max="100" value="100">
</div>
<span id="time-display" class="time-display">0:00</span>
</div>
<div id="wave-container" class="wave-container"></div>
<div class="download-placeholder"></div>
<div id="download-btn" class="download-button">
<div class="download-glow"></div>
<div class="download-icon">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
<path d="M8 11L4 7h8l-4 4z" fill="currentColor"/>
<path d="M8 3v8M4 14h8" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
</svg>
</div>
</div>
</div>
</div>
<div class="controls">
<div class="voice-select-container">
<div class="voice-search-wrapper">
<input
type="text"
id="voice-search"
class="voice-search"
placeholder="Search voices..."
autocomplete="off"
>
<div class="voice-dropdown" id="voice-dropdown">
<div class="voice-options" id="voice-options">
<!-- Voice options will be inserted here -->
</div>
</div>
</div>
<div class="selected-voices" id="selected-voices">
<!-- Selected voice tags will appear here -->
</div>
</div>
<div class="options">
<div class="speed-control">
<label for="speed-slider">Speed: <span id="speed-value">1.0</span>x</label>
<input type="range" id="speed-slider" min="0.1" max="4" step="0.1" value="1.0">
</div>
<div class="lang-control">
<label for="lang-select">Language:</label>
<select id="lang-select" class="lang-select">
<option value="">Auto</option>
<option value="e">Spanish</option>
<option value="a">English</option>
<option value="f">French</option>
<option value="h">Hindi</option>
<option value="i">Italian</option>
<option value="p">Portuguese</option>
<option value="j">Japanese</option>
<option value="z">Chinese</option>
</select>
</div>
</div>
<div class="button-group">
<button id="generate-btn">
<span class="btn-text">Generate Speech</span>
<span class="loader"></span>
</button>
<div class="generation-options">
<label>
<input type="checkbox" id="autoplay-toggle" checked>
Auto-play
</label>
<select id="format-select" class="format-select">
<option value="mp3">MP3</option>
<option value="wav">WAV</option>
<option value="pcm">PCM</option>
</select>
</div>
<button id="cancel-btn" class="player-btn cancel" style="display: none;">
Cancel
</button>
</div>
<div id="status" class="status"></div>
</div>
</main>
</div>
<script type="module" src="src/App.js"></script>
</body>
</html>