feat(learn): voice mode, a conversation spoken as Claude's "Let's talk" (ADR 0021, D68)

Beside the field's microphone, a button opens voice mode over the whole
screen: a glow rising from below, a big microphone, and +, who answers,
the speaker and End in one row. It listens with the device's recogniser,
asks what was heard in one kept conversation, reads the answer aloud
with the device's speech (flutter_tts, its Markdown left out) and
listens again. On Linux there is none, as there is no microphone; where
nothing reads aloud, answers are shown as text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-03 22:11:28 +01:00
commit c984678c5b
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -462,6 +462,31 @@ assistants' effort work:
asking for the microphone only once it is tapped; on Linux there is none, and the
field shows no microphone. On Android the recogniser may send the sound to Google or
the phone's maker, which the instance's privacy page says; the instance never gets it.
- **D68 Voice mode is a conversation spoken, as Claude's "Let's talk"** (the developer's
review of 3 Nov 2026, full conversation chosen over dictation alone): beside the
microphone, while nothing could be sent, a button opens it over the whole screen (no
bar beneath), with a glow rising from the foot of it, brighter while it listens or
reads, a big microphone and one row: + attaching to the next question, who answers (any
other assistant picked starts a conversation with it, once agreed to as any question,
D40, D9), the speaker and End. It listens (D67's recogniser), asks what was heard in
one conversation kept as any other (D48), reads the answer aloud and listens again;
the microphone tapped while it reads or waits listens at once, and nothing heard waits
for it. The field's scope, the parts chosen and the files attached go with the first
question. Only the question's text goes to the assistant, as typed ones do.
- **Reading aloud is the device's own speech** (recommended): `flutter_tts` (4.2,
maintained, Android's TextToSpeech, Apple's AVSpeechSynthesizer, Windows' SAPI), in
the app's language where the device has it, the answer read without its Markdown
(`speakableText`: no marks, a table's rows as their cells, a link as its words). Over
a MethodChannel of our own to Android's TextToSpeech, which would spare the Kotlin
Gradle plugin `flutter_tts` applies (as `flutter_web_auth_2` and
`keyboard_height_plugin` do) but leave iOS, macOS and Windows to be written too; and
over the provider's speech (OpenAI's, as the instance would forward it), which would
send the answers out again and cost the operator's budget. Android 11 on needs the
`TTS_SERVICE` query in the manifest to find the engine.
- **Where the device can't**: on Linux nothing recognises speech, so there is no voice
mode (as no microphone, D67); where nothing reads aloud (`flutter_tts` has no Linux,
and a phone may lack the language), answers are shown in it as text, and it listens
again at once, as with the speaker off. The speaker starts on.
As built on 26 Oct, for v0.22.0 (build 25, which the server needs: `minimumAppBuild` 25,
as older apps read limits per grant), D57–D63 read so where they left something open: