🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Sprachausgabe von Texten mit mehrfachen Sprachen im Text

WRITER hat alles, was Sie von einer modernen, voll ausgestatteten Textverarbeitung erwarten.
Antworten
ufi
Beiträge: 3
Registriert: Mo 24. Feb 2025, 12:35
Wohnort: Berlin

Sprachausgabe von Texten mit mehrfachen Sprachen im Text

Beitrag von ufi » Mo 24. Feb 2025, 15:00

Hallo LO-Forum

Ich habe ein Dokument mit deutschen und französischen Text- Segmenten:
Beispiel:
Wenn eine Handlung gerade abgeschlossen wurde, verwendet man auch
venir de faire quelque chose habe gerade etwas getan.
z.B.:
Tu viens de manger Du hast gerade gegessen

Ziel ist, das Dokument mit unterschiedlichen Sprachelementen durchgehend vorlesen zu lassen.
Die Erweiterung text-to-speech 0.8.92 ( read_text_2025.01.12_00.11.oxt ) ist installiert.
Die französischen Texte sind im Dokument blau markiert.
Über Format, Zeichen habe ich zur besseren Lesbarkeit die französische Sprache diesen blauen Textbereichen zugeordnet.

Markiere ich nun einen „blauen“ Bereich und rufe auf über
Extras, Plug-ins, Markierten Text vorlesen,
so bekomme ich ein Menü, wo ich die Ausgabe mit Hilfe von wscript.exe starten kann.
Die Sprachausgabe erfolgt dann in der französischen Sprache, wie gewünscht.
Auch die Ausgabe über translate.google.de funktioniert, dauert aber etwas und es muss dort die Ausgabe der Sprache extra gestartet werden. Hier ist die Aussprache aber viel „menschlicher“.

Markiere ich nun einen gemischten Bereich, also Elemente in deutscher und französischer Sprache,
rufe dann die Sprachausgabe auf, dann wird nur in der deutschen Sprache vorgelesen und dabei wird der französische Text nicht in Französisch vorgelesen sondern er ist unverständlich.

Das Problem scheint zu sein, dass bei der Nutzung von
"(TTS_WSCRIPT_VBS)" /language:"(SELECTION_LANGUAGE_COUNTRY_CODE)" "(TMP)"
und bei
https://translate.google.de/?&langpair= ... O_WEBTEXT)
für den ausgewählten Text nur ein LANGUAGE_COUNTRY_CODE für die Umsetzung gesetzt wird! Es wird also dann nicht mehr ein Wechsel des COUNTRY_CODE Parameters berücksichtigt.
Das bedeutet wohl, dass die automatische Sprachausgabe abhängig vom COUNTRY_CODE des Textes aufgeteilt werden sollte. Das geht wohl nur über ein Scripting / Makro.
Möglicherweise wäre die jeweilige Ausgabe in eine mp3- Datei sinnvoll, wobei diese mp3-Datei dann an eine Master-mp3-Datei schrittweise angehängt wird. So würde eine fließende Sprachausgabe entstehen, die dann abgespielt werden kann.

Für die Programmierung steht bei mir die APSO 1.4.2 und Python 3.10 zur Verfügung.
Für den Umgang und die Nutzung der LO- Library mit ihren Klassen, Methoden und Funktionen habe ich keine Erfahrung. Das wird mein Lernprozess, fangen wir einfach an.
Wie programmiere ich das?

Aufgabe 1:
Ich habe einen ausgewählten Text mit schwarz (deutsch) und blau (französisch) gekennzeichneten Elementen (Textfarbe).
Wie ordne ich diesen „blauen Elementen“ die französische Sprache (FR) über ein Script zu?
Was müsste ich ändern, wenn gelb für Englisch dazukommen würde?

Aufgabe 2:
Ich habe einen ausgewählten Text mit Sprachzuordnungen in Deutsch und Französisch in den einzelnen Text- Elementen.
Wie trenne ich die Textbereiche je nach der Sprachzuordnung?
Speicherung: Sequenz, Sprache, Text

Aufgabe 3:
Sequentielle Übergabe der Daten an https://translate.google.de aber mit Sprachkennzeichen, also ohne Spracherkennung und mit direkter Ausgabe der Sprache, also ohne Dialog.

( Aufgabe 4: Aufnahme der Ausgabe mit Audacity, um Pausen oder andere Änderungen zu bearbeiten )

Für eine hilfreiche Unterstützung bin ich dankbar ( als Anfänger )

MfG
UFI

D-APP
Beiträge: 156
Registriert: Di 30. Mär 2021, 21:10

Re: Sprachausgabe von Texten mit mehrfachen Sprachen im Text

Beitrag von D-APP » Di 25. Feb 2025, 20:47

Hey,

große Nummer ... :D

Ich würde bei solch interessanten Fragestellungen tatsächlich mal eine KI befragen.

Code: Alles auswählen

Aufgabe 1: Blaue Texte als Französisch markieren
LibreOffice speichert Sprachinformationen pro Zeichenstil oder direkt im Absatz-/Zeichenformat. Wenn du bereits blaue Texte visuell markiert hast, können wir ein Makro schreiben, das diesen Bereichen automatisch die Sprache Französisch (FR) zuweist.

Hier ist ein Python-Makro, das genau das tut:

Schritte:
Gehe durch den aktuellen Auswahlbereich.
Prüfe die Schriftfarbe jedes Zeichens.
Falls das Zeichen blau ist, setze die Sprache auf Französisch.
Falls wir später gelb für Englisch hinzufügen wollen, fügen wir eine weitere Bedingung für gelbe Texte hinzu.
Python-Code für LibreOffice Makro
python
Kopieren
Bearbeiten
import uno
from com.sun.star.awt import XSystemDependentWindowPeer

def set_language_by_color():
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    doc = desktop.getCurrentComponent()
    
    # Prüfen, ob es sich um ein Textdokument handelt
    if not hasattr(doc, "Text"):
        return
    
    selection = doc.CurrentController.getSelection()
    if not selection:
        return
    
    # Durch alle ausgewählten Bereiche gehen
    for i in range(selection.getCount()):
        text_range = selection.getByIndex(i)
        
        # Zeichen durchlaufen
        cursor = text_range.getText().createTextCursorByRange(text_range)
        while cursor.goRight(1, True):
            char_color = cursor.CharColor  # Farbwert (RGB)
            
            if char_color == 255:  # Blau (FF0000 in LibreOffice-Farbcode)
                cursor.CharLocale = uno.createUnoStruct("com.sun.star.lang.Locale")
                cursor.CharLocale.Language = "fr"
            elif char_color == 16776960:  # Gelb (FFFF00)
                cursor.CharLocale = uno.createUnoStruct("com.sun.star.lang.Locale")
                cursor.CharLocale.Language = "en"

    doc.CurrentController.getFrame().getContainerWindow().setFocus()
Erklärung:
cursor.CharColor: Holt die aktuelle Zeichenfarbe (z. B. 255 für Blau).
cursor.CharLocale: Ändert die Sprache des Zeichens (fr für Französisch, en für Englisch).
Bedingungen: Falls du noch weitere Farben für andere Sprachen nutzen möchtest, kannst du weitere elif-Blöcke hinzufügen.
Aufgabe 2: Textbereiche nach Sprache trennen
Nun geht es darum, verschiedene Sprachbereiche im Text zu erkennen und zu speichern.

Ziel:
Den Text in Abschnitte unterteilen.
Jeden Abschnitt mit Sprache und Inhalt speichern.
Python-Code
python
Kopieren
Bearbeiten
def extract_text_by_language():
    ctx = uno.getComponentContext()
    smgr = ctx.ServiceManager
    desktop = smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    doc = desktop.getCurrentComponent()
    
    if not hasattr(doc, "Text"):
        return

    selection = doc.CurrentController.getSelection()
    if not selection:
        return
    
    extracted_segments = []

    for i in range(selection.getCount()):
        text_range = selection.getByIndex(i)
        cursor = text_range.getText().createTextCursorByRange(text_range)
        
        last_language = None
        segment = ""
        
        while cursor.goRight(1, True):
            char_language = cursor.CharLocale.Language
            
            if char_language != last_language and last_language is not None:
                extracted_segments.append((last_language, segment))
                segment = ""
            
            segment += cursor.getString()
            last_language = char_language
        
        if segment:
            extracted_segments.append((last_language, segment))
    
    return extracted_segments

# Test: Ausgabe der extrahierten Textsegmente
segments = extract_text_by_language()
for lang, text in segments:
    print(f"Sprache: {lang}, Text: {text}")
Erklärung:
Geht Zeichen für Zeichen durch den Text.
Falls sich die Sprache ändert, speichert es den bisherigen Text und beginnt eine neue Sequenz.
Gibt eine Liste mit (Sprache, Text) zurück.
Aufgabe 3: Übergabe an Google Translate für TTS
Die Sprachsegmente können nun an Google Translate übergeben werden. Normalerweise könnte man eine URL generieren:

python
Kopieren
Bearbeiten
import webbrowser

def speak_with_google_tts(language, text):
    base_url = "https://translate.google.com/translate_tts"
    params = f"?ie=UTF-8&tl={language}&q={text}&client=tw-ob"
    webbrowser.open(base_url + params)

# Beispiel:
speak_with_google_tts("fr", "Bonjour, comment ça va?")
Herausforderung: Google blockiert automatisierte Anfragen oft. Eine Alternative wäre eine lokale Lösung wie gtts (Google Text-to-Speech):

python
Kopieren
Bearbeiten
from gtts import gTTS
import os

def save_and_play_tts(language, text, filename="output.mp3"):
    tts = gTTS(text, lang=language)
    tts.save(filename)
    os.system(f"mpg321 {filename}")  # Oder `vlc {filename}` für andere Player

# Beispiel:
save_and_play_tts("fr", "Bonjour, comment ça va?")
Aufgabe 4: Aufnahme mit Audacity (optional)
Falls du Audacity für weitere Bearbeitungen nutzen willst, kannst du die generierten MP3-Dateien speichern und später zusammenfügen.

Falls du Audacity per Skript steuern möchtest, kannst du mit dem mod-script-pipe-Plugin arbeiten.

Nächste Schritte
Teste Makro 1: Färbe einen Textabschnitt blau und lasse das Makro laufen – danach sollte die Sprache Französisch sein.
Teste Makro 2: Kopiere den markierten Textbereich und überprüfe, ob er korrekt nach Sprachen getrennt wird.
Teste Google TTS oder gtts: Übergib die extrahierten Texte an eine Sprachausgabe.



ufi
Beiträge: 3
Registriert: Mo 24. Feb 2025, 12:35
Wohnort: Berlin

Re: Sprachausgabe von Texten mit mehrfachen Sprachen im Text

Beitrag von ufi » Do 27. Feb 2025, 12:43

Ich würde bei solch interessanten Fragestellungen tatsächlich mal eine KI befragen.

Hallo D-APP.
Warum eine KI nach einer Lösung fragen, wenn es hier im Forum so wunderbare Kompetenz wie Dich gibt! Vielen Dank für Deine Mühe. Und dann ist alles auch noch so gut beschrieben.
Ich werde nun schrittweise Deine Lösungsvorschläge umsetzen.
Danke auch, dass Du Python gewählt hast, damit komme ich gut zurecht.
Durch Dein Programm lerne ich die Objekt-Umgebung von LO besser zu verstehen und damit zu arbeiten. Vielleicht kann ich irgendwann auch mal auf Anfragen im Forum so antworten, wie Du.
Aber das wird bestimmt noch etwas dauern.

Danke und Grüße
UFI


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten