Skip to content

Commit

Permalink
fix: disable TTS when no TTS engine is installed (fixes #36)
Browse files Browse the repository at this point in the history
  • Loading branch information
blockbasti committed Mar 7, 2021
1 parent c18f17a commit 292ce69
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 15 deletions.
8 changes: 6 additions & 2 deletions lib/settings_page.dart
Expand Up @@ -71,6 +71,7 @@ class _SettingsPageState extends State<SettingsPage> {
'sound',
desc: S.of(context).useTTSDesc,
isDefault: true,
disabled: !TTSHelper.available,
onSelect: () {
TTSHelper.useTTS = true;
SoundHelper.useSound = false;
Expand All @@ -91,9 +92,11 @@ class _SettingsPageState extends State<SettingsPage> {
S.of(context).ttsLang,
'tts_lang',
desc: S.of(context).ttsLangDesc,
defaultVal: 'en-US',
defaultVal: (TTSHelper.languages.isNotEmpty
? TTSHelper.languages.first
: ''),
values: TTSHelper.languages,
//disabled: (!PrefService.getBool('tts_enable') ?? false),
disabled: !TTSHelper.available,
onChange: (value) {
TTSHelper.flutterTts.setLanguage(value);
},
Expand All @@ -102,6 +105,7 @@ class _SettingsPageState extends State<SettingsPage> {
S.of(context).announceUpcomingExercise,
'tts_next_announce',
desc: S.of(context).AnnounceUpcomingExerciseDesc,
disabled: !TTSHelper.available,
),
PreferenceTitle(S.of(context).licenses),
PreferenceText(
Expand Down
44 changes: 31 additions & 13 deletions lib/tts_helper.dart
@@ -1,3 +1,5 @@
import 'dart:async';

import 'package:flutter_tts/flutter_tts.dart';
import 'package:preferences/preference_service.dart';

Expand All @@ -6,7 +8,9 @@ import 'package:preferences/preference_service.dart';
class TTSHelper {
static FlutterTts flutterTts;

static List<String> languages;
static List<String> languages = List.empty();

static bool available = true;

/// enable/disable TTS output
static bool useTTS = true;
Expand All @@ -15,18 +19,32 @@ class TTSHelper {
flutterTts = FlutterTts();

useTTS = PrefService.getString('sound') == 'tts' ?? true;
await flutterTts.setLanguage(PrefService.getString('tts_lang') ?? 'en-US');
await flutterTts.setSpeechRate(1.0);
await flutterTts.setVolume(1.0);
await flutterTts.setPitch(1.0);

languages = List<String>.from(await flutterTts.getLanguages);
languages.sort();
languages.remove('de-DE');
languages.remove('en-US');
languages.insertAll(0, ['en-US', 'de-DE']);
languages = await Future.wait(languages.map((e) async =>
'$e${await flutterTts.isLanguageInstalled(e) ? '' : '*'}'));

var ttsLang = PrefService.getString('tts_lang') ?? 'en-US';
if (ttsLang.endsWith('*')) ttsLang = ttsLang.replaceAll('*', '');
PrefService.setString('tts_lang', ttsLang);

try {
await flutterTts
.setLanguage(ttsLang)
.timeout(Duration(seconds: 1))
.then((_) async {
await flutterTts.setSpeechRate(1.0);
await flutterTts.setVolume(1.0);
await flutterTts.setPitch(1.0);

languages = List<String>.from(await flutterTts.getLanguages);
languages.sort();
languages.remove('de-DE');
languages.remove('en-US');
languages.insertAll(0, ['en-US', 'de-DE']);
});
} on TimeoutException {
available = false;
useTTS = false;
PrefService.setString('sound', 'beep');
return;
}
}

static void speak(String text) async {
Expand Down

0 comments on commit 292ce69

Please sign in to comment.