Update Saqel Platform: 2026-09-05 22:17:15
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user