Update Saqel Platform: 2026-09-05 22:17:15

This commit is contained in:
Hamza-Ayed
2026-09-05 22:17:15 +03:00
parent 68265a5bc6
commit 0e5be7adbb
6 changed files with 3322 additions and 885 deletions
@@ -49,30 +49,49 @@ class EnglishReadingService {
if (_isInitialized) return;
try {
await _tts.setLanguage('en-US');
await _tts.setSpeechRate(0.44); // Standard natural reading speed for learners
await _tts.setLanguage('en-GB');
await _tts.setSpeechRate(0.40); // British English natural learner cadence
await _tts.setVolume(1.0);
await _tts.setPitch(1.0);
// Attempt to find and select enhanced/natural high-fidelity voice
// Select highest fidelity British English (en-GB / RP) voice
try {
final voices = await _tts.getVoices;
if (voices is List) {
Map? preferredVoice;
Map? fallbackGbVoice;
for (var v in voices) {
if (v is Map) {
final name = (v['name'] ?? '').toString().toLowerCase();
final locale = (v['locale'] ?? '').toString().toLowerCase();
if ((locale.contains('en-us') || locale.contains('en_us')) &&
(name.contains('natural') || name.contains('enhanced') || name.contains('samantha') || name.contains('neural'))) {
await _tts.setVoice({'name': v['name'], 'locale': v['locale']});
AppLogger.log('Selected high-quality natural voice: ${v['name']}', tag: 'ENGLISH_AUDIO');
break;
if (locale.contains('en-gb') || locale.contains('en_gb')) {
fallbackGbVoice ??= v;
if (name.contains('natural') ||
name.contains('enhanced') ||
name.contains('neural') ||
name.contains('premium') ||
name.contains('oliver') ||
name.contains('george') ||
name.contains('serena') ||
name.contains('daniel') ||
name.contains('kate')) {
preferredVoice = v;
break;
}
}
}
}
final selectedVoice = preferredVoice ?? fallbackGbVoice;
if (selectedVoice != null) {
await _tts.setVoice({'name': selectedVoice['name'], 'locale': selectedVoice['locale']});
AppLogger.log('Selected British English (en-GB) voice: ${selectedVoice['name']}', tag: 'ENGLISH_AUDIO');
}
}
} catch (e) {
AppLogger.log('Voice auto-tuning warning: $e', tag: 'ENGLISH_AUDIO');
AppLogger.log('British voice auto-tuning warning: $e', tag: 'ENGLISH_AUDIO');
}
_tts.setStartHandler(() {
@@ -104,7 +123,7 @@ class EnglishReadingService {
}
}
/// قراءة فقرة محددة مع إيقاف أي قراءة جارية
/// قراءة فقرة محددة بالنموذج البريطاني النقي مع إيقاف أي قراءة جارية
Future<void> readParagraph({
required String paragraphId,
required String text,
@@ -134,11 +153,12 @@ class EnglishReadingService {
return;
}
await _tts.setSpeechRate(0.44);
await _tts.setLanguage('en-GB');
await _tts.setSpeechRate(0.40);
await _tts.speak(cleanText);
}
/// نطق كلمة واحدة مفردة بوضوح صوتي نقي
/// نطق كلمة واحدة مفردة بمخارج حروف دقيقة جداً (British RP Articulation)
Future<void> speakWord(String word) async {
await initialize();
if (word.trim().contains(' ')) {
@@ -149,11 +169,12 @@ class EnglishReadingService {
if (cleanWord.isEmpty) return;
await _tts.stop();
await _tts.setSpeechRate(0.38); // Slightly slower for distinct phonetic articulation
await _tts.setLanguage('en-GB');
await _tts.setSpeechRate(0.35); // Slowed down slightly for clear phonetic articulation
await _tts.speak(cleanWord);
}
/// نطق جملة أو عبارة تعليمية بوضوح وصوت طبيعي
/// نطق جملة أو عبارة تعليمية باللكنة البريطانية المعتمدة
Future<void> speakSentence(String text) async {
await initialize();
final cleanText = text
@@ -163,7 +184,8 @@ class EnglishReadingService {
if (cleanText.isEmpty) return;
await _tts.stop();
await _tts.setSpeechRate(0.44);
await _tts.setLanguage('en-GB');
await _tts.setSpeechRate(0.40);
await _tts.speak(cleanText);
}