Spaces:
Running
Running
Commit ·
1c430d1
1
Parent(s): d714b6c
Rename to ZeroLabs
Browse files- README.md +4 -4
- index.html +10 -10
README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
hf_oauth: true
|
|
|
|
| 1 |
---
|
| 2 |
+
title: ZeroLabs
|
| 3 |
+
emoji: 🔊
|
| 4 |
+
colorFrom: yellow
|
| 5 |
+
colorTo: yellow
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
hf_oauth: true
|
index.html
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
-
<title>
|
| 7 |
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 8 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 9 |
<style>
|
|
@@ -619,7 +619,7 @@ pre {
|
|
| 619 |
|
| 620 |
<div id="landing">
|
| 621 |
<div class="logo-icon" style="width:56px;height:56px;font-size:28px;border-radius:14px">🎙</div>
|
| 622 |
-
<h1>
|
| 623 |
<p class="subtitle">Voice cloning powered by open-source models. Sign in with your Hugging Face account to start generating.</p>
|
| 624 |
<button class="btn-hf" onclick="login()">🤗 Sign in with Hugging Face</button>
|
| 625 |
<p class="landing-note">Uses your HF ZeroGPU quota · Free tier included</p>
|
|
@@ -630,7 +630,7 @@ pre {
|
|
| 630 |
<div class="header">
|
| 631 |
<div class="logo">
|
| 632 |
<div class="logo-icon">🎙</div>
|
| 633 |
-
|
| 634 |
</div>
|
| 635 |
<div class="header-right">
|
| 636 |
<div class="user-pill" id="user-pill">
|
|
@@ -941,14 +941,14 @@ let isPro = false;
|
|
| 941 |
let selectedVoice = null;
|
| 942 |
let resultAudioUrl = null;
|
| 943 |
let modalFileData = null;
|
| 944 |
-
let history = JSON.parse(localStorage.getItem("
|
| 945 |
-
let sessionUsage = parseFloat(sessionStorage.getItem("
|
| 946 |
|
| 947 |
// ── IndexedDB ──
|
| 948 |
|
| 949 |
function openDB() {
|
| 950 |
return new Promise((resolve, reject) => {
|
| 951 |
-
const req = indexedDB.open("
|
| 952 |
req.onupgradeneeded = () => req.result.createObjectStore("voices", { keyPath: "id" });
|
| 953 |
req.onsuccess = () => resolve(req.result);
|
| 954 |
req.onerror = () => reject(req.error);
|
|
@@ -1104,7 +1104,7 @@ document.addEventListener("click", () => {
|
|
| 1104 |
function updateUsageTracker(addSeconds) {
|
| 1105 |
if (addSeconds) {
|
| 1106 |
sessionUsage += addSeconds;
|
| 1107 |
-
sessionStorage.setItem("
|
| 1108 |
}
|
| 1109 |
const quota = isPro ? QUOTA_PRO : QUOTA_FREE;
|
| 1110 |
const pct = Math.min((sessionUsage / quota) * 100, 100);
|
|
@@ -1420,7 +1420,7 @@ window.downloadAudio = async function() {
|
|
| 1420 |
const blob = await fetch(resultAudioUrl).then(r => r.blob());
|
| 1421 |
const a = document.createElement("a");
|
| 1422 |
a.href = URL.createObjectURL(blob);
|
| 1423 |
-
a.download = "
|
| 1424 |
a.click();
|
| 1425 |
URL.revokeObjectURL(a.href);
|
| 1426 |
};
|
|
@@ -1430,7 +1430,7 @@ window.downloadAudio = async function() {
|
|
| 1430 |
function addToHistory(text, voiceName, duration, url) {
|
| 1431 |
history.unshift({ text, voiceName, duration, url, timestamp: Date.now() });
|
| 1432 |
if (history.length > 50) history.pop();
|
| 1433 |
-
localStorage.setItem("
|
| 1434 |
renderHistory();
|
| 1435 |
}
|
| 1436 |
|
|
@@ -1450,7 +1450,7 @@ function renderHistory() {
|
|
| 1450 |
window.playHistory = function(i) { const h = history[i]; if (h.url) { audioEl.src = h.url; audioEl.play(); } };
|
| 1451 |
window.downloadHistoryItem = async function(i) {
|
| 1452 |
const h = history[i]; if (!h.url) return;
|
| 1453 |
-
try { const b = await fetch(h.url).then(r=>r.blob()); const a=document.createElement("a"); a.href=URL.createObjectURL(b); a.download=`
|
| 1454 |
};
|
| 1455 |
|
| 1456 |
// ── Init ──
|
|
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>ZeroLabs</title>
|
| 7 |
<link rel="preconnect" href="https://fonts.googleapis.com">
|
| 8 |
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
| 9 |
<style>
|
|
|
|
| 619 |
|
| 620 |
<div id="landing">
|
| 621 |
<div class="logo-icon" style="width:56px;height:56px;font-size:28px;border-radius:14px">🎙</div>
|
| 622 |
+
<h1>ZeroLabs</h1>
|
| 623 |
<p class="subtitle">Voice cloning powered by open-source models. Sign in with your Hugging Face account to start generating.</p>
|
| 624 |
<button class="btn-hf" onclick="login()">🤗 Sign in with Hugging Face</button>
|
| 625 |
<p class="landing-note">Uses your HF ZeroGPU quota · Free tier included</p>
|
|
|
|
| 630 |
<div class="header">
|
| 631 |
<div class="logo">
|
| 632 |
<div class="logo-icon">🎙</div>
|
| 633 |
+
ZeroLabs
|
| 634 |
</div>
|
| 635 |
<div class="header-right">
|
| 636 |
<div class="user-pill" id="user-pill">
|
|
|
|
| 941 |
let selectedVoice = null;
|
| 942 |
let resultAudioUrl = null;
|
| 943 |
let modalFileData = null;
|
| 944 |
+
let history = JSON.parse(localStorage.getItem("zl_history") || "[]");
|
| 945 |
+
let sessionUsage = parseFloat(sessionStorage.getItem("zl_usage") || "0");
|
| 946 |
|
| 947 |
// ── IndexedDB ──
|
| 948 |
|
| 949 |
function openDB() {
|
| 950 |
return new Promise((resolve, reject) => {
|
| 951 |
+
const req = indexedDB.open("ZeroLabs", 1);
|
| 952 |
req.onupgradeneeded = () => req.result.createObjectStore("voices", { keyPath: "id" });
|
| 953 |
req.onsuccess = () => resolve(req.result);
|
| 954 |
req.onerror = () => reject(req.error);
|
|
|
|
| 1104 |
function updateUsageTracker(addSeconds) {
|
| 1105 |
if (addSeconds) {
|
| 1106 |
sessionUsage += addSeconds;
|
| 1107 |
+
sessionStorage.setItem("zl_usage", sessionUsage.toString());
|
| 1108 |
}
|
| 1109 |
const quota = isPro ? QUOTA_PRO : QUOTA_FREE;
|
| 1110 |
const pct = Math.min((sessionUsage / quota) * 100, 100);
|
|
|
|
| 1420 |
const blob = await fetch(resultAudioUrl).then(r => r.blob());
|
| 1421 |
const a = document.createElement("a");
|
| 1422 |
a.href = URL.createObjectURL(blob);
|
| 1423 |
+
a.download = "zerolabs_output.wav";
|
| 1424 |
a.click();
|
| 1425 |
URL.revokeObjectURL(a.href);
|
| 1426 |
};
|
|
|
|
| 1430 |
function addToHistory(text, voiceName, duration, url) {
|
| 1431 |
history.unshift({ text, voiceName, duration, url, timestamp: Date.now() });
|
| 1432 |
if (history.length > 50) history.pop();
|
| 1433 |
+
localStorage.setItem("zl_history", JSON.stringify(history));
|
| 1434 |
renderHistory();
|
| 1435 |
}
|
| 1436 |
|
|
|
|
| 1450 |
window.playHistory = function(i) { const h = history[i]; if (h.url) { audioEl.src = h.url; audioEl.play(); } };
|
| 1451 |
window.downloadHistoryItem = async function(i) {
|
| 1452 |
const h = history[i]; if (!h.url) return;
|
| 1453 |
+
try { const b = await fetch(h.url).then(r=>r.blob()); const a=document.createElement("a"); a.href=URL.createObjectURL(b); a.download=`zerolabs_${i}.wav`; a.click(); URL.revokeObjectURL(a.href); } catch {}
|
| 1454 |
};
|
| 1455 |
|
| 1456 |
// ── Init ──
|