{"id":2988,"date":"2023-11-30T11:27:50","date_gmt":"2023-11-30T10:27:50","guid":{"rendered":"https:\/\/www.art-events.de\/weblog\/?p=2988"},"modified":"2023-11-30T19:02:08","modified_gmt":"2023-11-30T18:02:08","slug":"ae-android-probleme-mit-texttospeech","status":"publish","type":"post","link":"https:\/\/www.art-events.de\/weblog\/ae-android-probleme-mit-texttospeech\/","title":{"rendered":"AE Android: Probleme mit TextToSpeech"},"content":{"rendered":"<p>Unser AE Android Kochbuch: Notizen App und TextToSpeech Probleme. Unter Android11 und davor bleibt der Lautsprecher stumm&#8230;<\/p>\n<p>&nbsp;<\/p>\n<h3><a id=\"post-2988-__RefHeading___Toc1728_4174826217\"><\/a>Die Notizen App und Text To Speech<\/h3>\n<p>Im Teil 3 erstellte ich ein kleines Notizbuch mit dem ich Texte schreiben, speichern und laden konnte. Dar\u00fcber hinaus gab es einen kleinen Bonus: auf Tastendruck hat mir das Notizbuch einen Text vorgelesen. Basis hierf\u00fcr ist die TextToSpeech Funktion, die Android bereits seit Urzeiten anbietet.<\/p>\n<p>Das mit dem Vorlesen funktioniert wohl auch ganz gut, solange Android 12 oder h\u00f6her im Ger\u00e4t verwendet werden. Bei \u00e4lteren Versionen von Android wie Android 10 oder 11 blieben die Lautsprecher aber stumm. Manchmal st\u00fcrzte sogar das ganze Ger\u00e4t ab. Zumindest auf einigen Ger\u00e4ten und Konfigurationen, die ich im Device Konfigurator selbst ausprobierte.<\/p>\n<p>Ich habe mich dann mal auf die Suche gemacht und einen Work Around gebastelt, damit das mit dem Vorlesen auch auf Android 11 und Android 10 klappt. Hier das Ergebnis.<\/p>\n<h3><a id=\"post-2988-__RefHeading___Toc2434_4097356412\"><\/a>Absturzursache beseitigen &#8211; Manifest erweitern<\/h3>\n<p>Die Android Doku empfiehlt den TTS_Service f\u00fcr Android 10 ins Manifest aufzunehmen. Das ist schnell gemacht: Im Projekt Explorer das Manifest \u00f6ffnen und unter queries das Intent einf\u00fcgen:<\/p>\n<pre>\u2026hier ist der application teil...\r\n&lt;\/application&gt;\r\n\r\n  &lt;queries&gt;\r\n    &lt;intent&gt;\r\n      &lt;action android:name=\"android.intent.action.TTS_SERVICE\" \/&gt;\r\n    &lt;\/intent&gt;\r\n  &lt;\/queries&gt;<\/pre>\n<p>Mit dieser \u00c4nderung habe ich den Absturz erst einmal behoben. Trotzdem kommt noch kein Vorlesetext.<\/p>\n<h3><a id=\"post-2988-__RefHeading___Toc167_3035067872\"><\/a>TextToSpeech in den Hardwareeinstellungen pr\u00fcfen<\/h3>\n<p>Unter Android \u2013 Einstellungen \u2013 Anpassungen \u2013 Sprache \/ Ton pr\u00fcfen, ob TextToSpeech generell aktiviert ist und eine Sprache geladen wurde! Je nach Ger\u00e4t gibt es hier wohl die M\u00f6glichkeit, das generell auszuschalten. Ich habe allerdings noch kein Ger\u00e4t gefunden, wo das NICHT aktiviert war. Aber wer wei\u00df \u2013 eine m\u00f6gliche Fehlerursache k\u00f6nnte es trotzdem sein!<\/p>\n<h3><a id=\"post-2988-__RefHeading___Toc169_3035067872\"><\/a>Debugging \u2013 Text To Speech onInit<\/h3>\n<p>Um zu sehen, wo Probleme auftreten, habe ich die onInit Methode um Log Meldungen in Log.d. erweitert. Ich lasse mir im Logcat die Status Variable und auch den String anzeigen, der verlesen werden soll.<\/p>\n<pre>\/\/---------------------------------------------------------------------- \r\n@Override \r\npublic void onInit(int status) { \r\n\r\n  Log.d(\"000000\", \"Value: \" + String.valueOf(status)); \r\n\r\n  if (status == TextToSpeech.SUCCESS) { \r\n    String S1 = etEingabe1.getText().toString(); \r\n    Log.d(\"111111\", S1); \r\n    tts.setLanguage(Locale.GERMAN); \r\n    tts.speak(S1, TextToSpeech.QUEUE_FLUSH, null); \r\n  } \r\n}<\/pre>\n<p>Programmierung besteht bekanntlich zu gro\u00dfen Teilen aus Tests und Fehlersuche, wenn etwas Unerwartetes passiert. Nutzen wir also die Instrumente, die daf\u00fcr vorgesehen sind und ich schaue mir das Logcat f\u00fcr die laufende Anwendung an:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" width=\"850\" height=\"178\" class=\"wp-image-2989\" src=\"https:\/\/www.art-events.de\/weblog\/wp-content\/uploads\/2023\/11\/word-image-2988-1.png\" srcset=\"https:\/\/www.art-events.de\/weblog\/wp-content\/uploads\/2023\/11\/word-image-2988-1.png 850w, https:\/\/www.art-events.de\/weblog\/wp-content\/uploads\/2023\/11\/word-image-2988-1-300x63.png 300w, https:\/\/www.art-events.de\/weblog\/wp-content\/uploads\/2023\/11\/word-image-2988-1-768x161.png 768w\" sizes=\"auto, (max-width: 850px) 100vw, 850px\" \/><\/p>\n<p>Wenn alles richtig l\u00e4uft, bringt TextToSpeech drei Eintr\u00e4ge in das Logcat:<\/p>\n<p>-) Sucessfully bound &#8230;<\/p>\n<p>-) Connected to \u2026<\/p>\n<p>-) Set up connection \u2026<\/p>\n<p>Anschlie\u00dfend folgen meine beiden Debug Ausgaben.<\/p>\n<p>Bei Nutzung von Android10 und 11 sieht das Logcat hingegen anders aus: es kommt nur der Eintrag Sucessfully bound \u2013 sonst nichts mehr.<\/p>\n<p>Meine Schlussfolgerung: TextToSpeech OnInit wird bei Android11 und kleiner entweder nicht korrekt aktiviert und kann nicht richtig arbeiten.<\/p>\n<h3><a id=\"post-2988-__RefHeading___Toc59_340930092\"><\/a>Button Vorlesen \u2013 Aufruf modifizieren<\/h3>\n<p>Ursache d\u00fcrfte darin liegen, dass der Leseprozess von TextToSpeech in der Methode onInit mittels asychronem Task stattfindet. Der ist schlichtweg einfach noch nicht korrekt durchgelaufen, wenn schon der Shutdown kommt und die Ressourcen wieder frei gibt.<\/p>\n<p>Ich bastele etwas herum und schmeisse mal den tts.shutdown aus der Anwendung! Und siehe da, es funktioniert. Flei\u00dfig und emsig wird mein Text vorgelesen.<\/p>\n<p>Also baue ich den Startcode im Button etwas um und frage auf die Android Version ab. Wenn diese kleiner Android 12 ist, lasse ich den Shutdown an dieser Stelle einfach weg.<\/p>\n<pre>if (v.getId() == R.id.buttonVorlesen) { \r\n  \/\/Aktionen fuer Button Vorlesen \r\n  tts = new TextToSpeech(this, this); \r\n\r\n  \/\/Moegliche Probleme &lt; Android12: shutdown ausschalten! \r\n  if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.S) { \r\n    tts.shutdown(); \r\n  } else {\r\n     \/\/der Shutdown muss woanders hin\r\n  }\r\n}<\/pre>\n<p>Fairerweise sei erw\u00e4hnt, dass der tts.shutdown die Ressourcen von TextToSpeech freigeben soll. Ihr solltet das also an anderer geeigneter Stelle irgendwo einbauen, z.B. wenn ihr mit dem Button Laden einen neuen Text holt oder mit dem L\u00f6schen Button die Eingabebox l\u00f6scht. Ich habe das durch den Kommentar &#8222;der Shutdown muss woanders hin&#8220; verdeutlicht\u00a0 &#8211; der an dieser Stelle nat\u00fcrlich technisch keinen Sinn macht!<\/p>\n<h3><a id=\"post-2988-__RefHeading___Toc61_340930092\"><\/a>Fazit<\/h3>\n<p>Mit diesem Workaround l\u00e4sst sich die Vorlesefunktion auch unter Android10 und 11 nutzen.<\/p>\n<hr \/>\n<p>Das Video zu diesem Beitrag:<\/p>\n<p><iframe loading=\"lazy\" title=\"AE Android Kochbuch Unser Writer App und TextToSpeech Probleme.\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/-rGBLpEgHfg?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<hr \/>\n<p><a href=\"https:\/\/www.art-events.de\/weblog\/wp-content\/uploads\/2021\/06\/20080607hjwx-204.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2104\" src=\"https:\/\/www.art-events.de\/weblog\/wp-content\/uploads\/2021\/06\/20080607hjwx-204.jpg\" alt=\"\" width=\"204\" height=\"153\" \/><\/a><\/p>\n<p>Text und Entwurf. (c)\u00a0<a href=\"https:\/\/www.terminal-systems.de\/\" target=\"_blank\" rel=\"noopener\">AE SYSTEME Testcenter<\/a>, Hans-J. Walter<br \/>\nHans-J. Walter ist Programmierer f\u00fcr Windows DOT.NET \/ C# und Android und als eingetragener, unabh\u00e4ngiger Journalist verantwortlich f\u00fcr Fachberichte und Schulungstexte \u00fcber Technik u. Entwicklung.\u00a0<a href=\"mailto:hjw@terminal-systems.de\">hjw@terminal-systems.de<\/a><\/p>\n<p><em>F\u00fcr diese und alle nachfolgenden Seiten gilt ebenso der obligatorische Hinweis: Alle Angaben ohne Gew\u00e4hr. Bilder und Codes zeigen Beispiele. Diese Beschreibung bezieht sich auf unsere Installation und stellt keine Bewertung der verwendeten Techniken da. Fehler und Irrt\u00fcmer vorbehalten!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unser AE Android Kochbuch: Notizen App und TextToSpeech Probleme. Unter Android11 und davor bleibt der Lautsprecher stumm&#8230; &nbsp; Die Notizen App und Text To Speech Im Teil 3 erstellte ich ein kleines Notizbuch mit dem ich Texte schreiben, speichern und laden konnte. Dar\u00fcber hinaus gab es einen kleinen Bonus: auf Tastendruck hat mir das Notizbuch [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,34],"tags":[],"class_list":["post-2988","post","type-post","status-publish","format-standard","hentry","category-android","category-programmierung","entry"],"_links":{"self":[{"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/posts\/2988","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/comments?post=2988"}],"version-history":[{"count":0,"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/posts\/2988\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/media?parent=2988"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/categories?post=2988"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.art-events.de\/weblog\/wp-json\/wp\/v2\/tags?post=2988"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}