waffensachkunde

Waffensachkunde – Lernsoftware für die Sachkundeprüfung nach § 7 WaffG. Barrierefrei, offline, EUPL-1.2.

/ app src shared sprechtempo.ts

2,0 KB Rohdatei
app/src/shared/sprechtempo.ts — 50 Zeilen
1 /**
2 * Die Sprechgeschwindigkeit der Vorlesefunktion.
3 *
4 * **Warum es das gibt.** `useVorlesen` setzte an der Äußerung bis 0.22.0 nur
5 * `lang` und `voice`; `rate` blieb auf der Systemvorgabe. Wer schneller oder
6 * langsamer hören musste, konnte nichts tun. Die Zielgruppe der Funktion ist
7 * im Quelltext selbst benannt – Menschen mit Lese-Rechtschreib-Störung und
8 * ermüdeten Augen –, und für sie ist ein festes Tempo bei einer über eine
9 * Minute langen Erklärung eine echte Hürde.
10 *
11 * **Warum die Leiter eng bleibt.** Unter 0,75 klingen die Systemstimmen unter
12 * Windows verwaschen, über 1,5 verschlucken sie Endungen. Beides schadet dem
13 * Verstehen mehr, als der Zeitgewinn nützt — und eine Stufe, die niemand
14 * benutzen kann, ist keine Wahl, sondern eine Falle.
15 *
16 * **Warum hier und nicht bei der Sprachausgabe.** Der Hauptprozess muss den
17 * Wert bereinigen, bevor er in `einstellungen.json` geht, und er darf keinen
18 * Renderer-Code laden.
19 */
20
21 /** Die wählbaren Geschwindigkeiten als `rate` der Web Speech API. */
22 export const SPRECHTEMPI = [0.75, 1, 1.25, 1.5] as const;
23
24 export type Sprechtempo = (typeof SPRECHTEMPI)[number];
25
26 export const SPRECHTEMPO_STANDARD: Sprechtempo = 1;
27
28 /** „Langsam“, „Normal“ … – für Beschriftung und Ansage. */
29 export const SPRECHTEMPO_BEZEICHNUNG: Readonly<Record<string, string>> = Object.freeze({
30 '0.75': 'Langsam',
31 '1': 'Normal',
32 '1.25': 'Zügig',
33 '1.5': 'Schnell',
34 });
35
36 export function sprechtempoBereinigen(wert: unknown): Sprechtempo {
37 return typeof wert === 'number' && (SPRECHTEMPI as readonly number[]).includes(wert)
38 ? (wert as Sprechtempo)
39 : SPRECHTEMPO_STANDARD;
40 }
41
42 /** „Normal“ – die Beschriftung zur Stufe. */
43 export function sprechtempoText(tempo: number): string {
44 return SPRECHTEMPO_BEZEICHNUNG[String(sprechtempoBereinigen(tempo))] ?? 'Normal';
45 }
46
47 /** „Sprechtempo: Zügig.“ – für die Live-Region nach dem Umstellen. */
48 export function sprechtempoAnsage(tempo: number): string {
49 return `Sprechtempo: ${sprechtempoText(tempo)}.`;
50 }