From 939e25a04f7bc26bdc44371a869233fa36dc5b95 Mon Sep 17 00:00:00 2001 From: Myst <1592048+LeMyst@users.noreply.github.com> Date: Tue, 20 Jan 2026 12:13:00 +0100 Subject: [PATCH] Add option to replace underscores in author names for TTS Introduces a new setting to replace underscores with spaces in author names when generating TTS prelude. Adds a toggle in the TTS settings screen and persists the setting in the TtsModel. --- lib/models/tts.dart | 22 +++++++++++++++++++++- lib/screens/settings/tts.dart | 7 +++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/models/tts.dart b/lib/models/tts.dart index b92706b7..5df6ebc4 100644 --- a/lib/models/tts.dart +++ b/lib/models/tts.dart @@ -54,6 +54,7 @@ class TtsModel extends ChangeNotifier { var _isBotMuted = false; var _isEmoteMuted = false; var _isPreludeMuted = false; + var _isUnderscoreReplacementEnabled = false; var _speed = Platform.isAndroid ? 0.8 : 0.395; var _pitch = 1.0; var _mode = TtsMode.disabled; @@ -144,7 +145,13 @@ class TtsModel extends ChangeNotifier { if (text.trim().isEmpty) { return ""; } - final author = model.author.displayName ?? model.author.login; + var author = model.author.displayName ?? model.author.login; + if (_isUnderscoreReplacementEnabled) { + author = author + .replaceAll("_", " ") + .replaceAll(RegExp(r'\s+'), ' ') + .trim(); + } if (!includeAuthorPrelude || isPreludeMuted) { return text; } @@ -328,6 +335,15 @@ class TtsModel extends ChangeNotifier { notifyListeners(); } + bool get isUnderscoreReplacementEnabled { + return _isUnderscoreReplacementEnabled; + } + + set isUnderscoreReplacementEnabled(bool value) { + _isUnderscoreReplacementEnabled = value; + notifyListeners(); + } + bool get isCloudTtsEnabled { return _isCloudTtsEnabled; } @@ -509,6 +525,9 @@ class TtsModel extends ChangeNotifier { if (json['isPreludeMuted'] != null) { _isPreludeMuted = json['isPreludeMuted']; } + if (json['isUnderscoreReplacementEnabled'] != null) { + _isUnderscoreReplacementEnabled = json['isUnderscoreReplacementEnabled']; + } if (json['isRandomVoiceEnabled'] != null) { _isRandomVoiceEnabled = json['isRandomVoiceEnabled']; } @@ -534,6 +553,7 @@ class TtsModel extends ChangeNotifier { "isBotMuted": isBotMuted, "isEmoteMuted": isEmoteMuted, "isPreludeMuted": isPreludeMuted, + "isUnderscoreReplacementEnabled": isUnderscoreReplacementEnabled, "isRandomVoiceEnabled": isRandomVoiceEnabled, "language": language.languageCode, "pitch": pitch, diff --git a/lib/screens/settings/tts.dart b/lib/screens/settings/tts.dart index 0f7e7538..4b5751fc 100644 --- a/lib/screens/settings/tts.dart +++ b/lib/screens/settings/tts.dart @@ -264,6 +264,13 @@ class TextToSpeechScreen extends StatelessWidget { model.isPreludeMuted = value; }, ), + SwitchListTile.adaptive( + title: const Text("Replace underscores with spaces in names"), + value: model.isUnderscoreReplacementEnabled, + onChanged: (value) { + model.isUnderscoreReplacementEnabled = value; + }, + ), SwitchListTile.adaptive( title: const Text("Subscribers only"), value: model.isSubscribersOnly,