{% extends "base.html" %} {% block title %}Prepare · {{ pending.original_filename }}{% endblock %} {% block content %}
Prepare audiobook

Review the detected chapters, choose which ones to render, and optionally override the voice per chapter before sending the job to the queue.

Source
{{ pending.original_filename }}
Language
{{ options.languages.get(pending.language, pending.language|upper) }}
Default voice
{% if pending.voice_profile %}Profile · {{ pending.voice_profile }}{% else %}{{ pending.voice }}{% endif %}
Total chapters
{{ pending.chapters|length }}
Characters
{{ pending.total_characters|default(0) }}
Chapter intro delay
{{ '%.1f'|format(pending.chapter_intro_delay) }} seconds
Chunk granularity
{{ pending.chunk_level|replace('_', ' ')|title }}
Speaker mode
{{ pending.speaker_mode|replace('_', ' ')|title }}
Speaker analysis threshold
{{ pending.speaker_analysis_threshold }} {{ 'mention' if pending.speaker_analysis_threshold == 1 else 'mentions' }}
EPUB 3 package
{% if pending.generate_epub3 %}Enabled{% else %}Disabled{% endif %}
{% set analysis = pending.speaker_analysis or {} %} {% set analysis_speakers = analysis.get('speakers', {}) %} {% if analysis_speakers %} {% set active = namespace(items=[]) %} {% for sid, payload in analysis_speakers.items() %} {% if sid != 'narrator' and not payload.get('suppressed') %} {% set _ = active.items.append(payload) %} {% endif %} {% endfor %}

Detected speakers

{% if active.items %}
    {% for speaker in active.items|sort(attribute='label') %}
  • {{ speaker.label }} · {{ speaker.count }} lines · confidence {{ speaker.confidence|title }}
  • {% endfor %}
{% else %}

No additional speakers met the threshold yet. All dialogue will use the narrator voice.

{% endif %}
{% elif pending.speaker_mode == 'multi' and not pending.analysis_requested %}

Detected speakers

Press Analyze speakers after selecting chapters to discover recurring voices.

{% endif %} {% set roster = pending.speakers or {} %} {% if roster %} {% set preview_template = options.speaker_pronunciation_sentence or "This is {{name}} speaking." %}

Speaker pronunciation guide

Add a phonetic spelling (IPA or plain text) so pronunciations sound right. Leave blank to use the written label.

    {% for speaker_id, speaker in roster.items() %} {% set spoken_name = speaker.pronunciation or speaker.label %} {% set preview_text = preview_template | replace("{{name}}", spoken_name) %}
  • {{ speaker.label }}
    {% if speaker.get('analysis_count') %}

    {{ speaker.analysis_count }} detected lines · confidence {{ speaker.analysis_confidence|default('low')|title }}

    {% endif %}
  • {% endfor %}
{% endif %} {% if pending.metadata_tags %} {% endif %}
{% if error %}
{{ error }}
{% endif %} {% if notice %}
{{ notice }}
{% endif %}
{% for chapter in pending.chapters %} {% set is_enabled = chapter.enabled is not defined or chapter.enabled %} {% set selected_option = '__default' %} {% if chapter.voice_profile %} {% set selected_option = 'profile:' ~ chapter.voice_profile %} {% elif chapter.voice %} {% set selected_option = 'voice:' ~ chapter.voice %} {% elif chapter.voice_formula %} {% set selected_option = 'formula' %} {% endif %}
{{ chapter.characters }} characters
Preview text
{{ chapter.text[:2000] }}{% if chapter.text|length > 2000 %}…{% endif %}
{% endfor %}

Paragraphs work well for long-form narration; sentences give finer subtitle sync.

Only speakers that appear at least this many times will keep unique voices in multi-speaker mode.

Set to 0 to disable the pause after speaking each chapter title.

{% endblock %} {% block scripts %} {{ super() }} {% endblock %}