Kurzanleitung: eSpeak NG (Sprachausgabe) selbst bauen und auf GrapheneOS einrichten

Hallo!

In diesem Artikel Artikel wird vorgeschlagen, eSpeak NG aus F-Droid zu beziehen. Allerdings ist die momentan verfügbare Version 1.51.1 (Juni 2022) dem Entwicklungsstand um einiges hinterher. Nachdem ich sie installiert hatte und das Einstellungs-Frontend gestartet hatte, kam eine Warnung, die sich in etwa „das Programm wurde für einie ältere Android-Version gebaut“ las. Ich hatte zuerst angenommen, dass das der Grund für das Nichtfunktionieren war (für ein Test-„hello“ kam keine Sprache und es gibt ja die ähnlichen Issues #1170 und #1561) und habe mich nun ins Selbst-Bauen begeben. Dabei hat sich herausgestellt, dass diese zuerst gemachte Annahme wahrscheinlich nicht zutrifft, aber ich bin nicht zurückgegangen um es zu bestätigen oder zu widerlegen.

Mein Desktop-Betriebssystem ist Ubuntu 22.04. Größtenteils wird den offiziellen Anweisungen gefolgt. Ich will hier nur meine Entscheidungen und Entdeckungen aufschreiben. Vielleicht spart es jemandem später etwas Zeit :-).

Software-Voraussetzungen

  • Build-Tools (Autotools, native Compiler, …): Wie unter „Linux, Mac, BSD“ dokumentiert: problemlos, da aus apt
  • Java- und Android-Zeug (siehe „Android“):
    • Gradle: aktuelle Version 8.2.1 heruntergeladen und entpackt
    • Android SDK: Anroid Studio heruntergeladen und installiert. Aus apt wäre mir lieber gewesen, aber das Build-System will dann später das Android NDK, das es herunterlädt, in einen Pfad unter der SDK-Installation packen. Das schlägt fehl, da es ein Systempfad ist (und man natürlich nicht als root baut). Ebenfalls lieber gewesen wäre es mir, wenn ich Gradle auf meinen eigenen NDK-Download hinweisen könnte, aber nach Konsultation der relevanten Doku habe ich es sein lassen, das zu versuchen.

Das Bauen von der Kommandozeile

Geht größtenteils durch, wenn man den Anweisungen folgt.

Hatte nicht allzu große Hindernisse zu überwinden, siehe Issue #1789.

Die selbst-signierte APK nach GrapheneOS Überführen

Als ich vor einiger Zeit versucht hatte, eine selbstgebaute APK (für die apksigner verify durchgeht), die mittels USB-Verbindung nach GrapheneOS kopiert wurde, zu „öffnen“, passierte einfach nichts.

Kurioserweise hatte ich später festgestellt, dass sich aus dem Webbrowser stammende APKs wie erwartet öffnen ließen.

Eine Zeitlang kam ich also mit Python’s http.server aus, um nur das lokale Netzwerk zu benötigen, aber ab einer gewissen Version mochte GrapheneOS die ungesicherte Verbindung nicht mehr und bot (soweit ich sah) auch kein Override an.

Daher also: Was soll’s, hab die APK-Datei per E-Mail an mich selbst verschickt und auf dem Gerät ihre SHA256 berechnet und vergleichen (:grin:).

Müsste mal schauen, ob ich bei dem lokalen Kopieren doch nicht etwas übersehe (oder sich inzwischen GrapheneOS anders verhält).

Einrichtung auf GrapheneOS

Nach der Installation scheint das Einstellungs-Frontend zuerst einmal nicht zu funktionieren: „Default Voice“ ist (soweit ich mich erinnere) leer und Sprache kommt auch keine. Hhm. Es stellt sich heraus, dass ich (auch) die GrapheneOS-Doku hätte lesen sollen. Der zentrale Punkt findet sich unter „Accessibility“:

After installing a TTS service, you need to select it in the OS configuration to accept activating it. The OS will display one of them as already selected, but it won’t simply work from being installed as that wouldn’t be safe.

Für mich hat dann folgendes geklappt, unmittelbar nach einer erneuten Installation: Einstellungs-Button → Accessibility → Text-to-speech output (ganz unten) → Preferred engine → auf „eSpeak“ clicken. Und tatsächlich, GrapheneOS hatte mich dann gefragt, ob ich es aktivieren möchte.

Weiterführend: Benutzung in einer Mapping-App

Ich nehme an, der häufigste use case ist Sprachausgabe für Navigation (und nicht, sagen wir, sich Herr der Ringe vorlesen zu lassen :grin:). So auch bei mir. Meine Erfahrung mit der Benutzung in Organic Maps:

  • Man sollte der App die „Notifications“-Berechtigung erteilen (macht Sinn)
  • Apropos: eSpeak selbst habe ich die „Sensors“-Berechtigung entzogen. Ist doch Sprachsynthese, also wozu bitte Sensoren? Scheint keine Änderung in der Güte des Funktionierens zu bewirken.
  • Habe ein Paar Runden mit dem Fahrrad gemacht. (Und die Routenführung in OMaps auf „motorisiertes Rad“ gestellt. Als „Fußgänger“ bekam ich – logisch – die Benachrichtigung zum Abbiegen erst unmittelbar vor der Biegung.)
    • Mein erster Test verlief einigermaßen erfolgreich: OMaps wies mich an, hier oder dort abzubiegen oder eine gewisse Strecke weiterzufahren
    • Interessant ist natürlich auch das Verhalten, wenn man von der vorgeschlagen Route abweicht oder ganz woandershin (z. B. rückwärts) fährt. In letzterem Fall scheint OMaps zu verstummen.
    • Leider ist das Vorhandensein von Sprachausgabe nicht konsistent. Manchmal kommt sie, manchmal nicht. (Es wäre schön, wenn man wüsste, dass nach Drücken von „Start“ immer eine initiale Sprachausgabe erfolgt.)
      • Übrigens: in OMaps scheint es so zu sein, dass – auch wenn man in den Einstellungen Sprachausgabe aktiviert hat – sie initial (ab Programmstart) nicht aktiv ist. Man muss also den unteren Balken antippen und dann den Lautsprecher-Icon (sodass er aus dem Lautsprecher austretende Schallwellen symbolisiert). Dieser Zuständ scheint dann aber für die Dauer des laufenden Prozesses zu halten.
      • Daher mein vorläufiges Fazit für eine Benutzung im Auto: Für einfache Routen scheint eine Verwendung möglich. Muss sich allerdings noch im Praxistest bestätigen. Einen eingebauten Navi ersetzt es nicht (war aber auch nie beabsichtigt). Bei Vorhandenseit von mehr Zeit wäre es durchaus interessant, sich in den Quellcode zu begeben.
1 „Gefällt mir“