---
title: "Sprachmodelle"
product: "LumiScan Text Reader"
component: "lumiscan-text-reader-de"
version: "1.1.0"
display_version: "1.1.0.6"
latest_version: true
language: "de"
url: "https://docs.hdvisionsystems.com/de/lumiscan-text-reader-de/1.1.0/lumiscan-text-reader/language-models.html"
---

# Sprachmodelle – LumiScan Text Reader

Der Leser braucht ein Tesseract-Sprachmodell - eine `.traineddata`-Datei -, um überhaupt etwas zu lesen.

Welche Modelle installiert sind, gilt **anwendungsweit**: Zehn Module, die dieselben Etiketten lesen, wollen dieselben Modelle, also liegt die Einstellung auf `system/` und nicht einmal pro Modul.

Auf ctrlX OS wird ein Modell über die ctrlX-Dateischnittstelle hochgeladen.

Auf einem PC bedeutet ein Modell hochzuladen, seine Datei in das Verzeichnis zu kopieren, das `system/tessdata-dir` nennt.

```
hdvisionsystems/lumiscan-text-reader/system/
├── tessdata-dir              where you upload your own models   read-only
├── tessdata-dirs             every directory searched, in order read-only
├── languages                 the codes found across all of them read-only
├── set-tessdata-dir/         changes the upload directory
└── refresh-languages/        re-reads the directories
```

## Zwei Verzeichnisse, der Reihe nach durchsucht

1. **Ihr Upload-Verzeichnis**, `tessdata-dir`. Standardmäßig ist das der Ordner `tessdata` im Konfigurationsverzeichnis der Anwendung, neben der Konfigurationsdatei der Anwendung. Er wird beim ersten Start leer angelegt.

   | Plattform | Standard-`tessdata-dir` |
   | --- | --- |
   | ctrlX OS | `/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-text-reader/tessdata` |
   | PC (Windows) | `%APP_RESOURCE_DIR%\etc\lumiscan-text-reader\tessdata`; ohne `APP_RESOURCE_DIR` `C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-text-read\etc\lumiscan-text-reader\tessdata` |

2. **Die in der Anwendung mitgelieferten Modelle**, die schreibgeschützt sind und immer durchsucht werden.

`tessdata-dirs` zeigt beide, in der Reihenfolge, in der sie durchsucht werden.

> [!IMPORTANT]
> **Hochladen fügt Sprachen hinzu, es entfernt nie die mitgelieferten.** Sie müssen unsere Dateien nirgendwohin kopieren, und Englisch funktioniert weiter, was immer Sie tun. Ein Modell, das unter demselben Namen wie ein mitgeliefertes hochgeladen wird, gewinnt; so würden Sie Englisch durch ein anderes englisches Modell ersetzen.

## Was installiert ist

Englisch (`eng`) und `osd`. Zusammen etwa 34 MB, weshalb nur diese beiden mitgeliefert werden - jede zusätzliche Sprache würde die Anwendung für jeden Kunden vergrößern, und über das Hochladen erhalten Sie den Rest.

> [!NOTE]
> `osd` ist **keine Sprache**. Es ist das Orientierungs- und Schriftmodell, das die Layouts `AUTO_OSD` und `SPARSE_OSD` brauchen. Es erscheint in `languages`, weil es eine Datei im Verzeichnis ist, aber `input/language` auf `osd` zu setzen liest nichts.

## Eine Sprache hinzufügen

1. **Laden Sie das Modell herunter.** Das Tesseract-Projekt veröffentlicht sie unter `github.com/tesseract-ocr/tessdata_fast` und `github.com/tesseract-ocr/tessdata_best`. `fast` ist kleiner und schneller, `best` genauer; `fast` ist der richtige Standard für Bauteilkennzeichnungen.
2. **Laden Sie es hoch** in das Verzeichnis, das `system/tessdata-dir` nennt: auf ctrlX OS über die ctrlX-Dateischnittstelle, auf einem PC, indem Sie die Datei dorthin kopieren.
3. **Verwenden Sie es**: Setzen Sie `read-text/input/language` auf den Dateinamen ohne `.traineddata`.

```
upload deu.traineddata  ->  <tessdata-dir>/deu.traineddata
write  module-1/read-text/input/language = "deu"
write  module-1/read-text/execute
```

### Es gibt keinen Code nachzuschlagen

**Der Dateiname ist der Sprachcode.** Tesseract verlangt, dass das Modell für die Sprache `deu` `deu.traineddata` heißt; was immer Sie hochladen, bestimmt also, was Sie eintippen. Sie müssen nie einen Code in einer Tabelle suchen, und Sie dürfen die Datei nie umbenennen.

> [!WARNING]
> **Die Codes haben nicht alle drei Buchstaben.** Chinesisch ist `chi_sim` (vereinfacht) oder `chi_tra` (traditionell), und es gibt weitere wie `srp_latn` und `aze_cyrl`. Übernehmen Sie den Namen genau so, wie das Tesseract-Projekt ihn veröffentlicht.

| Sprache | Hochzuladende Datei | `input/language` |
| --- | --- | --- |
| Deutsch | `deu.traineddata` | `deu` |
| Französisch | `fra.traineddata` | `fra` |
| Chinesisch, vereinfacht | `chi_sim.traineddata` | `chi_sim` |
| Japanisch | `jpn.traineddata` | `jpn` |

### Kein Neustart, und auch kein Refresh

Ein hochgeladenes Modell ist **beim allernächsten `read-text`** nutzbar. Der Leser sucht die Datei bei jedem Durchlauf auf dem Datenträger, sodass eine neue gefunden wird, ohne dass etwas aktualisiert oder neu gestartet werden muss.

> [!NOTE]
> Das gilt auch für das **Ersetzen eines Modells, das bereits in Gebrauch ist**. Die Erkennungs-Engine wird einmal pro Modul aufgebaut und behalten, denn sie aufzubauen bedeutet, das Modell zu laden - 23 MB für Englisch -, und das bei jedem Lesen zu tun machte einen kleinen Lesevorgang dreimal langsamer als nötig. Sie wird neu aufgebaut, wann immer sich Sprache, Verzeichnis, Zeichensatz, Engine oder Layout ändern, und wann immer sich die Modelldatei selbst geändert hat: Vor jedem Lesen prüft der Leser Größe und Zeitstempel der Datei, und wenn sich eines davon geändert hat, vergleicht er den Inhalt der Datei mit dem, aus dem die Engine aufgebaut wurde. Eine Datei, die an Ort und Stelle überschrieben wird, unter demselben Namen im selben Verzeichnis, wird also beim nächsten `read-text` verwendet - ohne Neustart.
>
> Die Prüfung kostet einen Dateistatus pro Lesevorgang. Ein geändertes Modell wird einmal gehasht, etwa 40 ms für 23 MB, und dann geladen wie jedes neue Modell; das Protokoll meldet `The '<language>' model
> in '<directory>' changed on disk; loading it again`. Eine Datei, die nicht geladen werden kann - etwa ein noch laufender Upload -, lässt den Lesevorgang mit `-7` fehlschlagen, und der nächste Lesevorgang nach Abschluss des Uploads lädt sie.

`system/languages` ist das Einzige, das sich nicht von selbst aktualisiert - es ist eine Auflistung, die beim Start, durch `set-tessdata-dir` und durch `refresh-languages` aktualisiert wird:

```
write  system/refresh-languages/execute
read   system/languages           -> [chi_sim, deu, eng, osd]
```

Rufen Sie es auf, damit die Auflistung mit dem Verzeichnis übereinstimmt. Zum Lesen brauchen Sie es **nicht**.

## Mehrere Sprachen gleichzeitig

`input/language` ist eine Eingabe pro Modul, sodass jedes Modul in seiner eigenen Sprache aus demselben gemeinsamen Satz von Modellen liest:

```
module-1/read-text/input/language = "eng"
module-2/read-text/input/language = "deu"
module-3/read-text/input/language = "chi_sim"
```

Jedes Modul meldet in seinem eigenen `output/result.language`, was es tatsächlich verwendet hat. Zwischen ihnen wird nichts geteilt außer den Modellen auf dem Datenträger.

## Ein anderes Upload-Verzeichnis verwenden

`set-tessdata-dir` richtet das **erste** Suchverzeichnis woandershin. Auf ctrlX OS etwa auf einen USB-Stick, da die Anwendung die Schnittstelle `removable-media` hat:

```
write  system/set-tessdata-dir/input/tessdata-dir = "/media/usb/tessdata"
```

Unter Windows etwa auf einen Ordner auf einem anderen Laufwerk:

```
write  system/set-tessdata-dir/input/tessdata-dir = "D:\models\tessdata"
```

Dann, auf beiden:

```
write  system/set-tessdata-dir/execute
read   system/set-tessdata-dir/output/status-code   -> 1
read   system/languages                             -> [deu, eng, fra, osd]
```

Die mitgelieferten Modelle bleiben verfügbar, ein leeres Verzeichnis wird also akzeptiert - sinnvoll, wenn Sie kurz vor dem Hochladen darauf zeigen. Die Wahl wird gespeichert und übersteht einen Neustart.

> [!NOTE]
> Anders als bei jedem anderen Pfad, den diese Anwendung entgegennimmt, wird hier ein absoluter Pfad außerhalb des Konfigurationsverzeichnisses akzeptiert. Sprachmodelle sind große Dateien von Dritten, die berechtigterweise dort bleiben, wo sie sind - auf ctrlX OS außerhalb der ctrlX-Solution -, statt in das Konfigurationsverzeichnis kopiert zu werden. Die Anwendung listet und liest sie nur.

## osd muss neben der Sprache liegen

Tesseract löst pro Durchlauf **ein** Verzeichnis auf, die Layouts `AUTO_OSD` und `SPARSE_OSD` brauchen `osd.traineddata` also im *selben* Verzeichnis wie das Sprachmodell - nicht bloß irgendwo im Suchpfad. Laden Sie `deu.traineddata` allein hoch, wählen Sie `AUTO_OSD`, und der Durchlauf wird mit genau dieser Begründung abgelehnt:

```
error: invalid input: layout AUTO_OSD also needs osd.traineddata beside 'deu.traineddata' in
'<tessdata-dir>'; copy it from '<shipped dir>', or choose a layout that does not detect orientation
```

Laden Sie entweder `osd.traineddata` neben Ihr Modell hoch, oder verwenden Sie ein Layout, das keine Orientierung erkennt. Der Standard, `SINGLE_BLOCK`, tut das nicht - das Thema kommt nur auf, wenn Sie Orientierungserkennung angefordert haben.

## Wenn set-tessdata-dir ablehnt

Es validiert, bevor es irgendetwas veröffentlicht; ein abgelehnter Aufruf lässt `tessdata-dir`, `tessdata-dirs` und `languages` also genau so, wie sie waren - Sie sehen nie ein Verzeichnis und eine Auflistung, die sich widersprechen.

| Situation | `status-code` |
| --- | --- |
| `input/tessdata-dir` ist leer | `-2` ungültige Eingabe |
| Der Pfad ist kein Verzeichnis | `-4` Quelle nicht gefunden |
| Umgeschaltet, aber die Wahl konnte nicht gespeichert werden | `-6` Schreiben fehlgeschlagen - **die Umschaltung ist aktiv**, nur das Speichern ist fehlgeschlagen |

Ein leeres Verzeichnis wird **nicht** abgelehnt. Das war früher so, als dies der einzige Ort war, von dem Modelle gelesen wurden, und ein leeres Verzeichnis bedeutete, dass jeder Lesevorgang stillschweigend auf Englisch zurückfiel. Die mitgelieferten Modelle werden jetzt immer durchsucht.

## Die falsche Sprache

`read-text` validiert die Sprache, **bevor** es läuft, und lehnt eine nicht installierte mit `status-code -2` ab, unter Nennung jedes durchsuchten Verzeichnisses und dessen, was verfügbar ist:

```
error: invalid input: language 'fra' has no fra.traineddata in any model directory
('<tessdata-dir>', '<shipped dir>'); available: eng, osd. Upload fra.traineddata to
'<tessdata-dir>' - the file name is the language code
```

Verschwindet ein Modell zwischen dieser Prüfung und dem Lesen - jemand hat den USB-Stick gezogen -, meldet `output/result.language`, was **tatsächlich** verwendet wurde, und `status-text` sagt es ebenfalls:

```
ok: 4 word(s), mean score 0.91 (eng, SINGLE_BLOCK) - NOTE: language 'deu' is not installed, read with 'eng' instead
```

> [!IMPORTANT]
> Lesen Sie `output/result.language`, nicht `input/language`, wenn Sie wissen müssen, wie ein Ergebnis zustande kam. Meist sind sie gleich. Wenn sie sich unterscheiden, sagt nur die Ausgabe die Wahrheit.
