Quick Speech Beispiel

Das Quick Speech-Beispiel liest einen vom Benutzer eingegebenen Text vor.

Das Quick Speech-Beispiel zeigt, wie der Typ TextToSpeech in einer Anwendung verwendet werden kann Qt Quick Anwendung zum Vorlesen von Text und zur Steuerung der Sprache verwendet werden kann.

Das Beispiel verwendet Qt Quick Controls um Steuerelemente für die Tonhöhe, Lautstärke und Geschwindigkeit der Sprache bereitzustellen. Außerdem kann der Benutzer eine Engine, eine Sprache und eine Stimme auswählen.

Initialisierung eines TextToSpeech

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

Switch Cases werden verwendet, um das Label statusLabel in der Fußzeile zu aktualisieren.

        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 sie gesprochen werden

Das TextArea input wird verwendet, um den einzugebenden Text und das onSayingWord -Signal als Auslöser zu erhalten und um die Position für die Hervorhebung von Wörtern zu kennen, wenn diese gesprochen werden.

        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 Sprache

Button Typen werden mit einem RowLayout angeordnet und zur Steuerung des TextToSpeech tts konfiguriert.

Die Sprechtaste

Es wird ein Button mit der Bezeichnung "Sprechen" erstellt. Sie ist aktiviert, wenn die Zustandseigenschaft von tts entweder Paused oder Ready ist.

        RowLayout {
            Button {
                text: qsTr("Speak")
                enabled: [TextToSpeech.Paused, TextToSpeech.Ready].includes(tts.state)

Wenn die Schaltfläche angeklickt wird, werden die verfügbaren Stimmen auf den Zielgeräten abgerufen, und tts.voice wird auf die aktuell ausgewählte Stimme von voicesComboBox gesetzt. Dann wird TextToSpeech::say() aufgerufen und der Text in inputbox übergeben.

                onClicked: {
//! [say0]
                    let voices = tts.availableVoices()
                    tts.voice = voices[voicesComboBox.currentIndex]
//! [say1]
                    tts.say(input.text)
                }

Die Schaltflächen "Pause", "Fortsetzen" und "Stopp

Diese Schaltflächen sind ähnlich implementiert wie die Schaltfläche Speak:

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

Auswählen von Text-in-Sprache-Optionen

Unter GridLayout werden die Steuerelemente und Beschriftungen für die Auswahl von Motor, Gebietsschema, Stimme, Lautstärke, Tonhöhe und Geschwindigkeit für die Text-to-Speech-Synthese angeordnet.

Auswahl von Motor, Gebietsschema und Stimme

Eine Gruppe von ComboBox Komponenten wird für die Auswahl dieser Parameter verwendet.

Für die Auswahl der Engine ComboBox wird tts.availableEngines() als Modell verwendet.

Die onActivated löst die Zuweisung von tts.engine an den aktuellen Text im aktuellen Index der ComboBoxes aus.

            Text {
                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 Codeschnipsel zeigen, dass die verfügbaren Gebietsschemata und Stimmen an dieser Stelle ebenfalls aktualisiert werden, da sie von der ausgewählten Engine abhängig sind. Diese Funktionen werden in einem der folgenden Abschnitte behandelt.

localesComboBox ist auf die gleiche Weise implementiert wie engineComboBox, jedoch ohne die verfügbaren Engines zu aktualisieren.

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

Diese Steuerelemente werden mit Sliders wie folgt implementiert:

            Text {
                text: qsTr("Volume:")
            }
            Slider {
                id: volumeSlider
                from: 0
                to: 1.0
                stepSize: 0.2
                value: 0.8
                Layout.fillWidth: true
            }
            Text {
                text: qsTr("Pitch:")
            }
            Slider {
                id: pitchSlider
                from: -1.0
                to: 1.0
                stepSize: 0.5
                value: 0
                Layout.fillWidth: true
            }
            Text {
                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

Durch die Verwendung des Signals Component.onCompleted wird Folgendes getan, sobald die Wurzel 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 Zustand von tts wird signalisiert.
    Component.onCompleted: {
        enginesComboBox.currentIndex = tts.availableEngines().indexOf(tts.engine)
        // some engines initialize asynchronously
        if (tts.state == TextToSpeech.Ready) {
            engineReady()

Die Funktionen updateLocales() und updateVoice(), die in der gesamten Anwendung verwendet werden, 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

Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.

Beispielprojekt @ code.qt.io

© 2025 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.