halkyon/apps/meditate/halkyon_meditate_server/lib/src/meditate_base.dart
Tizian 「ティツィアーン」 c36bd83c6a
feat(learn,todo,meditate): dictate through the phone's voice input app (ADR 0038, D18)
On Android the microphone now opens the app handling
RECOGNIZE_SPEECH (FUTO Voice Input, Google's), the default the person
chose in Android, and puts the text it returns where the cursor stood,
as Dictation does; cancelled, nothing. Only where none is installed, or
it can't be opened, does speech_to_text listen in line as before.

halkyon_app: VoiceInputApp (one listen, an answer once closed) on the
channel app.halkyon/voice_input, which DeviceSpeechInput asks first at
every listen, answering SpeechStart.finished so that Dictation doesn't
listen again; speech_to_text isn't touched on that route, so our app
asks for no microphone. SpeechInput.listen and Dictation.start take the
prompt the voice input app shows (the field's hint).

Each app: VoiceInput.kt (queryIntentActivities, startActivityForResult,
the first of EXTRA_RESULTS) attached in MainActivity, which hands it
activity results, and RECOGNIZE_SPEECH among the manifest's queries.
The privacy pages of Learn and Meditate say so.

Our own Whisper and Meditate's dream recordings are dropped (D18).

Whats-New: The microphone now dictates through your phone's voice input app, such as FUTO Voice Input.
Whats-New-De: Das Mikrofon diktiert jetzt über die Spracheingabe-App deines Telefons, etwa FUTO Voice Input.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
2026-11-08 11:48:42 +01:00

100 lines
5.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:halkyon_base_server/base.dart';
import 'package:halkyon_meditate_server/src/meditate_data.dart';
/// Where this project's source is published, which the instance names
/// unless its operator sets `SOURCE_URL`. Both licences require offering it
/// to the people who use the instance (AGPL-3.0-or-later for the app,
/// SSPL-1.0 for the server).
const upstreamSourceCodeUrl =
'https://code.halkyon.app/project-halkyon/halkyon';
/// The oldest build of the app this server works with (the number after `+`
/// in the app's version); apps below it are asked to update. Raise it in the
/// commit that breaks older apps, to the build of the first that works again.
const minimumAppBuild = 1;
/// How Halkyon Meditate sets halkyon_base up (ADR 0014), the module giving every
/// Halkyon server its sign-in, the account and its deletion, the pruning and
/// the instance's basics: the instance says it serves `meditate` (the app accepts
/// only such an instance; never change it), sign-in mails name the app, and
/// the instance names this project's source. A person's sittings and keys go
/// with them ([deleteMeditateData]). It holds the instance's
/// register, or is a member of the one [accounts] names (ADR 0016; the
/// server reads it from the operator's environment, `ACCOUNT_REGISTER_URL`).
/// The server sets it up before it starts (`server.dart`), and so do its
/// tests.
HalkyonBase meditateBase({AccountsMode accounts = const HoldsRegister()}) =>
HalkyonBase(
app: 'meditate',
appName: 'Halkyon Meditate',
upstreamSourceCodeUrl: upstreamSourceCodeUrl,
minimumAppBuild: minimumAppBuild,
deletePersonData: const [deleteMeditateData],
accounts: accounts,
privacyPagePoints: _privacyPagePoints,
);
/// What the instance's privacy page says of Meditate's data (ADR 0038, D7,
/// D14, D15), where Meditate's server serves the page: what is sealed, and
/// what a dream spoken passes through. Change it with what Meditate keeps
/// or sends.
const List<PrivacyPagePoint> _privacyPagePoints = [
(
english:
'On Halkyon Meditate, your settings, the sittings you keep and the '
'dreams you write down are encrypted on your devices with your key: '
'the instance sees how many there are, their size and when they '
'changed, never what they hold. A device that can’t encrypt keeps '
'none.',
german:
'In Halkyon Meditate werden deine Einstellungen, die Sitzungen, die '
'du aufbewahrst, und die Träume, die du aufschreibst, auf deinen '
'Geräten mit deinem Schlüssel verschlüsselt: Die Instanz sieht, wie '
'viele es sind, wie groß sie sind und wann sie sich änderten, nie, '
'was sie enthalten. Ein Gerät, das nicht verschlüsseln kann, bewahrt '
'keine auf.',
),
(
english:
'Where this instance offers a library of recordings, only people '
'signed in get it. Fetching a recording names no account: your '
'device shows an access the instance signed alike for everyone it '
'gave the library to within the same hour, so beyond the address a '
'request comes from, the instance can’t tell who listens to what. '
'What you listened to, your favourites and the lessons you did are '
'sealed with your key as your sittings are.',
german:
'Wo diese Instanz eine Bibliothek mit Aufnahmen anbietet, bekommen '
'sie nur angemeldete Personen. Eine Aufnahme zu laden nennt kein '
'Konto: Dein Gerät zeigt eine Zugangsberechtigung, die die Instanz '
'allen gleich signiert, denen sie die Bibliothek in derselben Stunde '
'gab. Über die Adresse hinaus, von der eine Anfrage kommt, weiß die '
'Instanz also nicht, wer was hört. Was du gehört hast, deine '
'Favoriten und die Lektionen, die du gemacht hast, werden wie deine '
'Sitzungen mit deinem Schlüssel verschlüsselt.',
),
(
english:
'A dream you speak is written by your device’s own speech '
'recognition. On Android, where a voice input app is installed '
'(FUTO Voice Input, for one), that app listens and hands Meditate '
'the text alone, and it decides whether the sound leaves the device; '
'without one, Meditate asks for recognition on the '
'device, which Android 12 and later offer where the language is '
'installed; otherwise Android’s recogniser may send the sound to '
'Google or the phone’s maker. Apple’s and Windows’ recognisers decide '
'for themselves whether the sound leaves the device. It never reaches '
'the instance.',
german:
'Einen Traum, den du erzählst, schreibt die Spracherkennung deines '
'Geräts auf. Unter Android hört, wo eine Spracheingabe-App '
'installiert ist (etwa FUTO Voice Input), diese App zu und gibt '
'Meditate nur den Text; ob der Ton das Gerät verlässt, entscheidet '
'sie. Ohne eine bittet Meditate um Erkennung auf dem '
'Gerät, die Android ab Version 12 bietet, wo die Sprache installiert '
'ist; sonst kann Androids Spracherkennung den Ton an Google oder den '
'Hersteller des Telefons senden. Die Spracherkennung von Apple und '
'Windows entscheidet selbst, ob der Ton das Gerät verlässt. Bei der '
'Instanz kommt er nie an.',
),
];