Rename to Ava; default character, editable system prompt
Browse files- README.md +6 -3
- chunk-qht2aa6q.js +0 -0
- chunk-dnx9jhwj.js → chunk-s08sdfdm.js +0 -0
- chunk-v7x5vjjc.js +0 -0
- chunk-sarxdv2b.css → chunk-w8avpjmm.css +1 -1
- chunk-zg54109f.js +0 -0
- chunk-zp8vy5c2.js +0 -0
- index.html +12 -11
README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
emoji: 🗣️
|
| 4 |
colorFrom: indigo
|
| 5 |
colorTo: purple
|
|
@@ -12,9 +12,9 @@ models:
|
|
| 12 |
- LiquidAI/LFM3-Omni-2B-GGUF
|
| 13 |
---
|
| 14 |
|
| 15 |
-
#
|
| 16 |
|
| 17 |
-
Hands-free voice chat with a 3D lip-synced avatar, running entirely in the
|
| 18 |
browser: the UX of [victor/gemma-avatar](https://huggingface.co/spaces/victor/gemma-avatar)
|
| 19 |
on the model and WebGPU runtime of
|
| 20 |
[LiquidAI/LFM3-Omni-2B-WebGPU](https://huggingface.co/spaces/LiquidAI/LFM3-Omni-2B-WebGPU).
|
|
@@ -31,6 +31,9 @@ you speak → Silero VAD (WASM) → LFM3-Omni-2B (WebGPU): audio in, interleaved
|
|
| 31 |
- **Barge-in**: talk over her and generation and playback stop immediately.
|
| 32 |
- **Body language** (moods, thumbs up, shrug, a wave) is read from her words as they
|
| 33 |
are heard, in `src/reactions.js`.
|
|
|
|
|
|
|
|
|
|
| 34 |
- **Lip-sync** is derived from the audio by HeadAudio, as in gemma-avatar.
|
| 35 |
|
| 36 |
Differences from gemma-avatar, all forced by the model: there is no voice picker
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Ava
|
| 3 |
emoji: 🗣️
|
| 4 |
colorFrom: indigo
|
| 5 |
colorTo: purple
|
|
|
|
| 12 |
- LiquidAI/LFM3-Omni-2B-GGUF
|
| 13 |
---
|
| 14 |
|
| 15 |
+
# Ava
|
| 16 |
|
| 17 |
+
Hands-free voice chat with Ava, a 3D lip-synced avatar, running entirely in the
|
| 18 |
browser: the UX of [victor/gemma-avatar](https://huggingface.co/spaces/victor/gemma-avatar)
|
| 19 |
on the model and WebGPU runtime of
|
| 20 |
[LiquidAI/LFM3-Omni-2B-WebGPU](https://huggingface.co/spaces/LiquidAI/LFM3-Omni-2B-WebGPU).
|
|
|
|
| 31 |
- **Barge-in**: talk over her and generation and playback stop immediately.
|
| 32 |
- **Body language** (moods, thumbs up, shrug, a wave) is read from her words as they
|
| 33 |
are heard, in `src/reactions.js`.
|
| 34 |
+
- **Character** is a short system prompt you can edit directly in Settings
|
| 35 |
+
(`src/system-prompt.js` has the default). The only thing added to it is the model's
|
| 36 |
+
required "Respond with interleaved text and audio." line.
|
| 37 |
- **Lip-sync** is derived from the audio by HeadAudio, as in gemma-avatar.
|
| 38 |
|
| 39 |
Differences from gemma-avatar, all forced by the model: there is no voice picker
|
chunk-qht2aa6q.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
chunk-dnx9jhwj.js → chunk-s08sdfdm.js
RENAMED
|
The diff for this file is too large to render.
See raw diff
|
|
|
chunk-v7x5vjjc.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
chunk-sarxdv2b.css → chunk-w8avpjmm.css
RENAMED
|
@@ -1 +1 @@
|
|
| 1 |
-
:root{--bg:#0a0b10;--bg-elev:#13151c;--bg-elev-2:#1b1e29;--border:#ffffff14;--border-strong:#ffffff29;--text:#f5f6fa;--text-dim:#f5f6faa6;--text-faint:#f5f6fa6b;--error:#ff6a75;--live:#22d3ee;--font-mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--radius-sm:8px;--radius-md:14px}*{box-sizing:border-box}html,body{height:100%;margin:0}body{background:var(--bg);color:var(--text);overflow:hidden;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}#app{position:relative;height:100dvh}#stage{position:absolute;inset:0}#stage canvas{display:block}[hidden]{display:none!important}#loading{position:absolute;display:grid;font-family:var(--font-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--text-faint);background:var(--bg);pointer-events:none;place-items: center;transition:opacity .6s;font-size:12px;font-weight:500;inset:0}#loading.done{opacity:0}#topbar{position:absolute;display:flex;pointer-events:none;justify-content:space-between;align-items: flex-start;padding:18px 20px;top:0;left:0;right:0}#topbar>*{pointer-events:auto}#identity h1{letter-spacing:.01em;margin:0;font-size:15px;font-weight:600}#identity p{color:var(--text-faint);max-width:340px;margin:4px 0 0;font-size:12px;line-height:1.45}#identity strong{color:var(--text-dim);font-weight:500}.icon-btn{display:grid;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elev);color:var(--text-dim);cursor:pointer;touch-action:manipulation;place-items: center;width:36px;height:36px;padding:0;transition:color .15s,border-color .15s}.icon-btn:hover{color:var(--text);border-color:var(--border-strong)}.icon-btn.active{color:var(--error);border-color:var(--border-strong)}#main-btn{background:var(--text);color:var(--bg);cursor:pointer;touch-action:manipulation;border:none;border-radius:23px;min-width:190px;height:46px;padding:0 26px;transition:transform .12s,opacity .15s;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:600}#main-btn:hover:not(:disabled){transform:translateY(-1px)}#main-btn:disabled{opacity:.45;cursor:default}#main-btn.live{background:var(--bg-elev);color:var(--text);border:1px solid var(--border-strong)}#controls{position:absolute;display:flex;padding:0 20px calc(22px + env(safe-area-inset-bottom));flex-direction:column;align-items: center;gap:14px;bottom:0;left:0;right:0}#buttons{display:flex;align-items: center;gap:10px}#caption{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--text-faint);transition:color .2s;font-size:11px;font-weight:500}#caption.live{color:var(--live)}#caption.error{color:var(--error);text-align:center;max-width:560px;line-height:1.5}#progress{background:var(--border-strong);overflow:hidden;border-radius:1px;width:min(240px,60vw);height:2px}#progress-fill{background:var(--text-dim);width:0;height:100%;transition:width .3s}#subtitles{position:absolute;border-radius:var(--radius-md);backdrop-filter:blur(6px);border:1px solid var(--border);text-align:center;text-wrap:balance;color:var(--text);opacity:0;pointer-events:none;display:-webkit-box;-webkit-line-clamp:3;overflow:hidden;background:#0a0b10b8;-webkit-box-orient:vertical;max-width:min(640px,100vw - 48px);padding:10px 16px;transition:opacity .25s;font-size:15px;line-height:1.5;bottom:118px;left:50%;transform:translate(-50%)}#subtitles.visible{opacity:1}#settings{border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-elev);color:var(--text);width:min(440px,100vw - 40px);padding:22px;box-shadow:0 4px 18px #00000052}#settings::backdrop{backdrop-filter:blur(2px);background:#05060999}#settings h2{margin:0 0 16px;font-size:15px;font-weight:600}#settings label{display:block;color:var(--text-dim);margin-bottom:14px;font-size:12px}#settings select,#settings textarea,#settings input{display:block;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elev-2);color:var(--text);width:100%;margin-top:6px;padding:9px 11px;font-family:inherit;font-size:13px}#settings select:focus-visible{outline:1px solid var(--text-dim);outline-offset:1px}#settings textarea:focus-visible{outline:1px solid var(--text-dim);outline-offset:1px}#settings input:focus-visible{outline:1px solid var(--text-dim);outline-offset:1px}#settings textarea{resize:vertical}#settings .check-row{display:flex;align-items: center;gap:9px}#settings .check-row input{display:inline-block;accent-color:var(--text);width:auto;margin:0}.dialog-actions{display:flex;justify-content:
|
|
|
|
| 1 |
+
:root{--bg:#0a0b10;--bg-elev:#13151c;--bg-elev-2:#1b1e29;--border:#ffffff14;--border-strong:#ffffff29;--text:#f5f6fa;--text-dim:#f5f6faa6;--text-faint:#f5f6fa6b;--error:#ff6a75;--live:#22d3ee;--font-mono:"Geist Mono",ui-monospace,SFMono-Regular,Menlo,monospace;--radius-sm:8px;--radius-md:14px}*{box-sizing:border-box}html,body{height:100%;margin:0}body{background:var(--bg);color:var(--text);overflow:hidden;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif}#app{position:relative;height:100dvh}#stage{position:absolute;inset:0}#stage canvas{display:block}[hidden]{display:none!important}#loading{position:absolute;display:grid;font-family:var(--font-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--text-faint);background:var(--bg);pointer-events:none;place-items: center;transition:opacity .6s;font-size:12px;font-weight:500;inset:0}#loading.done{opacity:0}#topbar{position:absolute;display:flex;pointer-events:none;justify-content:space-between;align-items: flex-start;padding:18px 20px;top:0;left:0;right:0}#topbar>*{pointer-events:auto}#identity h1{letter-spacing:.01em;margin:0;font-size:15px;font-weight:600}#identity p{color:var(--text-faint);max-width:340px;margin:4px 0 0;font-size:12px;line-height:1.45}#identity strong{color:var(--text-dim);font-weight:500}.icon-btn{display:grid;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elev);color:var(--text-dim);cursor:pointer;touch-action:manipulation;place-items: center;width:36px;height:36px;padding:0;transition:color .15s,border-color .15s}.icon-btn:hover{color:var(--text);border-color:var(--border-strong)}.icon-btn.active{color:var(--error);border-color:var(--border-strong)}#main-btn{background:var(--text);color:var(--bg);cursor:pointer;touch-action:manipulation;border:none;border-radius:23px;min-width:190px;height:46px;padding:0 26px;transition:transform .12s,opacity .15s;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:600}#main-btn:hover:not(:disabled){transform:translateY(-1px)}#main-btn:disabled{opacity:.45;cursor:default}#main-btn.live{background:var(--bg-elev);color:var(--text);border:1px solid var(--border-strong)}#controls{position:absolute;display:flex;padding:0 20px calc(22px + env(safe-area-inset-bottom));flex-direction:column;align-items: center;gap:14px;bottom:0;left:0;right:0}#buttons{display:flex;align-items: center;gap:10px}#caption{font-family:var(--font-mono);letter-spacing:.14em;text-transform:uppercase;color:var(--text-faint);transition:color .2s;font-size:11px;font-weight:500}#caption.live{color:var(--live)}#caption.error{color:var(--error);text-align:center;max-width:560px;line-height:1.5}#progress{background:var(--border-strong);overflow:hidden;border-radius:1px;width:min(240px,60vw);height:2px}#progress-fill{background:var(--text-dim);width:0;height:100%;transition:width .3s}#subtitles{position:absolute;border-radius:var(--radius-md);backdrop-filter:blur(6px);border:1px solid var(--border);text-align:center;text-wrap:balance;color:var(--text);opacity:0;pointer-events:none;display:-webkit-box;-webkit-line-clamp:3;overflow:hidden;background:#0a0b10b8;-webkit-box-orient:vertical;max-width:min(640px,100vw - 48px);padding:10px 16px;transition:opacity .25s;font-size:15px;line-height:1.5;bottom:118px;left:50%;transform:translate(-50%)}#subtitles.visible{opacity:1}#settings{border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-elev);color:var(--text);width:min(440px,100vw - 40px);padding:22px;box-shadow:0 4px 18px #00000052}#settings::backdrop{backdrop-filter:blur(2px);background:#05060999}#settings h2{margin:0 0 16px;font-size:15px;font-weight:600}#settings label{display:block;color:var(--text-dim);margin-bottom:14px;font-size:12px}#settings select,#settings textarea,#settings input{display:block;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-elev-2);color:var(--text);width:100%;margin-top:6px;padding:9px 11px;font-family:inherit;font-size:13px}#settings select:focus-visible{outline:1px solid var(--text-dim);outline-offset:1px}#settings textarea:focus-visible{outline:1px solid var(--text-dim);outline-offset:1px}#settings input:focus-visible{outline:1px solid var(--text-dim);outline-offset:1px}#settings textarea{resize:vertical}#settings .hint{display:block;margin-top:6px;font-size:11px;line-height:1.4}#settings .check-row{display:flex;align-items: center;gap:9px}#settings .check-row input{display:inline-block;accent-color:var(--text);width:auto;margin:0}.dialog-actions{display:flex;justify-content:space-between;gap:12px;margin-top:6px}#reset-prompt{color:var(--text-dim);cursor:pointer;background:0 0;border:none;padding:9px 0;font-size:13px}#reset-prompt:hover{color:var(--text)}.dialog-actions .primary{border-radius:var(--radius-sm);background:var(--text);color:var(--bg);cursor:pointer;border:none;padding:9px 20px;font-size:13px;font-weight:600}button:focus-visible{outline:2px solid var(--text-dim);outline-offset:2px}@media (prefers-reduced-motion:reduce){*{transition-duration:.01ms!important}}@media (max-width:600px){#identity p{display:none}#subtitles{font-size:14px;bottom:128px}}
|
chunk-zg54109f.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
chunk-zp8vy5c2.js
DELETED
|
The diff for this file is too large to render.
See raw diff
|
|
|
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, viewport-fit=cover" />
|
| 6 |
-
<title>
|
| 7 |
<link rel="icon" href="data:," />
|
| 8 |
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
| 9 |
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
@@ -12,7 +12,7 @@
|
|
| 12 |
rel="stylesheet"
|
| 13 |
/>
|
| 14 |
|
| 15 |
-
<link rel="stylesheet" crossorigin href="./chunk-
|
| 16 |
<body>
|
| 17 |
<main id="app">
|
| 18 |
<!-- The avatar is the hero: a full-viewport 3D stage. -->
|
|
@@ -21,10 +21,10 @@
|
|
| 21 |
|
| 22 |
<header id="topbar">
|
| 23 |
<div id="identity">
|
| 24 |
-
<h1>
|
| 25 |
<p>
|
| 26 |
-
Talk to <strong>
|
| 27 |
-
WebGPU
|
| 28 |
</p>
|
| 29 |
</div>
|
| 30 |
<button id="settings-btn" class="icon-btn" aria-label="Settings" title="Settings">
|
|
@@ -64,14 +64,15 @@
|
|
| 64 |
Show subtitles while she speaks
|
| 65 |
</label>
|
| 66 |
<label>
|
| 67 |
-
|
| 68 |
-
<textarea
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
</label>
|
| 74 |
<div class="dialog-actions">
|
|
|
|
| 75 |
<button value="close" class="primary">Done</button>
|
| 76 |
</div>
|
| 77 |
</form>
|
|
|
|
| 3 |
<head>
|
| 4 |
<meta charset="utf-8" />
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
| 6 |
+
<title>Ava</title>
|
| 7 |
<link rel="icon" href="data:," />
|
| 8 |
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
| 9 |
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
|
|
|
| 12 |
rel="stylesheet"
|
| 13 |
/>
|
| 14 |
|
| 15 |
+
<link rel="stylesheet" crossorigin href="./chunk-w8avpjmm.css"><script type="module" crossorigin src="./chunk-s08sdfdm.js"></script></head>
|
| 16 |
<body>
|
| 17 |
<main id="app">
|
| 18 |
<!-- The avatar is the hero: a full-viewport 3D stage. -->
|
|
|
|
| 21 |
|
| 22 |
<header id="topbar">
|
| 23 |
<div id="identity">
|
| 24 |
+
<h1>Ava</h1>
|
| 25 |
<p>
|
| 26 |
+
Talk to <strong>Ava</strong> face to face, entirely in your browser.
|
| 27 |
+
LFM3-Omni on WebGPU · Silero VAD · TalkingHead 3D
|
| 28 |
</p>
|
| 29 |
</div>
|
| 30 |
<button id="settings-btn" class="icon-btn" aria-label="Settings" title="Settings">
|
|
|
|
| 64 |
Show subtitles while she speaks
|
| 65 |
</label>
|
| 66 |
<label>
|
| 67 |
+
System prompt
|
| 68 |
+
<textarea id="system-prompt" rows="10" spellcheck="false"></textarea>
|
| 69 |
+
<span class="hint">
|
| 70 |
+
Who she is and how she talks. Applies from her next reply. “Respond with
|
| 71 |
+
interleaved text and audio.” is always added after it, so she can speak.
|
| 72 |
+
</span>
|
| 73 |
</label>
|
| 74 |
<div class="dialog-actions">
|
| 75 |
+
<button type="button" id="reset-prompt">Restore default</button>
|
| 76 |
<button value="close" class="primary">Done</button>
|
| 77 |
</div>
|
| 78 |
</form>
|