Files
UmbraAudio/umbraaudio/web/templates/_library_names.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

49 lines
1.9 KiB
HTML

<div class="card">
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:1rem">
<h3 style="margin:0">Library Names ({{ names|length }})</h3>
<span style="color:#64748b; font-size:0.85rem">Confirmed proper-name pronunciations added from the project Names page.</span>
</div>
{% if not names %}
<p style="color:#64748b">No names in the library yet.</p>
{% else %}
<table>
<thead>
<tr>
<th>Name</th>
<th>Phonetic</th>
<th>Status</th>
<th>Source</th>
<th></th>
</tr>
</thead>
<tbody>
{% for n in names %}
<tr id="lib-name-{{ n.id }}">
<td><strong>{{ n.name }}</strong></td>
<td><code style="color:#f59e0b">{{ n.phonetic or '—' }}</code></td>
<td>
{% if n.confirmed %}<span class="badge badge-green">Confirmed</span>
{% elif n.common %}<span class="badge badge-blue">Common</span>
{% else %}<span class="badge badge-yellow">Pending</span>{% endif %}
</td>
<td style="font-size:0.8rem; color:#94a3b8">{{ n.source_project or 'manual' }}</td>
<td>
<button class="btn btn-reject" style="font-size:0.7rem; padding:0.2rem 0.5rem"
onclick="removeLibName({{ n.id }}, '{{ n.name|e }}')">✕</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
</div>
<script>
function removeLibName(id, name) {
if (!confirm('Remove "' + name + '" from the library?')) return;
fetch('/api/library/names/' + id, {method: 'DELETE'})
.then(r => r.json()).then(d => {
htmx.ajax('GET', '/library/names', {target: '#lib-tab', swap: 'innerHTML'});
});
}
</script>