Mobile stt (#1928)
* chore: if user's language is not in langList, refresh langList * chore: simplify logic for setting TTS lang, set TTS lang each time speak is called
This commit is contained in:
parent
81f0b296dc
commit
534fe2dfee
4 changed files with 32 additions and 13 deletions
|
|
@ -37,6 +37,7 @@ class LearningProgressIndicatorsState
|
||||||
bool _loading = true;
|
bool _loading = true;
|
||||||
|
|
||||||
StreamSubscription<AnalyticsStreamUpdate>? _analyticsSubscription;
|
StreamSubscription<AnalyticsStreamUpdate>? _analyticsSubscription;
|
||||||
|
StreamSubscription? _languageSubscription;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
|
@ -50,12 +51,20 @@ class LearningProgressIndicatorsState
|
||||||
_analyticsSubscription = MatrixState
|
_analyticsSubscription = MatrixState
|
||||||
.pangeaController.getAnalytics.analyticsStream.stream
|
.pangeaController.getAnalytics.analyticsStream.stream
|
||||||
.listen(updateData);
|
.listen(updateData);
|
||||||
|
|
||||||
|
// rebuild when target language changes
|
||||||
|
_languageSubscription =
|
||||||
|
MatrixState.pangeaController.userController.stateStream.listen((_) {
|
||||||
|
if (mounted) setState(() {});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
_analyticsSubscription?.cancel();
|
_analyticsSubscription?.cancel();
|
||||||
_analyticsSubscription = null;
|
_analyticsSubscription = null;
|
||||||
|
_languageSubscription?.cancel();
|
||||||
|
_languageSubscription = null;
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,11 @@ class PangeaLanguage {
|
||||||
|
|
||||||
List<LanguageModel> get baseOptions => _langList.toList();
|
List<LanguageModel> get baseOptions => _langList.toList();
|
||||||
|
|
||||||
static Future<void> initialize() async {
|
static Future<void> initialize({forceRefresh = false}) async {
|
||||||
try {
|
try {
|
||||||
_langList = await _getCachedLanguages();
|
_langList = await _getCachedLanguages();
|
||||||
if (await _shouldFetch ||
|
if (forceRefresh ||
|
||||||
|
await _shouldFetch ||
|
||||||
_langList.isEmpty ||
|
_langList.isEmpty ||
|
||||||
_langList.every((lang) => !lang.l2)) {
|
_langList.every((lang) => !lang.l2)) {
|
||||||
_langList = await LanguageRepo.fetchLanguages();
|
_langList = await LanguageRepo.fetchLanguages();
|
||||||
|
|
@ -66,7 +67,7 @@ class PangeaLanguage {
|
||||||
}
|
}
|
||||||
// return true;
|
// return true;
|
||||||
final DateTime lastFetchedDate = DateTime.parse(dateString);
|
final DateTime lastFetchedDate = DateTime.parse(dateString);
|
||||||
final DateTime targetDate = DateTime(2025, 2, 12);
|
final DateTime targetDate = DateTime(2025, 2, 26);
|
||||||
if (lastFetchedDate.isBefore(targetDate)) {
|
if (lastFetchedDate.isBefore(targetDate)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'dart:developer';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter_tts/flutter_tts.dart' as flutter_tts;
|
import 'package:flutter_tts/flutter_tts.dart' as flutter_tts;
|
||||||
import 'package:matrix/matrix_api_lite/utils/logs.dart';
|
import 'package:matrix/matrix_api_lite/utils/logs.dart';
|
||||||
import 'package:text_to_speech/text_to_speech.dart';
|
import 'package:text_to_speech/text_to_speech.dart';
|
||||||
|
|
@ -80,20 +81,21 @@ class TtsController {
|
||||||
_availableLangCodes = languages.toSet().toList();
|
_availableLangCodes = languages.toSet().toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setLanguage() {
|
Future<void> _setLanguage() async {
|
||||||
|
String? langCode;
|
||||||
if (l2LangCode != null && _availableLangCodes.contains(l2LangCode)) {
|
if (l2LangCode != null && _availableLangCodes.contains(l2LangCode)) {
|
||||||
_useAlternativeTTS
|
langCode = l2LangCode;
|
||||||
? _alternativeTTS.setLanguage(l2LangCode!)
|
|
||||||
: _tts.setLanguage(l2LangCode!);
|
|
||||||
} else if (l2LangCodeShort != null) {
|
} else if (l2LangCodeShort != null) {
|
||||||
final langCodeShort = l2LangCodeShort!;
|
final langCodeShort = l2LangCodeShort!;
|
||||||
final langCode = _availableLangCodes.firstWhere(
|
langCode = _availableLangCodes.firstWhereOrNull(
|
||||||
(code) => code.startsWith(langCodeShort),
|
(code) => code.startsWith(langCodeShort),
|
||||||
orElse: () => "en",
|
|
||||||
);
|
);
|
||||||
_useAlternativeTTS
|
}
|
||||||
|
|
||||||
|
if (langCode != null) {
|
||||||
|
await (_useAlternativeTTS
|
||||||
? _alternativeTTS.setLanguage(langCode)
|
? _alternativeTTS.setLanguage(langCode)
|
||||||
: _tts.setLanguage(langCode);
|
: _tts.setLanguage(langCode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -108,8 +110,6 @@ class TtsController {
|
||||||
await _tts.awaitSpeakCompletion(true);
|
await _tts.awaitSpeakCompletion(true);
|
||||||
await _setAvailableLanguages();
|
await _setAvailableLanguages();
|
||||||
}
|
}
|
||||||
|
|
||||||
_setLanguage();
|
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
debugger(when: kDebugMode);
|
debugger(when: kDebugMode);
|
||||||
ErrorHandler.logError(
|
ErrorHandler.logError(
|
||||||
|
|
@ -181,6 +181,7 @@ class TtsController {
|
||||||
// Target ID for where to show warning popup
|
// Target ID for where to show warning popup
|
||||||
String? targetID,
|
String? targetID,
|
||||||
}) async {
|
}) async {
|
||||||
|
await _setLanguage();
|
||||||
final enableTTS = MatrixState
|
final enableTTS = MatrixState
|
||||||
.pangeaController.userController.profile.toolSettings.enableTTS;
|
.pangeaController.userController.profile.toolSettings.enableTTS;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ import 'package:fluffychat/pangea/common/utils/error_handler.dart';
|
||||||
import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
|
import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart';
|
||||||
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
|
import 'package:fluffychat/pangea/learning_settings/constants/language_constants.dart';
|
||||||
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
import 'package:fluffychat/pangea/learning_settings/models/language_model.dart';
|
||||||
|
import 'package:fluffychat/pangea/learning_settings/utils/language_list_util.dart';
|
||||||
import 'package:fluffychat/pangea/user/models/profile_model.dart';
|
import 'package:fluffychat/pangea/user/models/profile_model.dart';
|
||||||
import '../models/user_model.dart';
|
import '../models/user_model.dart';
|
||||||
|
|
||||||
|
|
@ -113,6 +114,13 @@ class UserController extends BaseController {
|
||||||
try {
|
try {
|
||||||
await _initialize();
|
await _initialize();
|
||||||
addProfileListener();
|
addProfileListener();
|
||||||
|
if (profile.userSettings.targetLanguage != null &&
|
||||||
|
profile.userSettings.targetLanguage!.isNotEmpty &&
|
||||||
|
_pangeaController.languageController.userL2 == null) {
|
||||||
|
// update the language list and send an update to refresh analytics summary
|
||||||
|
await PangeaLanguage.initialize(forceRefresh: true);
|
||||||
|
setState(null);
|
||||||
|
}
|
||||||
} catch (err, s) {
|
} catch (err, s) {
|
||||||
ErrorHandler.logError(
|
ErrorHandler.logError(
|
||||||
e: err,
|
e: err,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue