TTS Studio: Zahlen, Daten und Telefonnummern ausschreiben

Neues Modul normalize.rs wandelt vor dem Sprechen Datum (1.10. -> ersten
Oktober, mit Jänner), Uhrzeiten und Bereiche, Telefonnummern (ziffernweise,
Gruppen mit Punkt getrennt), Euro-Beträge, Ordnungszahlen und gängige
Abkürzungen in Worte. In der GUI abschaltbar, mit Vorschau des gesprochenen
Textes. Hörproben der Telefonnummer-Varianten unter qwen3_samples/telefon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
renatoandClaude Opus 5.5 committed 2026-10-23 22:50:24 +02:00
1 parent d12897a928
commit b3b38f1fe1
9 files changed
+464 -4

No files matched your search

+14 -1
View File
@@ -5,6 +5,7 @@ mod audio;
mod config;
mod http;
mod media;
mod normalize;
mod synth;
mod voices;
@@ -67,6 +68,7 @@ struct App {
speed: f32,
sentence_pause: f32,
comma_pause: f32,
normalize: bool,
busy: Option<String>,
status: Status,
result: Option<Rendered>,
@@ -101,6 +103,7 @@ impl App {
speed: 1.0,
sentence_pause: 0.8,
comma_pause: 0.0,
normalize: true,
target: Target::AsteriskWav,
busy: None,
status: config_error.map_or(Status::None, Status::Error),
@@ -209,6 +212,7 @@ impl App {
speed: self.speed,
sentence_pause_ms: (self.sentence_pause * 1000.0).round() as u32,
comma_pause_ms: (self.comma_pause * 1000.0).round() as u32,
normalize: self.normalize,
};
self.player.stop();
self.busy = Some("Starte …".into());
@@ -356,7 +360,8 @@ impl App {
self.insert_pause(tag);
}
}
ui.label(RichText::new("Zahlen am besten ausschreiben („acht Uhr dreißig“)").weak().small());
ui.checkbox(&mut self.normalize, "Zahlen ausschreiben")
.on_hover_text("Datum (1.10.), Uhrzeit (8:30), Telefonnummern, Euro-Beträge, Ordnungszahlen und Abkürzungen (Dr., z. B.) in Worte fassen");
});
let editor = egui::TextEdit::multiline(&mut self.text)
.desired_rows(9)
@@ -366,6 +371,14 @@ impl App {
if let Some(range) = editor.cursor_range {
self.cursor = Some(range.primary.index.0);
}
if self.normalize {
let spoken = synth::spoken_preview(&self.text, true);
if spoken != synth::spoken_preview(&self.text, false) {
egui::CollapsingHeader::new("So wird gesprochen").default_open(true).show(ui, |ui| {
ui.label(RichText::new(spoken).weak());
});
}
}
ui.add_space(8.0);
ui.horizontal(|ui| {