mirror of
https://github.com/denizsafak/abogen.git
synced 2026-07-18 05:40:26 +02:00
feat: Expand debug TTS samples with additional cases and implement validation test for minimum sample counts
This commit is contained in:
+210
-10
@@ -21,54 +21,254 @@ class DebugTTSSample:
|
|||||||
DEBUG_TTS_SAMPLES: Sequence[DebugTTSSample] = (
|
DEBUG_TTS_SAMPLES: Sequence[DebugTTSSample] = (
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="APOS_001",
|
code="APOS_001",
|
||||||
label="Apostrophes & contractions",
|
label="Apostrophes & contractions (1)",
|
||||||
text="It's a beautiful day, isn't it? Let's see what we'll do.",
|
text="It's a beautiful day, isn't it? Let's see what we'll do.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="APOS_002",
|
||||||
|
label="Apostrophes & contractions (2)",
|
||||||
|
text="I'm sure you're ready; we'd better go before it's too late.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="APOS_003",
|
||||||
|
label="Apostrophes & contractions (3)",
|
||||||
|
text="He'll say it's fine, but I can't promise it'll work.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="APOS_004",
|
||||||
|
label="Apostrophes & contractions (4)",
|
||||||
|
text="They've done it, and I'd agree they've earned it.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="APOS_005",
|
||||||
|
label="Apostrophes & contractions (5)",
|
||||||
|
text="She's here, we're late, they're waiting, and you're right.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="POS_001",
|
code="POS_001",
|
||||||
label="Plural possessives",
|
label="Plural possessives (1)",
|
||||||
text="The dogs' bowls were empty, but the boss's office was quiet.",
|
text="The dogs' bowls were empty, but the boss's office was quiet.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="POS_002",
|
||||||
|
label="Plural possessives (2)",
|
||||||
|
text="The teachers' lounge was closed during the students' exams.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="POS_003",
|
||||||
|
label="Plural possessives (3)",
|
||||||
|
text="The actresses' roles changed, and the directors' notes piled up.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="POS_004",
|
||||||
|
label="Plural possessives (4)",
|
||||||
|
text="The Joneses' car was parked by the neighbors' fence.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="POS_005",
|
||||||
|
label="Plural possessives (5)",
|
||||||
|
text="The bosses' meeting ended before the witnesses' statements began.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="NUM_001",
|
code="NUM_001",
|
||||||
label="Grouped numbers",
|
label="Grouped numbers (1)",
|
||||||
text="There are 1,234 apples, 56 oranges, and 7.89 liters of juice.",
|
text="There are 1,234 apples, 56 oranges, and 7.89 liters of juice.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="NUM_002",
|
||||||
|
label="Grouped numbers (2)",
|
||||||
|
text="The population is 10,000,000 and the area is 123.45 square miles.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="NUM_003",
|
||||||
|
label="Grouped numbers (3)",
|
||||||
|
text="Set the timer for 0.5 seconds, then wait 2.0 minutes.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="NUM_004",
|
||||||
|
label="Grouped numbers (4)",
|
||||||
|
text="We measured 3.1415 radians and wrote down 2,718.28 as well.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="NUM_005",
|
||||||
|
label="Grouped numbers (5)",
|
||||||
|
text="The sequence is 1, 2, 3, 4, 5, and then 13.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="YEAR_001",
|
code="YEAR_001",
|
||||||
label="Years and decades",
|
label="Years and decades (1)",
|
||||||
text="In 1999, people said the '90s were over.",
|
text="In 1999, people said the '90s were over.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="YEAR_002",
|
||||||
|
label="Years and decades (2)",
|
||||||
|
text="In 2001, the show premiered; by 2010 it was everywhere.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="YEAR_003",
|
||||||
|
label="Years and decades (3)",
|
||||||
|
text="The 1980s were loud, and the 1970s were groovy.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="YEAR_004",
|
||||||
|
label="Years and decades (4)",
|
||||||
|
text="She loved the '80s, but he preferred the '60s.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="YEAR_005",
|
||||||
|
label="Years and decades (5)",
|
||||||
|
text="In 2024, we looked back at 2020 and planned for 2030.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="DATE_001",
|
code="DATE_001",
|
||||||
label="ISO dates",
|
label="Dates (1)",
|
||||||
text="On 2023-01-01, we celebrated the new year.",
|
text="On 2023-01-01, we celebrated the new year.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="DATE_002",
|
||||||
|
label="Dates (2)",
|
||||||
|
text="The deadline is 1999-12-31 at midnight.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="DATE_003",
|
||||||
|
label="Dates (3)",
|
||||||
|
text="Leap day happens on 2024-02-29.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="DATE_004",
|
||||||
|
label="Dates (4)",
|
||||||
|
text="Some formats look like 01/02/2003 and can be ambiguous.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="DATE_005",
|
||||||
|
label="Dates (5)",
|
||||||
|
text="We met on March 5, 2020 and again on Apr. 7, 2021.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="CUR_001",
|
code="CUR_001",
|
||||||
label="Currency symbols",
|
label="Currency symbols (1)",
|
||||||
text="The price is $10.50, but it was £8.00 yesterday.",
|
text="The price is $10.50, but it was £8.00 yesterday.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="CUR_002",
|
||||||
|
label="Currency symbols (2)",
|
||||||
|
text="Tickets cost €12, and the fine was $0.99.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="CUR_003",
|
||||||
|
label="Currency symbols (3)",
|
||||||
|
text="The bill was ¥500 and the refund was $-3.25.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="CUR_004",
|
||||||
|
label="Currency symbols (4)",
|
||||||
|
text="He paid £1,234.56 for the instrument.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="CUR_005",
|
||||||
|
label="Currency symbols (5)",
|
||||||
|
text="The subscription is $5 per month, or $50 per year.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="TITLE_001",
|
code="TITLE_001",
|
||||||
label="Titles and abbreviations",
|
label="Titles and abbreviations (1)",
|
||||||
text="Dr. Smith lives on Elm St. near the U.S. border.",
|
text="Dr. Smith lives on Elm St. near the U.S. border.",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="TITLE_002",
|
||||||
|
label="Titles and abbreviations (2)",
|
||||||
|
text="Mr. and Mrs. Doe met Prof. Adams at 5 p.m.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="TITLE_003",
|
||||||
|
label="Titles and abbreviations (3)",
|
||||||
|
text="Gen. Lee spoke to Sgt. Rivera on Main St.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="TITLE_004",
|
||||||
|
label="Titles and abbreviations (4)",
|
||||||
|
text="The report came from the U.K. office, not the U.S.A. team.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="TITLE_005",
|
||||||
|
label="Titles and abbreviations (5)",
|
||||||
|
text="St. John's is different from St. Louis.",
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="PUNC_001",
|
code="PUNC_001",
|
||||||
label="Terminal punctuation",
|
label="Terminal punctuation (1)",
|
||||||
text="This sentence ends without punctuation",
|
text="This sentence ends without punctuation",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="PUNC_002",
|
||||||
|
label="Terminal punctuation (2)",
|
||||||
|
text="An ellipsis is already present...",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="PUNC_003",
|
||||||
|
label="Terminal punctuation (3)",
|
||||||
|
text="A question without a mark",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="PUNC_004",
|
||||||
|
label="Terminal punctuation (4)",
|
||||||
|
text="An exclamation without a bang",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="PUNC_005",
|
||||||
|
label="Terminal punctuation (5)",
|
||||||
|
text='A quote ends here"',
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="QUOTE_001",
|
code="QUOTE_001",
|
||||||
label="ALL CAPS inside quotes",
|
label="ALL CAPS inside quotes (1)",
|
||||||
text='He shouted, "THIS IS IMPORTANT!" and then whispered, "ok."',
|
text='He shouted, "THIS IS IMPORTANT!" and then whispered, "ok."',
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="QUOTE_002",
|
||||||
|
label="ALL CAPS inside quotes (2)",
|
||||||
|
text='She said, "NO WAY", but he replied, "maybe".',
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="QUOTE_003",
|
||||||
|
label="ALL CAPS inside quotes (3)",
|
||||||
|
text='The sign read "DO NOT ENTER" and the note read "pls knock".',
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="QUOTE_004",
|
||||||
|
label="ALL CAPS inside quotes (4)",
|
||||||
|
text='He muttered, "OK", then yelled, "STOP!"',
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="QUOTE_005",
|
||||||
|
label="ALL CAPS inside quotes (5)",
|
||||||
|
text='They chanted, "USA!" and someone wrote "idk".',
|
||||||
|
),
|
||||||
DebugTTSSample(
|
DebugTTSSample(
|
||||||
code="FOOT_001",
|
code="FOOT_001",
|
||||||
label="Footnote indicators",
|
label="Footnote indicators (1)",
|
||||||
text="This is a sentence with a footnote[1] and another[12].",
|
text="This is a sentence with a footnote[1] and another[12].",
|
||||||
),
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="FOOT_002",
|
||||||
|
label="Footnote indicators (2)",
|
||||||
|
text="Some books use multiple footnotes like this[2][3] in a row.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="FOOT_003",
|
||||||
|
label="Footnote indicators (3)",
|
||||||
|
text="A footnote can appear mid-sentence[4] and continue afterward.",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="FOOT_004",
|
||||||
|
label="Footnote indicators (4)",
|
||||||
|
text="Edge cases include [0] or very large indices like [1234].",
|
||||||
|
),
|
||||||
|
DebugTTSSample(
|
||||||
|
code="FOOT_005",
|
||||||
|
label="Footnote indicators (5)",
|
||||||
|
text="Sometimes a footnote follows punctuation.[5] Sometimes it doesn't[6]",
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,14 @@
|
|||||||
<div class="alert alert--success">Settings saved successfully.</div>
|
<div class="alert alert--success">Settings saved successfully.</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% with messages = get_flashed_messages(with_categories=True) %}
|
||||||
|
{% if messages %}
|
||||||
|
{% for category, message in messages %}
|
||||||
|
<div class="alert {% if category == 'error' %}alert--error{% else %}alert--success{% endif %}">{{ message }}</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
|
||||||
<div class="settings-layout">
|
<div class="settings-layout">
|
||||||
<nav class="settings-nav" aria-label="Settings sections">
|
<nav class="settings-nav" aria-label="Settings sections">
|
||||||
<button type="button" class="settings-nav__item is-active" data-section="narration">Narration</button>
|
<button type="button" class="settings-nav__item is-active" data-section="narration">Narration</button>
|
||||||
@@ -480,8 +488,8 @@
|
|||||||
<p class="hint">Generate a set of WAV files from a purpose-built EPUB containing code-tagged examples. When something sounds wrong, report the code (e.g. <code>NUM_001</code>) to pinpoint the failing transformation.</p>
|
<p class="hint">Generate a set of WAV files from a purpose-built EPUB containing code-tagged examples. When something sounds wrong, report the code (e.g. <code>NUM_001</code>) to pinpoint the failing transformation.</p>
|
||||||
|
|
||||||
<div class="field field--stack">
|
<div class="field field--stack">
|
||||||
<button type="submit" class="button" formaction="{{ url_for('settings.run_debug_wavs') }}" formmethod="post">Generate debug WAVs</button>
|
<button type="submit" class="button" form="debug-tts-form">Generate debug WAVs</button>
|
||||||
<p class="hint">Uses your current Settings defaults (voice, language, speed, GPU).</p>
|
<p class="hint">Uses your current Settings defaults (voice, language, speed, GPU). If generation fails, an error will appear at the top of this page.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% if debug_manifest and debug_manifest.artifacts %}
|
{% if debug_manifest and debug_manifest.artifacts %}
|
||||||
@@ -582,6 +590,8 @@
|
|||||||
<button type="submit" class="button">Save Settings</button>
|
<button type="submit" class="button">Save Settings</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
<form id="debug-tts-form" action="{{ url_for('settings.run_debug_wavs') }}" method="post"></form>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
BIN
Binary file not shown.
@@ -95,3 +95,27 @@ def test_settings_debug_route_writes_manifest(tmp_path, monkeypatch):
|
|||||||
filenames = {item["filename"] for item in manifest.get("artifacts", [])}
|
filenames = {item["filename"] for item in manifest.get("artifacts", [])}
|
||||||
assert "overall.wav" in filenames
|
assert "overall.wav" in filenames
|
||||||
assert any(name.startswith("case_") and name.endswith(".wav") for name in filenames)
|
assert any(name.startswith("case_") and name.endswith(".wav") for name in filenames)
|
||||||
|
|
||||||
|
|
||||||
|
def test_debug_samples_have_minimum_per_category():
|
||||||
|
prefixes = {
|
||||||
|
"APOS": 5,
|
||||||
|
"POS": 5,
|
||||||
|
"NUM": 5,
|
||||||
|
"YEAR": 5,
|
||||||
|
"DATE": 5,
|
||||||
|
"CUR": 5,
|
||||||
|
"TITLE": 5,
|
||||||
|
"PUNC": 5,
|
||||||
|
"QUOTE": 5,
|
||||||
|
"FOOT": 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
counts = {prefix: 0 for prefix in prefixes}
|
||||||
|
for sample in DEBUG_TTS_SAMPLES:
|
||||||
|
prefix = sample.code.split("_", 1)[0]
|
||||||
|
if prefix in counts:
|
||||||
|
counts[prefix] += 1
|
||||||
|
|
||||||
|
for prefix, minimum in prefixes.items():
|
||||||
|
assert counts[prefix] >= minimum
|
||||||
|
|||||||
Reference in New Issue
Block a user