rbutilqt: QtTTS: Pick a sane TTS engine/backend by default

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Fri, 10 Jul 2026 08:08:49 -0400
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 931fbb6734426ee37a9857372d6ad1dc73f704e4
Author: Solomon Peachy <[email protected]>
Date:   Thu Jul 9 20:36:16 2026 -0400

    rbutilqt: QtTTS:  Pick a sane TTS engine/backend by default
    
     * Ignore 'mock' tts engine
     * Must support synthesizing to a file (ie not just "speaking")
     * Don't claim 'speak' capabilities if the chosen engine does not
    
    Change-Id: Id5fd224466ed62df5af837256fa66a340672d167

diff --git a/utils/rbutilqt/base/ttsqt.cpp b/utils/rbutilqt/base/ttsqt.cpp
index 88aa2ee90e..f4070ddd77 100644
--- a/utils/rbutilqt/base/ttsqt.cpp
+++ b/utils/rbutilqt/base/ttsqt.cpp
@@ -74,8 +74,7 @@ TTSStatus TTSQt::voice(const QString& text, const QString& wavfile, QString* err
 
     if (wavfile.isEmpty()) {
         m_tts->say(text);
-    }
-    else {
+    } else {
         m_audioData.clear();
         m_format = QAudioFormat();
 
@@ -128,14 +127,23 @@ bool TTSQt::start(QString *errStr)
         return false;
     }
 
-    // XXX figure out the "best" engine.  Ignore 'mock' and
-    // any anything that doesn't support file output!
+    /* Build list of engines that support synthesis (ie not just "speaking") */
+    for (const QString &str : m_tts->availableEngines()) {
+        if (str == "mock")
+            continue;
+        m_tts->setEngine(str);
+        if (m_tts->engineCapabilities() & QTextToSpeech::Capability::Synthesize)
+            m_engines << str;
+    }
 
-    if (!(m_tts->engineCapabilities() & QTextToSpeech::Capability::Synthesize)) {
-        LOG_ERROR() << "QT TTS engine '" << m_tts->engine() << " does not support synthesis to file";
+    if (m_engines.isEmpty()) {
+        if (errStr) *errStr = "No TTS suitable engines available on this system";
         return false;
     }
 
+    /* Default to first suitable engine */
+    m_tts->setEngine(m_engines.at(0));
+
     LOG_INFO() << "QT TTS engine: " << m_tts->engine();
 
     return true;
@@ -161,7 +169,7 @@ bool TTSQt::configOk()
 
 void TTSQt::generateSettings()
 {
-    // TODO
+    // TODO -- enumerate engines (m_engines), locale, and voice lists.
 }
 
 void TTSQt::saveSettings()
@@ -171,7 +179,12 @@ void TTSQt::saveSettings()
 
 TTSBase::Capabilities TTSQt::capabilities()
 {
-    return TTSBase::CanSpeak | TTSBase::RunInParallel;
+    TTSBase::Capabilities caps = TTSBase::RunInParallel;
+
+    if (m_tts->engineCapabilities() & QTextToSpeech::Capability::Speak)
+        caps |= TTSBase::CanSpeak;
+
+    return caps;
 }
 
 bool TTSQt::writeWavFile(const QString &filePath, const QByteArray &audioData, const QAudioFormat &format)
diff --git a/utils/rbutilqt/base/ttsqt.h b/utils/rbutilqt/base/ttsqt.h
index 2c19aac239..54e5fb31ef 100644
--- a/utils/rbutilqt/base/ttsqt.h
+++ b/utils/rbutilqt/base/ttsqt.h
@@ -46,6 +46,7 @@ private:
     QTextToSpeech *m_tts = nullptr;
     QByteArray m_audioData;
     QAudioFormat m_format;
+    QStringList m_engines;
 
     // Helper to write raw PCM data to a WAV file
     bool writeWavFile(const QString &filePath, const QByteArray &audioData, const QAudioFormat &format);
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs