Skip to content

HermiVoice 1.0.1

Choose a tag to compare

@virse virse released this 03 Nov 16:25
· 6 commits to main since this release

[1.0.1] — Bugfix-Release (2026-11-03, versionCode 2)

Behebt die sechs bei einer externen Code-Durchsicht gemeldeten Fehlerklassen
(Nebenläufigkeit, Netzwerk-Timeout, Recovery nach Schlüsselverlust, UI-Thread-Last).

Behoben

  • Abgeschnittene Satzenden bei der Sprachaufnahme: Der Aufnahme-Stop wartete auf
    einen Hintergrund-Thread und meldete auch nach Ablauf des 12-s-Budgets „fertig“;
    zwei Stopps erzeugten zwei Wartethreads und zwei Callbacks. Jetzt gibt es genau
    einen Wartevorgang, der alle Anfragen sammelt, und ein Timeout wird explizit
    protokolliert statt still als Erfolg behandelt.
  • Absturzrisiko (Use-after-Free) in der Spracherkennung: feed()/partialResult()
    liefen auf dem Audio-Thread ohne das Lock, unter dem Recognizer und Stream
    freigegeben werden (Erkennungsende, onDestroy). Die nativen Aufrufe laufen jetzt
    unter demselben Lock und greifen nie auf einen bereits freigegebenen Stream zu.
  • Antwort-Timeout wirkungslos: Der Socket-Read-Timeout wurde erst nach dem Öffnen
    des Streams gesetzt und blieb dadurch ohne Wirkung (faktisch fest 120 s). Er wird
    jetzt vor dem Verbindungsaufbau gesetzt; die konfigurierte Antwortzeit (1–15 min)
    wird als Deadline im Leseloop geprüft. Ein First-Token-Watchdog hält die kurze
    First-Token-Frist auch bei einem völlig stummen Server ein. Gilt für Gateway- und
    Cloud-Streams.
  • Stiller Verlust der Zugangsdaten: Ist der Keystore-Key weg (Restore/Werksreset),
    wurden API-Keys stumm zu leeren Strings — die App wirkte „nicht konfiguriert“,
    obwohl ein Backup existiert. Die App erkennt das jetzt beim Start und zeigt einen
    einmaligen Hinweis (API-Key neu eintragen oder Backup importieren).
  • ANR-Risiko beim Modellaufbau: Die ONNX-Modelle wurden im UI-Thread geladen
    (Sekunden bei onResume/Sprachwechsel). Der Aufbau läuft jetzt im Hintergrund mit
    sichtbarem Zustand „Modell wird geladen“; ein Aufnahmestart währenddessen wird
    erklärt statt still ignoriert.
  • Splash startete die App nach Abbruch trotzdem: Der verzögerte Start wird beim
    Verlassen der Splash-Activity jetzt abgebrochen.
  • Hängender TTS-Puffer nach Freigabe der Engine: Nach shutdown() gepufferter
    Text wurde nie mehr gesprochen; die Sprachausgabe lehnt das jetzt sauber ab.
  • Parallele Antwort-Streams: sendText lehnte einen zweiten Stream bisher nur über
    den UI-Button ab. Der Schutz greift jetzt auch für programmatische Aufrufe (Sprache,
    Teilen-Funktion) mit Hinweis statt stillem Start.

Technik

  • Verschlüsselte Werte tragen jetzt den expliziten Marker enc:v1:. „Ist das
    verschlüsselt?“ wird damit ohne teuren Decrypt-Versuch beantwortet; Altbestand ohne
    Marker bleibt lesbar.
  • Neue Zustandsanzeige MODEL_LOADING, neue Strings DE/EN.

English

Fixes the six issue classes reported by an external code review (concurrency,
network timeouts, recovery after key loss, main-thread load): microphone stop
now reports one coordinated completion, native recognizer calls are protected by
the release lock, the configured answer timeout actually applies (plus a
first-token watchdog), undecryptable credentials produce a one-time notice,
the ONNX model loads off the UI thread with a visible loading state, the splash
no longer starts the app after being dismissed, TTS no longer buffers after
shutdown, and a second answer stream is rejected instead of silently starting.
Encrypted values now carry an enc:v1: marker.