fix(app,learn,meditate): a device without speech recognition says so, and how to get one
On GrapheneOS, which installs no recogniser, the microphone did nothing and stayed listening: speech_to_text's initialize throws a PlatformException (recognizerNotAvailable) there rather than answering false, and DeviceSpeechInput let it through. A listen now answers how it went (SpeechStart: listening, noRecognizer, unavailable) and never throws; Learn's field and Meditate's dream say that no speech recognition is installed and name two to install (FUTO Voice Input, Google's speech services), in halkyon_app's texts. It also passes androidNoBluetooth, as the apps declare no Bluetooth permission the plugin would otherwise ask for. Whats-New: Where the device has no speech recognition, the microphone says so and how to get one. Whats-New-De: Wo das Gerät keine Spracherkennung hat, sagt das Mikrofon das und wie du eine bekommst. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
parent
00212bf49c
commit
2d27451cb8
2 changed files with 254 additions and 64 deletions
|
|
@ -8,11 +8,11 @@ class const NoSpeechInput() implements SpeechInput {
|
|||
bool get supported => false;
|
||||
|
||||
@override
|
||||
Future<bool> listen({
|
||||
Future<SpeechStart> listen({
|
||||
required String? language,
|
||||
required ValueChanged<String> onWords,
|
||||
required VoidCallback onDone,
|
||||
}) async => false;
|
||||
}) async => SpeechStart.unavailable;
|
||||
|
||||
@override
|
||||
Future<void> stop() async {}
|
||||
|
|
|
|||
|
|
@ -91,13 +91,18 @@ class _DreamScreenState() extends State<DreamScreen> {
|
|||
/// it), saying so where the device can't.
|
||||
Future<void> _dictate() async {
|
||||
final l10n = AppLocalizations.of(context);
|
||||
final words = HalkyonAppLocalizations.of(context);
|
||||
final messenger = ScaffoldMessenger.of(context);
|
||||
if (!await _dictation.start(
|
||||
final problem = switch (await _dictation.start(
|
||||
language: Localizations.localeOf(context).toLanguageTag(),
|
||||
)) {
|
||||
messenger.showSnackBar(
|
||||
SnackBar(content: Text(l10n.dreamSpeechUnavailable)),
|
||||
);
|
||||
SpeechStart.listening => null,
|
||||
// A phone without Google's services has no recogniser to listen with.
|
||||
SpeechStart.noRecognizer => words.speechNoRecognizer,
|
||||
SpeechStart.unavailable => l10n.dreamSpeechUnavailable,
|
||||
};
|
||||
if (problem != null) {
|
||||
messenger.showSnackBar(SnackBar(content: Text(problem)));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue