feat: Add Text-to-Speech settings and customization options

- Introduced new preference keys for TTS settings: voice, speech rate, pitch, and volume.
- Updated SettingsService to handle TTS settings and persist them.
- Enhanced AppSettings to include TTS-related properties.
- Implemented TTS settings UI in AppCustomizationPage, allowing users to select voice and adjust speech parameters.
- Added localization support for TTS settings in multiple languages.
This commit is contained in:
cogwheel0
2025-10-17 14:40:44 +05:30
parent c6acfa68e1
commit 6c81d68e59
18 changed files with 1185 additions and 9 deletions

View File

@@ -316,6 +316,19 @@
"chatSettings": "Chat",
"sendOnEnter": "Mit Enter senden",
"sendOnEnterDescription": "Enter sendet (Soft-Tastatur). Cmd/Ctrl+Enter ebenfalls verfügbar",
"ttsSettings": "Text zu Sprache",
"ttsVoice": "Stimme",
"ttsSpeechRate": "Sprechgeschwindigkeit",
"ttsPitch": "Tonhöhe",
"ttsVolume": "Lautstärke",
"ttsPreview": "Stimme vorschau",
"ttsSystemDefault": "Systemstandard",
"ttsSelectVoice": "Stimme auswählen",
"ttsPreviewText": "Dies ist eine Vorschau der ausgewählten Stimme.",
"ttsNoVoicesAvailable": "Keine Stimmen verfügbar",
"ttsVoicesForLanguage": "{language}-Stimmen",
"ttsOtherVoices": "Andere Sprachen",
"error": "Fehler",
"display": "Anzeige",
"realtime": "Echtzeit",
"transportMode": "Transportmodus",

View File

@@ -650,6 +650,40 @@
"@sendOnEnterDescription": {
"description": "Explanation of how the Send on Enter toggle behaves."
},
"ttsSettings": "Text to Speech",
"@ttsSettings": {"description": "Section header for TTS-related customization options."},
"ttsVoice": "Voice",
"@ttsVoice": {"description": "Title for voice selection tile."},
"ttsSpeechRate": "Speech Rate",
"@ttsSpeechRate": {"description": "Title for speech rate slider."},
"ttsPitch": "Pitch",
"@ttsPitch": {"description": "Title for pitch slider."},
"ttsVolume": "Volume",
"@ttsVolume": {"description": "Title for volume slider."},
"ttsPreview": "Preview Voice",
"@ttsPreview": {"description": "Title for preview button."},
"ttsSystemDefault": "System Default",
"@ttsSystemDefault": {"description": "Label for system default voice option."},
"ttsSelectVoice": "Select Voice",
"@ttsSelectVoice": {"description": "Title for voice picker bottom sheet."},
"ttsPreviewText": "This is a preview of the selected voice.",
"@ttsPreviewText": {"description": "Sample text spoken during voice preview."},
"ttsNoVoicesAvailable": "No voices available",
"@ttsNoVoicesAvailable": {"description": "Error message when no TTS voices can be found."},
"ttsVoicesForLanguage": "{language} Voices",
"@ttsVoicesForLanguage": {
"description": "Section header for voices matching the app language",
"placeholders": {
"language": {
"type": "String",
"example": "EN"
}
}
},
"ttsOtherVoices": "Other Languages",
"@ttsOtherVoices": {"description": "Section header for voices in other languages."},
"error": "Error",
"@error": {"description": "Generic error label."},
"display": "Display",
"@display": {"description": "Section header for visual and layout related settings."},
"realtime": "Realtime",

View File

@@ -309,6 +309,19 @@
"chatSettings": "Conversación",
"sendOnEnter": "Enviar con Enter",
"sendOnEnterDescription": "Enter envía (teclado virtual). Cmd/Ctrl+Enter también disponible",
"ttsSettings": "Texto a voz",
"ttsVoice": "Voz",
"ttsSpeechRate": "Velocidad de voz",
"ttsPitch": "Tono",
"ttsVolume": "Volumen",
"ttsPreview": "Vista previa de voz",
"ttsSystemDefault": "Predeterminado del sistema",
"ttsSelectVoice": "Seleccionar voz",
"ttsPreviewText": "Esta es una vista previa de la voz seleccionada.",
"ttsNoVoicesAvailable": "No hay voces disponibles",
"ttsVoicesForLanguage": "Voces de {language}",
"ttsOtherVoices": "Otros idiomas",
"error": "Error",
"display": "Visualización",
"realtime": "Tiempo real",
"transportMode": "Modo de transporte",

View File

@@ -316,6 +316,19 @@
"chatSettings": "Discussion",
"sendOnEnter": "Envoyer avec Entrée",
"sendOnEnterDescription": "Entrée envoie (clavier logiciel). Cmd/Ctrl+Entrée aussi disponible",
"ttsSettings": "Synthèse vocale",
"ttsVoice": "Voix",
"ttsSpeechRate": "Vitesse de parole",
"ttsPitch": "Hauteur",
"ttsVolume": "Volume",
"ttsPreview": "Aperçu de la voix",
"ttsSystemDefault": "Système par défaut",
"ttsSelectVoice": "Sélectionner la voix",
"ttsPreviewText": "Ceci est un aperçu de la voix sélectionnée.",
"ttsNoVoicesAvailable": "Aucune voix disponible",
"ttsVoicesForLanguage": "Voix {language}",
"ttsOtherVoices": "Autres langues",
"error": "Erreur",
"display": "Affichage",
"realtime": "Temps réel",
"transportMode": "Mode de transport",

View File

@@ -316,6 +316,19 @@
"chatSettings": "Chat",
"sendOnEnter": "Invia con Invio",
"sendOnEnterDescription": "Invio invia (tastiera software). Cmd/Ctrl+Invio disponibile",
"ttsSettings": "Sintesi vocale",
"ttsVoice": "Voce",
"ttsSpeechRate": "Velocità di sintesi vocale",
"ttsPitch": "Tonalità",
"ttsVolume": "Volume",
"ttsPreview": "Anteprima voce",
"ttsSystemDefault": "Predefinito del sistema",
"ttsSelectVoice": "Seleziona voce",
"ttsPreviewText": "Questa è un'anteprima della voce selezionata.",
"ttsNoVoicesAvailable": "Nessuna voce disponibile",
"ttsVoicesForLanguage": "Voci {language}",
"ttsOtherVoices": "Altre lingue",
"error": "Errore",
"display": "Schermo",
"realtime": "Tempo reale",
"transportMode": "Modalità di trasporto",

View File

@@ -1718,6 +1718,84 @@ abstract class AppLocalizations {
/// **'Enter sends (soft keyboard). Cmd/Ctrl+Enter also available'**
String get sendOnEnterDescription;
/// Section header for TTS-related customization options.
///
/// In en, this message translates to:
/// **'Text to Speech'**
String get ttsSettings;
/// Title for voice selection tile.
///
/// In en, this message translates to:
/// **'Voice'**
String get ttsVoice;
/// Title for speech rate slider.
///
/// In en, this message translates to:
/// **'Speech Rate'**
String get ttsSpeechRate;
/// Title for pitch slider.
///
/// In en, this message translates to:
/// **'Pitch'**
String get ttsPitch;
/// Title for volume slider.
///
/// In en, this message translates to:
/// **'Volume'**
String get ttsVolume;
/// Title for preview button.
///
/// In en, this message translates to:
/// **'Preview Voice'**
String get ttsPreview;
/// Label for system default voice option.
///
/// In en, this message translates to:
/// **'System Default'**
String get ttsSystemDefault;
/// Title for voice picker bottom sheet.
///
/// In en, this message translates to:
/// **'Select Voice'**
String get ttsSelectVoice;
/// Sample text spoken during voice preview.
///
/// In en, this message translates to:
/// **'This is a preview of the selected voice.'**
String get ttsPreviewText;
/// Error message when no TTS voices can be found.
///
/// In en, this message translates to:
/// **'No voices available'**
String get ttsNoVoicesAvailable;
/// Section header for voices matching the app language
///
/// In en, this message translates to:
/// **'{language} Voices'**
String ttsVoicesForLanguage(String language);
/// Section header for voices in other languages.
///
/// In en, this message translates to:
/// **'Other Languages'**
String get ttsOtherVoices;
/// Generic error label.
///
/// In en, this message translates to:
/// **'Error'**
String get error;
/// Section header for visual and layout related settings.
///
/// In en, this message translates to:

View File

@@ -895,6 +895,48 @@ class AppLocalizationsDe extends AppLocalizations {
String get sendOnEnterDescription =>
'Enter sendet (Soft-Tastatur). Cmd/Ctrl+Enter ebenfalls verfügbar';
@override
String get ttsSettings => 'Text zu Sprache';
@override
String get ttsVoice => 'Stimme';
@override
String get ttsSpeechRate => 'Sprechgeschwindigkeit';
@override
String get ttsPitch => 'Tonhöhe';
@override
String get ttsVolume => 'Lautstärke';
@override
String get ttsPreview => 'Stimme vorschau';
@override
String get ttsSystemDefault => 'Systemstandard';
@override
String get ttsSelectVoice => 'Stimme auswählen';
@override
String get ttsPreviewText =>
'Dies ist eine Vorschau der ausgewählten Stimme.';
@override
String get ttsNoVoicesAvailable => 'Keine Stimmen verfügbar';
@override
String ttsVoicesForLanguage(String language) {
return '$language-Stimmen';
}
@override
String get ttsOtherVoices => 'Andere Sprachen';
@override
String get error => 'Fehler';
@override
String get display => 'Anzeige';

View File

@@ -887,6 +887,47 @@ class AppLocalizationsEn extends AppLocalizations {
String get sendOnEnterDescription =>
'Enter sends (soft keyboard). Cmd/Ctrl+Enter also available';
@override
String get ttsSettings => 'Text to Speech';
@override
String get ttsVoice => 'Voice';
@override
String get ttsSpeechRate => 'Speech Rate';
@override
String get ttsPitch => 'Pitch';
@override
String get ttsVolume => 'Volume';
@override
String get ttsPreview => 'Preview Voice';
@override
String get ttsSystemDefault => 'System Default';
@override
String get ttsSelectVoice => 'Select Voice';
@override
String get ttsPreviewText => 'This is a preview of the selected voice.';
@override
String get ttsNoVoicesAvailable => 'No voices available';
@override
String ttsVoicesForLanguage(String language) {
return '$language Voices';
}
@override
String get ttsOtherVoices => 'Other Languages';
@override
String get error => 'Error';
@override
String get display => 'Display';

View File

@@ -903,6 +903,47 @@ class AppLocalizationsFr extends AppLocalizations {
String get sendOnEnterDescription =>
'Entrée envoie (clavier logiciel). Cmd/Ctrl+Entrée aussi disponible';
@override
String get ttsSettings => 'Synthèse vocale';
@override
String get ttsVoice => 'Voix';
@override
String get ttsSpeechRate => 'Vitesse de parole';
@override
String get ttsPitch => 'Hauteur';
@override
String get ttsVolume => 'Volume';
@override
String get ttsPreview => 'Aperçu de la voix';
@override
String get ttsSystemDefault => 'Système par défaut';
@override
String get ttsSelectVoice => 'Sélectionner la voix';
@override
String get ttsPreviewText => 'Ceci est un aperçu de la voix sélectionnée.';
@override
String get ttsNoVoicesAvailable => 'Aucune voix disponible';
@override
String ttsVoicesForLanguage(String language) {
return 'Voix $language';
}
@override
String get ttsOtherVoices => 'Autres langues';
@override
String get error => 'Erreur';
@override
String get display => 'Affichage';

View File

@@ -892,6 +892,47 @@ class AppLocalizationsIt extends AppLocalizations {
String get sendOnEnterDescription =>
'Invio invia (tastiera software). Cmd/Ctrl+Invio disponibile';
@override
String get ttsSettings => 'Sintesi vocale';
@override
String get ttsVoice => 'Voce';
@override
String get ttsSpeechRate => 'Velocità di sintesi vocale';
@override
String get ttsPitch => 'Tonalità';
@override
String get ttsVolume => 'Volume';
@override
String get ttsPreview => 'Anteprima voce';
@override
String get ttsSystemDefault => 'Predefinito del sistema';
@override
String get ttsSelectVoice => 'Seleziona voce';
@override
String get ttsPreviewText => 'Questa è un\'anteprima della voce selezionata.';
@override
String get ttsNoVoicesAvailable => 'Nessuna voce disponibile';
@override
String ttsVoicesForLanguage(String language) {
return 'Voci $language';
}
@override
String get ttsOtherVoices => 'Altre lingue';
@override
String get error => 'Errore';
@override
String get display => 'Schermo';

View File

@@ -309,6 +309,19 @@
"chatSettings": "Chat",
"sendOnEnter": "Verzenden met Enter",
"sendOnEnterDescription": "Enter verzendt (softtoetsenbord). Cmd/Ctrl+Enter ook beschikbaar",
"ttsSettings": "Tekst naar spraak",
"ttsVoice": "Stem",
"ttsSpeechRate": "Spraaksnelheid",
"ttsPitch": "Toonhoogte",
"ttsVolume": "Volume",
"ttsPreview": "Stemvoorbeeld",
"ttsSystemDefault": "Systeemstandaard",
"ttsSelectVoice": "Selecteer stem",
"ttsPreviewText": "Dit is een voorbeeld van de geselecteerde stem.",
"ttsNoVoicesAvailable": "Geen stemmen beschikbaar",
"ttsVoicesForLanguage": "{language} stemmen",
"ttsOtherVoices": "Andere talen",
"error": "Fout",
"display": "Weergave",
"realtime": "Realtime",
"transportMode": "Transportmodus",

View File

@@ -309,6 +309,19 @@
"chatSettings": "Чат",
"sendOnEnter": "Отправка по Enter",
"sendOnEnterDescription": "Enter отправляет (программная клавиатура). Также доступно Cmd/Ctrl+Enter",
"ttsSettings": "Преобразование текста в речь",
"ttsVoice": "Голос",
"ttsSpeechRate": "Скорость речи",
"ttsPitch": "Высота тона",
"ttsVolume": "Громкость",
"ttsPreview": "Предпросмотр голоса",
"ttsSystemDefault": "Системное значение по умолчанию",
"ttsSelectVoice": "Выбрать голос",
"ttsPreviewText": "Это предварительный просмотр выбранного голоса.",
"ttsNoVoicesAvailable": "Нет доступных голосов",
"ttsVoicesForLanguage": "Голоса {language}",
"ttsOtherVoices": "Другие языки",
"error": "Ошибка",
"display": "Отображение",
"realtime": "Реальное время",
"transportMode": "Режим транспорта",

View File

@@ -309,6 +309,19 @@
"chatSettings": "对话",
"sendOnEnter": "回车发送",
"sendOnEnterDescription": "回车发送软键盘。Cmd/Ctrl+Enter 也可用",
"ttsSettings": "文本转语音",
"ttsVoice": "语音",
"ttsSpeechRate": "语速",
"ttsPitch": "音调",
"ttsVolume": "音量",
"ttsPreview": "预览语音",
"ttsSystemDefault": "系统默认",
"ttsSelectVoice": "选择语音",
"ttsPreviewText": "这是所选语音的预览。",
"ttsNoVoicesAvailable": "没有可用的语音",
"ttsVoicesForLanguage": "{language} 语音",
"ttsOtherVoices": "其他语言",
"error": "错误",
"display": "显示",
"realtime": "实时",
"transportMode": "传输模式",