Auf dieser Seite

Beispiel für „Quick Speech“

Das „Quick Speech“-Beispiel liest vom Benutzer bereitgestellten Text vor.

Screenshot, der ein Tool zur Text-zu-Sprache-Umwandlung zeigt, mit Optionen zum Ändern der Engine, der Ländereinstellung, der Stimme, der Lautstärke, der Tonhöhe und der Sprechgeschwindigkeit

Das „Quick Speech“-Beispiel veranschaulicht, wie der Typ „ TextToSpeech “ in einer Qt Quick Anwendung zum Vorlesen von Text und zur Steuerung der Sprachausgabe eingesetzt werden kann.

Das Beispiel verwendet Qt Quick Controls , um Steuerelemente für Tonhöhe, Lautstärke und Sprechgeschwindigkeit bereitzustellen. Außerdem ermöglicht es dem Benutzer, eine Engine, eine Sprache und eine Stimme auszuwählen.

Initialisierung eines TextToSpeech-Objekts

Zunächst initialisieren wir das Text-to-Speech-Objekt ` tts`:

    TextToSpeech {
        id: tts
        volume: volumeSlider.value
        pitch: pitchSlider.value
        rate: rateSlider.value

Abrufen des Status

Mithilfe von „Switch“-Anweisungen wird das Label „ statusLabel “ in der Fußzeile aktualisiert.

        onStateChanged: updateStateLabel(state)

        function updateStateLabel(state)
        {
            switch (state) {
                case TextToSpeech.Ready:
                    statusLabel.text = qsTr("Ready")
                    break
                case TextToSpeech.Speaking:
                    statusLabel.text = qsTr("Speaking")
                    break
                case TextToSpeech.Paused:
                    statusLabel.text = qsTr("Paused...")
                    break
                case TextToSpeech.Error:
                    statusLabel.text = qsTr("Error!")
                    break
            }
        }

Hervorheben von Wörtern während der Wiedergabe

Das „ TextArea “ input wird verwendet, um den einzugebenden Text und das Signal „ onSayingWord “ als Auslöser abzurufen sowie um die Position zu ermitteln, an der Wörter während der Wiedergabe hervorgehoben werden sollen.

        onSayingWord: (word, id, start, length)=> {
            input.select(start, start + length)
        }

Die „ TextArea “ input wird hier deklariert:

    ColumnLayout {
        anchors.fill: parent
        anchors.margins: 8
        id: inputForm

        TextArea {
            id: input
            wrapMode: TextEdit.WordWrap
            text: qsTr("Hello, world!")
            Layout.fillWidth: true
            Layout.minimumHeight: implicitHeight
            font.pointSize: 24
        }

Steuerung der Sprachausgabe

Button Die Typen werden mit einem „ RowLayout “ angeordnet und so konfiguriert, dass sie das „ TextToSpeech “ „ tts “ steuern.

Die Schaltfläche „Speak“

Es wird ein „ Button “ mit der Bezeichnung „Speak“ erstellt. Er ist aktiviert, wenn die State-Eigenschaft von „ tts “ entweder „ Paused “ oder „ Ready “ ist. Wenn auf die Schaltfläche geklickt wird, werden die auf den Zielgeräten verfügbaren Stimmen abgerufen, und „ tts.voice “ wird auf die aktuell ausgewählte Stimme von „ voicesComboBox “ gesetzt. Anschließend wird „ TextToSpeech::say()“ aufgerufen, wobei der Text in „ inputbox “ übergeben wird.

        RowLayout {
            Button {
                text: qsTr("Speak")
                enabled: [TextToSpeech.Paused, TextToSpeech.Ready].includes(tts.state)
                onClicked: {
                    let voices = tts.availableVoices()
                    tts.voice = voices[voicesComboBox.currentIndex]
                    tts.say(input.text)
                }
            }

Die Schaltflächen „Pause“, „Fortsetzen“ und „Stopp“

Diese Schaltflächen werden ähnlich wie die Schaltfläche „ Speak “ implementiert:

            Button {
                text: qsTr("Pause")
                enabled: tts.state == TextToSpeech.Speaking
                onClicked: tts.pause()
                visible: tts.engineCapabilities & TextToSpeech.Capabilities.PauseResume
            }
            Button {
                text: qsTr("Resume")
                enabled: tts.state == TextToSpeech.Paused
                onClicked: tts.resume()
                visible: tts.engineCapabilities & TextToSpeech.Capabilities.PauseResume
            }
            Button {
                text: qsTr("Stop")
                enabled: [TextToSpeech.Speaking, TextToSpeech.Paused].includes(tts.state)
                onClicked: tts.stop()
            }

Auswahl der Text-to-Speech-Optionen

Ein „ GridLayout “ wird verwendet, um die Steuerelemente und Beschriftungen für die Auswahl der Optionen „Engine“, „Locale“, „Stimme“, „Lautstärke“, „Tonhöhe“ und „Sprechgeschwindigkeit“ für die Text-zu-Sprache-Synthese anzuordnen.

Auswahl von Engine, Sprachregion und Stimme

Zur Auswahl dieser Parameter wird eine Gruppe von „ ComboBox “-Komponenten verwendet.

Für das „ ComboBox “ zur Engine-Auswahl wird „ tts.availableEngines() “ als Vorlage verwendet.

Die „ onActivated “ veranlasst die Zuweisung des aktuellen Textes am aktuellen Index der ComboBox an „tts.engine“.

            Label {
                text: qsTr("Engine:")
            }
            ComboBox {
                id: enginesComboBox
                Layout.fillWidth: true
                model: tts.availableEngines()
                onActivated: {
                    tts.engine = textAt(currentIndex)
                    updateLocales()
                    updateVoices()
                }
            }

Die letzten beiden Zeilen im obigen Codeausschnitt zeigen, dass an dieser Stelle auch die verfügbaren Sprachumgebungen und Stimmen aktualisiert werden, da diese von der ausgewählten Engine abhängen. Diese Funktionen werden in einem folgenden Abschnitt behandelt.

Die Methode „ localesComboBox “ ist genauso implementiert wie „ engineComboBox “, aktualisiert jedoch nicht die verfügbaren Engines.

            Label {
                text: qsTr("Locale:")
            }
            ComboBox {
                id: localesComboBox
                Layout.fillWidth: true
                onActivated: {
                    let locales = tts.availableLocales()
                    tts.locale = locales[currentIndex]
                    updateVoices()
                }
            }
            Label {
                text: qsTr("Voice:")
            }
            ComboBox {
                id: voicesComboBox
                Layout.fillWidth: true
            }
Auswahl von Lautstärke, Tonhöhe und Sprechgeschwindigkeit

Diese Steuerelemente werden mit „ Sliders “ wie folgt implementiert:

            Label {
                text: qsTr("Volume:")
            }
            Slider {
                id: volumeSlider
                from: 0
                to: 1.0
                stepSize: 0.2
                value: 0.8
                Layout.fillWidth: true
            }
            Label {
                text: qsTr("Pitch:")
            }
            Slider {
                id: pitchSlider
                from: -1.0
                to: 1.0
                stepSize: 0.5
                value: 0
                Layout.fillWidth: true
            }
            Label {
                text: qsTr("Rate:")
            }
            Slider {
                id: rateSlider
                from: -1.0
                to: 1.0
                stepSize: 0.5
                value: 0
                Layout.fillWidth: true
            }
        }
    }

Aktualisierung der verfügbaren Optionen

Mithilfe des Signals „ Component.onCompleted “ wird Folgendes ausgeführt, sobald die Stammkomponente „ ApplicationWindow “ instanziiert wurde.

  • Der Index „ enginesComboBox “ wird auf die aktuell eingestellte Engine von „ tts “ gesetzt.
  • Die verfügbaren Sprachumgebungen und Stimmen werden aktualisiert.
  • Der aktuelle Status von ` tts ` wird gemeldet.
    Component.onCompleted: {
        enginesComboBox.currentIndex = tts.availableEngines().indexOf(tts.engine)
        // some engines initialize asynchronously
        if (tts.state == TextToSpeech.Ready) {
            engineReady()

Die in der gesamten Anwendung verwendeten Funktionen „ updateLocales() “ und „ updateVoice() “ sind wie folgt implementiert:

        } else {
            tts.stateChanged.connect(root.engineReady)
        }

        tts.updateStateLabel(tts.state)
    }

    function engineReady() {
        tts.stateChanged.disconnect(root.engineReady)
        if (tts.state != TextToSpeech.Ready) {
            tts.updateStateLabel(tts.state)
            return;
        }
        updateLocales()
        updateVoices()
    }

    function updateLocales() {
        let allLocales = tts.availableLocales().map((locale) => locale.nativeLanguageName)
        let currentLocaleIndex = allLocales.indexOf(tts.locale.nativeLanguageName)
        localesComboBox.model = allLocales
        localesComboBox.currentIndex = currentLocaleIndex
    }

    function updateVoices() {
        voicesComboBox.model = tts.availableVoices().map((voice) => voice.name)
        let indexOfVoice = tts.availableVoices().indexOf(tts.voice)
        voicesComboBox.currentIndex = indexOfVoice

Ausführen des Beispiels

Sie können das Beispiel wie folgt ausführen:

Beispielprojekt @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.