63 lines
1.6 KiB
Dart
63 lines
1.6 KiB
Dart
import 'dart:io';
|
|
import 'package:siro_rider/constant/box_name.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_tts/flutter_tts.dart';
|
|
import 'package:get/get.dart';
|
|
|
|
import '../../main.dart';
|
|
|
|
class TextToSpeechController extends GetxController {
|
|
final flutterTts = FlutterTts();
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
initTts();
|
|
}
|
|
|
|
@override
|
|
void onClose() {
|
|
flutterTts.stop(); // Stop any ongoing TTS
|
|
super.onClose();
|
|
}
|
|
|
|
// Initialize TTS engine with language check
|
|
Future<void> initTts() async {
|
|
try {
|
|
String langCode = box.read(BoxName.lang) ?? 'ar-SA';
|
|
if (langCode == 'ar') langCode = 'ar-SA';
|
|
if (langCode == 'en') langCode = 'en-US';
|
|
|
|
bool isAvailable = await flutterTts.isLanguageAvailable(langCode);
|
|
if (!isAvailable) langCode = 'en-US';
|
|
|
|
await flutterTts.setLanguage(langCode);
|
|
await flutterTts.setSpeechRate(0.5);
|
|
await flutterTts.setVolume(1.0);
|
|
|
|
if (Platform.isIOS) {
|
|
await flutterTts.setIosAudioCategory(
|
|
IosTextToSpeechAudioCategory.playback,
|
|
[
|
|
IosTextToSpeechAudioCategoryOptions.mixWithOthers,
|
|
IosTextToSpeechAudioCategoryOptions.duckOthers,
|
|
],
|
|
);
|
|
}
|
|
} catch (error) {
|
|
print('TTS Init Error: $error');
|
|
}
|
|
}
|
|
|
|
// Function to speak the given text (stops current speech first)
|
|
Future<void> speakText(String text) async {
|
|
if (text.isEmpty) return;
|
|
try {
|
|
await flutterTts.stop();
|
|
await flutterTts.speak(text);
|
|
} catch (error) {
|
|
print('Failed to speak text: $error');
|
|
}
|
|
}
|
|
}
|