harmosplit / static /index.html
indigo0511
initial: HarmoSplit app
d90b8a8
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HarmoSplit — 主旋律 / ハモリ 分離アプリ</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/style.css">
</head>
<body>
<div class="bg-orbs">
<div class="orb orb1"></div>
<div class="orb orb2"></div>
<div class="orb orb3"></div>
</div>
<main class="container">
<!-- ヘッダー -->
<header class="header">
<div class="logo">
<span class="logo-icon">🎧</span>
<span class="logo-text">HarmoSplit</span>
</div>
<p class="tagline">音楽ファイルから<strong>主旋律</strong><strong>ハモリ</strong>を AI が分離。<br>左右イヤホンで聴き分けられる WAV を生成します。</p>
</header>
<!-- アップロードカード -->
<section class="card upload-card" id="uploadSection">
<!-- トークン認証エリア(Stripe 設定時のみ表示) -->
<div class="token-area" id="tokenArea" style="display:none;">
<div class="token-row">
<input type="text" id="tokenInput" placeholder="アクセストークンを入力..."
autocomplete="off" spellcheck="false">
<button class="btn-verify" id="verifyBtn">確認</button>
</div>
<p class="token-hint">512 トークンをお持ちでない方は <a href="/pricing" class="pricing-link">料金ページ</a> から登録できます。</p>
<p class="token-ok hidden" id="tokenOk">✅ 認証済み</p>
</div>
<div class="drop-zone" id="dropZone">
<div class="drop-icon">🎵</div>
<p class="drop-text">音声・動画ファイルをドロップ</p>
<p class="drop-sub">または</p>
<label class="btn btn-outline" for="fileInput">ファイルを選択</label>
<input type="file" id="fileInput" accept=".mp3,.wav,.flac,.aac,.ogg,.m4a,.mp4,.mov,.avi,.mkv,.m4v,.webm" hidden>
<p class="drop-formats">MP3 / WAV / MP4 / MOV / MKV などに対応</p>
</div>
<!-- 設定パネル -->
<div class="settings">
<div class="setting-row">
<label for="instVol">伴奏音量</label>
<input type="range" id="instVol" min="0" max="1" step="0.05" value="0.15">
<span class="setting-value" id="instVolLabel">15%</span>
</div>
<div class="setting-row">
<label for="modelSelect">Demucs モデル</label>
<select id="modelSelect">
<option value="htdemucs_6s">htdemucs_6s(推奨・高品質)</option>
<option value="htdemucs">htdemucs(軽量・高速)</option>
</select>
</div>
<div class="setting-row">
<label for="useMdx">
UVR AI 分離(高精度)
<span class="badge">推奨</span>
</label>
<label class="toggle">
<input type="checkbox" id="useMdx" checked>
<span class="slider"></span>
</label>
</div>
</div>
<button class="btn btn-primary" id="startBtn" disabled>処理を開始</button>
</section>
<!-- 処理中カード -->
<section class="card progress-card hidden" id="progressSection">
<div class="progress-header">
<div class="spinner"></div>
<div>
<p class="progress-title">AI 処理中...</p>
<p class="progress-file" id="progressFile"></p>
</div>
</div>
<div class="progress-bar-wrap">
<div class="progress-bar" id="progressBar"></div>
</div>
<p class="progress-pct" id="progressPct">0%</p>
<div class="log-box" id="logBox"></div>
</section>
<!-- 完了カード -->
<section class="card result-card hidden" id="resultSection">
<div class="result-icon"></div>
<h2 class="result-title">処理完了!</h2>
<div class="channel-info">
<div class="channel-item left">
<span class="ch-label">L</span>
<span class="ch-desc">主旋律(メインボーカル)</span>
</div>
<div class="channel-item right">
<span class="ch-label">R</span>
<span class="ch-desc">ハモリ / バッキングボーカル</span>
</div>
</div>
<a class="btn btn-primary download-btn" id="downloadBtn" href="#" download>
<span>⬇️</span> WAV をダウンロード
</a>
<button class="btn btn-outline reset-btn" id="resetBtn">別のファイルを処理する</button>
</section>
<!-- エラーカード -->
<section class="card error-card hidden" id="errorSection">
<div class="result-icon"></div>
<h2 class="result-title">エラーが発生しました</h2>
<p class="error-msg" id="errorMsg"></p>
<button class="btn btn-outline reset-btn" id="resetBtnErr">もう一度試す</button>
</section>
</main>
<footer class="footer">
<p>🎧 HarmoSplit — Powered by <a href="https://github.com/facebookresearch/demucs" target="_blank">Demucs</a> &amp; UVR MDX-NET</p>
</footer>
<script src="/app.js"></script>
</body>
</html>