Voice (dictate, read aloud) and Draw a picture over /v1, with the app's models scope
ci / ui (push) Waiting to run
ci / check (push) Failing after 3s
ci / start (push) Failing after 3s

The server kept voice and images on /v1 (models scope, which the app's token
already asks for); /me's services and scopes decide what is offered. Rust
sends the recording to /v1/audio/transcriptions, reads /v1/audio/speech back
as a data: URL (CSP media-src data:), and for /v1/images/generations takes
only the id of each of the person's own files from the answer and fetches
/v1/files/<id>/content from the app's own server. The microphone is allowed
only within seconds of the page's own Dictate (voice_arm); WebKitGTK's
media stream is switched on through its settings getter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
HomerandClaude Opus 5.5 committed 2026-11-10 14:02:56 +00:00
1 parent 67ce6076c5
commit 2b87fa4c29
16 files changed
+1024 -4

No files matched your search

+120
View File
@@ -504,6 +504,22 @@ KEYS = (
"Always allowed here",
"Ask me about these again",
"Nothing to switch in this chat.",
# voice.js, draw.js: dictation, read aloud, and drawing a picture
"Dictate a message",
"Stop dictating",
"Writing down…",
"The microphone could not be opened: %(why)s",
"Read this aloud",
"The server's answer was not audio.",
"Draw a picture",
"What to draw…",
"Shape",
"Square",
"Wide",
"Tall",
"Draw",
"Drawing… a picture can take a minute or two.",
"The server's answer had no picture in it.",
)
# The app's own sentences. The mode names (Manual, Edit, Auto, Plan) stay English, as the
@@ -761,6 +777,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Zatím si nic nepamatuje.",
"Tools and skills…": "Nástroje a dovednosti…",
"Nothing to switch in this chat.": "V této konverzaci není co přepnout.",
"Stop dictating": "Zastavit diktování",
"Writing down…": "Zapisuji…",
"The microphone could not be opened: %(why)s": "Mikrofon se nepodařilo otevřít: %(why)s",
"Read this aloud": "Přečíst nahlas",
"The server's answer was not audio.": "Odpověď serveru nebyla zvuk.",
"What to draw…": "Co nakreslit…",
"Shape": "Tvar",
"Square": "Čtverec",
"Wide": "Široký",
"Tall": "Vysoký",
"Draw": "Nakreslit",
"Drawing… a picture can take a minute or two.": "Kreslím… obrázek může trvat minutu nebo dvě.",
"The server's answer had no picture in it.": "V odpovědi serveru nebyl žádný obrázek.",
},
"de": {
"Sign in again: the server no longer accepts this app's sign-in.": "Melden Sie sich erneut an: Der Server nimmt die Anmeldung dieser App nicht mehr an.",
@@ -1013,6 +1042,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Noch nichts behalten.",
"Tools and skills…": "Werkzeuge und Fähigkeiten…",
"Nothing to switch in this chat.": "In diesem Chat gibt es nichts umzuschalten.",
"Stop dictating": "Diktieren beenden",
"Writing down…": "Wird aufgeschrieben…",
"The microphone could not be opened: %(why)s": "Das Mikrofon konnte nicht geöffnet werden: %(why)s",
"Read this aloud": "Vorlesen",
"The server's answer was not audio.": "Die Antwort des Servers war kein Audio.",
"What to draw…": "Was gezeichnet werden soll…",
"Shape": "Form",
"Square": "Quadratisch",
"Wide": "Breit",
"Tall": "Hoch",
"Draw": "Zeichnen",
"Drawing… a picture can take a minute or two.": "Wird gezeichnet… ein Bild kann ein bis zwei Minuten dauern.",
"The server's answer had no picture in it.": "Die Antwort des Servers enthielt kein Bild.",
},
"es": {
"Sign in again: the server no longer accepts this app's sign-in.": "Vuelva a iniciar sesión: el servidor ya no acepta el inicio de sesión de esta aplicación.",
@@ -1265,6 +1307,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Todavía no se recuerda nada.",
"Tools and skills…": "Herramientas y habilidades…",
"Nothing to switch in this chat.": "No hay nada que activar o desactivar en este chat.",
"Stop dictating": "Dejar de dictar",
"Writing down…": "Transcribiendo…",
"The microphone could not be opened: %(why)s": "No se pudo abrir el micrófono: %(why)s",
"Read this aloud": "Leer en voz alta",
"The server's answer was not audio.": "La respuesta del servidor no era audio.",
"What to draw…": "Qué dibujar…",
"Shape": "Forma",
"Square": "Cuadrada",
"Wide": "Ancha",
"Tall": "Alta",
"Draw": "Dibujar",
"Drawing… a picture can take a minute or two.": "Dibujando… una imagen puede tardar uno o dos minutos.",
"The server's answer had no picture in it.": "La respuesta del servidor no traía ninguna imagen.",
},
"fr": {
"Sign in again: the server no longer accepts this app's sign-in.": "Reconnectez-vous : le serveur n’accepte plus la connexion de cette application.",
@@ -1517,6 +1572,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Rien n’est encore retenu.",
"Tools and skills…": "Outils et compétences…",
"Nothing to switch in this chat.": "Rien à activer ou désactiver dans cette conversation.",
"Stop dictating": "Arrêter la dictée",
"Writing down…": "Transcription…",
"The microphone could not be opened: %(why)s": "Le micro n’a pas pu être ouvert : %(why)s",
"Read this aloud": "Lire à voix haute",
"The server's answer was not audio.": "La réponse du serveur n’était pas de l’audio.",
"What to draw…": "Que dessiner…",
"Shape": "Forme",
"Square": "Carrée",
"Wide": "Large",
"Tall": "Haute",
"Draw": "Dessiner",
"Drawing… a picture can take a minute or two.": "Dessin en cours… une image peut prendre une minute ou deux.",
"The server's answer had no picture in it.": "La réponse du serveur ne contenait aucune image.",
},
"hu": {
"Sign in again: the server no longer accepts this app's sign-in.": "Jelentkezzen be újra: a szerver már nem fogadja el ennek az alkalmazásnak a bejelentkezését.",
@@ -1769,6 +1837,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Még nincs megjegyezve semmi.",
"Tools and skills…": "Eszközök és készségek…",
"Nothing to switch in this chat.": "Ebben a beszélgetésben nincs mit átkapcsolni.",
"Stop dictating": "Diktálás leállítása",
"Writing down…": "Leírás…",
"The microphone could not be opened: %(why)s": "A mikrofont nem sikerült megnyitni: %(why)s",
"Read this aloud": "Felolvasás",
"The server's answer was not audio.": "A szerver válasza nem hang volt.",
"What to draw…": "Mit rajzoljon…",
"Shape": "Forma",
"Square": "Négyzet",
"Wide": "Széles",
"Tall": "Magas",
"Draw": "Rajzolás",
"Drawing… a picture can take a minute or two.": "Rajzolás… egy kép egy-két percig is eltarthat.",
"The server's answer had no picture in it.": "A szerver válaszában nem volt kép.",
},
"it": {
"Sign in again: the server no longer accepts this app's sign-in.": "Accedi di nuovo: il server non accetta più l’accesso di questa app.",
@@ -2021,6 +2102,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Ancora niente da ricordare.",
"Tools and skills…": "Strumenti e abilità…",
"Nothing to switch in this chat.": "Non c’è niente da attivare o disattivare in questa chat.",
"Stop dictating": "Interrompi la dettatura",
"Writing down…": "Trascrizione…",
"The microphone could not be opened: %(why)s": "Impossibile aprire il microfono: %(why)s",
"Read this aloud": "Leggi ad alta voce",
"The server's answer was not audio.": "La risposta del server non era audio.",
"What to draw…": "Cosa disegnare…",
"Shape": "Forma",
"Square": "Quadrata",
"Wide": "Larga",
"Tall": "Alta",
"Draw": "Disegna",
"Drawing… a picture can take a minute or two.": "Disegno in corso… un’immagine può richiedere un minuto o due.",
"The server's answer had no picture in it.": "La risposta del server non conteneva immagini.",
},
"pl": {
"Sign in again: the server no longer accepts this app's sign-in.": "Zaloguj się ponownie: serwer nie przyjmuje już logowania tej aplikacji.",
@@ -2273,6 +2367,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Na razie nic nie zapamiętano.",
"Tools and skills…": "Narzędzia i umiejętności…",
"Nothing to switch in this chat.": "W tym czacie nie ma czego przełączać.",
"Stop dictating": "Zatrzymaj dyktowanie",
"Writing down…": "Zapisywanie…",
"The microphone could not be opened: %(why)s": "Nie udało się otworzyć mikrofonu: %(why)s",
"Read this aloud": "Przeczytaj na głos",
"The server's answer was not audio.": "Odpowiedź serwera nie była dźwiękiem.",
"What to draw…": "Co narysować…",
"Shape": "Kształt",
"Square": "Kwadrat",
"Wide": "Szeroki",
"Tall": "Wysoki",
"Draw": "Narysuj",
"Drawing… a picture can take a minute or two.": "Rysowanie… obraz może zająć minutę lub dwie.",
"The server's answer had no picture in it.": "W odpowiedzi serwera nie było obrazu.",
},
"sk": {
"Sign in again: the server no longer accepts this app's sign-in.": "Prihláste sa znova: server už neprijíma prihlásenie tejto aplikácie.",
@@ -2525,6 +2632,19 @@ OWN: dict[str, dict[str, str]] = {
"Nothing remembered yet.": "Zatiaľ si nič nepamätá.",
"Tools and skills…": "Nástroje a schopnosti…",
"Nothing to switch in this chat.": "V tejto konverzácii nie je čo prepnúť.",
"Stop dictating": "Zastaviť diktovanie",
"Writing down…": "Zapisujem…",
"The microphone could not be opened: %(why)s": "Mikrofón sa nepodarilo otvoriť: %(why)s",
"Read this aloud": "Prečítať nahlas",
"The server's answer was not audio.": "Odpoveď servera nebola zvuk.",
"What to draw…": "Čo nakresliť…",
"Shape": "Tvar",
"Square": "Štvorec",
"Wide": "Široký",
"Tall": "Vysoký",
"Draw": "Nakresliť",
"Drawing… a picture can take a minute or two.": "Kreslím… obrázok môže trvať minútu alebo dve.",
"The server's answer had no picture in it.": "V odpovedi servera nebol žiadny obrázok.",
},
}