import 'dart:io'; import 'package:flutter_tts/flutter_tts.dart'; import 'package:get/get.dart'; import 'package:sefer_driver/constant/box_name.dart'; import 'package:sefer_driver/main.dart'; class TextToSpeechController extends GetxController { final FlutterTts flutterTts = FlutterTts(); bool isSpeaking = false; @override void onInit() { super.onInit(); initTts(); } @override void onClose() { flutterTts.stop(); super.onClose(); } // --- 1. تهيئة المحرك بإعدادات قوية للملاحة --- Future initTts() async { try { // جلب اللغة المحفوظة أو استخدام العربية كافتراضي String lang = box.read(BoxName.lang) ?? 'ar-SA'; // تصحيح صيغة اللغة إذا لزم الأمر if (lang == 'ar') lang = 'ar-SA'; if (lang == 'en') lang = 'en-US'; await flutterTts.setLanguage(lang); await flutterTts.setSpeechRate(0.5); // سرعة متوسطة وواضحة await flutterTts.setVolume(1.0); await flutterTts.setPitch(1.0); // إعدادات خاصة لضمان عمل الصوت مع الملاحة (خاصة للآيفون) if (Platform.isIOS) { await flutterTts .setIosAudioCategory(IosTextToSpeechAudioCategory.playback, [ IosTextToSpeechAudioCategoryOptions.mixWithOthers, IosTextToSpeechAudioCategoryOptions.duckOthers ]); } // الاستماع لحالة الانتهاء flutterTts.setCompletionHandler(() { isSpeaking = false; update(); }); flutterTts.setStartHandler(() { isSpeaking = true; update(); }); } catch (e) { print("TTS Init Error: $e"); } } // --- 2. دالة التحدث (تقاطع الكلام القديم) --- Future speakText(String text) async { if (text.isEmpty) return; try { // إيقاف أي كلام حالي لضمان نطق التوجيه الجديد فوراً (أهم للملاحة) await flutterTts.stop(); var result = await flutterTts.speak(text); if (result == 1) { isSpeaking = true; update(); } } catch (error) { // لا تعرض سناك بار هنا لتجنب إزعاج السائق أثناء القيادة print('Failed to speak text: $error'); } } // --- 3. دالة الإيقاف (ضرورية لزر الكتم) --- Future stop() async { try { var result = await flutterTts.stop(); if (result == 1) { isSpeaking = false; update(); } } catch (e) { print("Error stopping TTS: $e"); } } }