Review and edit the speakers found in the manuscript. Each speaker gets one voice.
Loading speakers...
Loading voice analysis...
🎙
Regenerating voice…
⏳
{% endblock %}
// Approving used to be silent: the speaker simply stopped appearing in the
// needs-check panel, which reads exactly like the speaker being deleted. Say
// what happened, keep the counts honest, and drop the entry from the worklist.
function markApproved(name) {
var toast = document.createElement('div');
toast.textContent = '\u2713 ' + name + ' approved \u2014 still in the speaker list, just no longer needing review.';
toast.style.cssText = 'position:fixed; bottom:1.2rem; right:1.2rem; z-index:1100; ' +
'background:#065f46; color:#ecfdf5; padding:0.6rem 0.9rem; border-radius:6px; ' +
'font-size:0.84rem; box-shadow:0 4px 12px rgba(0,0,0,0.4); max-width:22rem';
document.body.appendChild(toast);
setTimeout(function () { toast.remove(); }, 5000);
var entry = document.querySelector('[data-review-item="' + CSS.escape(name) + '"]');
if (entry) entry.remove();
var needs = document.querySelector('[data-vq-needs-count]');
if (needs) {
var n = Math.max(0, (parseInt(needs.textContent, 10) || 0) - 1);
needs.textContent = n + ' need checking';
}
var clear = document.querySelector('[data-vq-clear-count]');
if (clear) clear.textContent = ((parseInt(clear.textContent, 10) || 0) + 1) + ' clear';
var head = document.querySelector('[data-vq-needs-heading]');
if (head) {
var left = (parseInt(head.getAttribute('data-left'), 10));
if (isNaN(left)) left = (parseInt(head.textContent, 10) || 1);
head.setAttribute('data-left', left - 1);
head.textContent = '\u26a0 ' + Math.max(0, left - 1) + ' speaker' +
(left - 1 === 1 ? '' : 's') + ' need' + (left - 1 === 1 ? 's' : '') + ' checking';
}
}