Files
UmbraAudio/umbraaudio/web/templates/library.html
B.D. Murphy a172610b0e Add voice library, embedding-mode generation, and webUI improvements
- Add cross-project voice/name library (library.py + webUI library tabs)
- chapter_builder: embedding-mode generation + auto-load TTS base model in preflight
- qwen_tts: vmatrix capture, embedding/voice-prompt refinements
- registry: vmatrix_path column + migration for approved voices
- webUI: speakers list, chapter audio detail, proper names updates
- docs: update voice generation and tts_server README
2026-09-02 17:33:15 -07:00

37 lines
1.5 KiB
HTML

{% extends "base.html" %}
{% block content %}
<div class="card">
<h2 style="margin:0">Library</h2>
<p style="color:#94a3b8; margin:0.25rem 0 0">
Reusable voices, proper-name pronunciations, and captured utterances shared across projects.
</p>
</div>
<div style="display:flex; gap:0.5rem; margin-bottom:1rem; flex-wrap:wrap">
<button class="btn" style="border:1px solid #7c3aed; color:#7c3aed" onclick="setLibTab('speakers', this)">Speakers</button>
<button class="btn" style="border:1px solid #7c3aed; color:#7c3aed" onclick="setLibTab('names', this)">Names</button>
<button class="btn" style="border:1px solid #7c3aed; color:#7c3aed" onclick="setLibTab('utterances', this)">Utterances</button>
</div>
<div id="lib-content">
<div id="lib-tab" hx-get="/library/speakers" hx-trigger="load" hx-swap="innerHTML">
<p>Loading...</p>
</div>
</div>
<script>
function setLibTab(tab, btn) {
document.querySelectorAll('#lib-content .lib-tab-swap').forEach(function() {});
var el = document.getElementById('lib-tab');
var urls = {speakers: '/library/speakers', names: '/library/names', utterances: '/library/utterances'};
el.setAttribute('hx-get', urls[tab]);
htmx.process(el);
htmx.ajax('GET', urls[tab], {target: '#lib-tab', swap: 'innerHTML'});
document.querySelectorAll('button').forEach(function(b) { b.style.background = ''; });
if (btn) { btn.style.background = '#7c3aed'; btn.style.color = '#fff'; }
}
</script>
{% endblock %}