Files
talk/internal/langdetect/detect.go
T
m3ta-chiron ae9f3b680e fix(audio): NullSink-Verwurf-Zeile im CLI-Pfad sichtbar machen
NewSink bekommt einen optionalen Log-Writer (die CLI übergibt stderr);
zuvor verwarf der null-Sink bei erfolgreicher Synthese stumm — die
sichtbare Zeile kam nur aus dem ErrNoByteOutput-Zweig. Sink-Interface
unverändert; Aufrufstellen ab Task 03 müssen den Writer übergeben.
TestSayArgumentMitNullSink beweist die Zeile jetzt extern auf dem
CLI-Pfad, TestNewSink deckt das Factory-Wiring ab; Live-Beweis mit
espeak-ng dokumentiert ("audio: N Bytes verworfen (null sink)", Exit 0).

Dazu (Minor): "was" aus englishWords entfernt — widersprach dem
Mehrdeutigkeits-Kommentar und dem Report; neuer TestFall
"Was macht er?" → de.
2026-10-18 15:46:20 +02:00

78 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package langdetect
import (
"strings"
"unicode"
)
// Detect erkennt die Sprache eines Ansage-Texts und liefert "de" oder "en".
// Default (auch bei leerem oder unentscheidbarem Text) ist "de".
//
// Heuristik: Common-Word-Listen deutscher und englischer Wörter plus
// Umlaute/ß als starke Deutsch-Signale. Englisch gewinnt nur bei strikt
// mehr englischen Signalen als deutschen; bei Gleichstand entscheidet der
// Default "de". Die Funktion ist rein (kein globaler Zustand, keine IO).
func Detect(text string) string {
var de, en int
for _, r := range text {
switch r {
case 'ä', 'ö', 'ü', 'ß', 'Ä', 'Ö', 'Ü':
de++
}
}
for _, word := range strings.FieldsFunc(text, func(r rune) bool {
return !unicode.IsLetter(r) && r != '\'' && r != '’'
}) {
word = strings.ToLower(word)
if _, ok := germanWords[word]; ok {
de++
}
if _, ok := englishWords[word]; ok {
en++
}
}
if en > de {
return "en"
}
return "de"
}
// germanWords sind häufige deutsche Wörter, die im Englischen nicht
// vorkommen (Mehrdeutigkeiten wie „was" und „in" wurden weggelassen).
var germanWords = map[string]struct{}{
"der": {}, "die": {}, "das": {}, "und": {}, "nicht": {}, "ist": {},
"ein": {}, "eine": {}, "einen": {}, "einem": {}, "einer": {},
"mit": {}, "für": {}, "auf": {}, "von": {}, "vom": {}, "zum": {},
"zur": {}, "den": {}, "dem": {}, "des": {}, "wir": {}, "ihr": {},
"sie": {}, "auch": {}, "als": {}, "wie": {}, "bei": {},
"aus": {}, "nach": {}, "noch": {}, "nur": {}, "schon": {},
"wenn": {}, "dann": {}, "aber": {}, "oder": {}, "doch": {},
"mehr": {}, "sehr": {}, "über": {}, "unter": {}, "jetzt": {},
"hier": {}, "heute": {}, "morgen": {}, "danke": {}, "bitte": {},
"erfolgreich": {}, "fehlgeschlagen": {}, "fertig": {},
"gestartet": {}, "beendet": {}, "abgeschlossen": {}, "warten": {},
"läuft": {}, "kannst": {}, "muss": {}, "soll": {},
"kein": {}, "keine": {}, "wieder": {}, "werden": {}, "wurde": {},
"wurden": {}, "haben": {}, "geht": {}, "machen": {},
}
// englishWords sind häufige englische Wörter, die im Deutschen nicht
// vorkommen.
var englishWords = map[string]struct{}{
"the": {}, "is": {}, "not": {}, "and": {}, "with": {}, "for": {},
"on": {}, "of": {}, "to": {}, "from": {}, "by": {}, "at": {},
"or": {}, "but": {}, "if": {}, "then": {}, "when": {}, "how": {},
"what": {}, "why": {}, "who": {}, "done": {}, "failed": {},
"finished": {}, "started": {}, "completed": {}, "error": {},
"warning": {}, "thanks": {}, "you": {}, "your": {},
"we": {}, "it": {}, "this": {}, "that": {}, "these": {},
"those": {}, "were": {}, "are": {}, "be": {},
"been": {}, "has": {}, "have": {}, "had": {}, "can": {},
"will": {}, "would": {}, "should": {}, "could": {}, "just": {},
"only": {}, "still": {}, "already": {}, "now": {}, "today": {},
"tomorrow": {}, "waiting": {}, "running": {}, "please": {},
"needs": {}, "need": {}, "succeeded": {},
}