- 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
49 lines
1.9 KiB
HTML
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>
|