diff --git a/lib/core/services/api_service.dart b/lib/core/services/api_service.dart index 0ceeb7a..f88cd49 100644 --- a/lib/core/services/api_service.dart +++ b/lib/core/services/api_service.dart @@ -1659,12 +1659,17 @@ class ApiService { Future<({Uint8List bytes, String mimeType})> generateSpeech({ required String text, String? voice, + double? speed, }) async { final textPreview = text.length > 50 ? text.substring(0, 50) : text; _traceApi('Generating speech for text: $textPreview...'); final response = await _dio.post( '/api/v1/audio/speech', - data: {'input': text, if (voice != null) 'voice': voice}, + data: { + 'input': text, + if (voice != null) 'voice': voice, + if (speed != null) 'speed': speed, + }, options: Options(responseType: ResponseType.bytes), ); diff --git a/lib/features/chat/services/text_to_speech_service.dart b/lib/features/chat/services/text_to_speech_service.dart index 0f9ae2e..54e4507 100644 --- a/lib/features/chat/services/text_to_speech_service.dart +++ b/lib/features/chat/services/text_to_speech_service.dart @@ -19,6 +19,7 @@ class TextToSpeechService { TtsEngine _engine = TtsEngine.auto; String? _preferredVoice; String? _serverPreferredVoice; + double _speechRate = 0.5; bool _initialized = false; bool _available = false; bool _voiceConfigured = false; @@ -171,6 +172,7 @@ class TextToSpeechService { }) async { if (_initialized) { _engine = engine; + _speechRate = speechRate; if (deviceVoice != null) { _preferredVoice = deviceVoice; _voiceConfigured = false; @@ -183,6 +185,7 @@ class TextToSpeechService { } _engine = engine; + _speechRate = speechRate; _preferredVoice = deviceVoice; _serverPreferredVoice = serverVoice; _voiceConfigured = false; @@ -352,6 +355,7 @@ class TextToSpeechService { if (engine != null) _engine = engine; if (voiceProvided) _preferredVoice = voiceValue; if (serverVoiceProvided) _serverPreferredVoice = serverVoiceValue; + if (speechRate != null) _speechRate = speechRate; return; } @@ -369,6 +373,7 @@ class TextToSpeechService { await _tts.setVolume(volume); } if (speechRate != null) { + _speechRate = speechRate; await _tts.setSpeechRate(speechRate); } if (pitch != null) { @@ -645,7 +650,11 @@ class TextToSpeechService { String? voice, int session, ) async { - return await _api!.generateSpeech(text: text, voice: voice); + return await _api!.generateSpeech( + text: text, + voice: voice, + speed: _speechRate, + ); } Future _onAudioComplete() async { diff --git a/lib/features/profile/views/app_customization_page.dart b/lib/features/profile/views/app_customization_page.dart index 2236d44..a32707d 100644 --- a/lib/features/profile/views/app_customization_page.dart +++ b/lib/features/profile/views/app_customization_page.dart @@ -944,7 +944,7 @@ class AppCustomizationPage extends ConsumerWidget { value: settings.ttsSpeechRate, min: 0.25, max: 2.0, - divisions: 7, + divisions: 35, label: '${(settings.ttsSpeechRate * 100).round()}%', onChanged: (value) => ref .read(appSettingsProvider.notifier)