Read selected macOS text aloud from Raycast with Gemini text-to-speech, tuned for papers, legal materials, bilingual notes, and long-form listening.
![]()
Submitted to the Raycast Store — review pending. Track progress at raycast/extensions#27612. Until it ships in the Store, install locally with npm install && npm run dev.
Gemini TTS is not just a voice endpoint. The official TTS guide emphasizes natural-language control over style, accent, pace, tone, audio tags, and transcript structure. This extension turns those Gemini strengths into Raycast controls so daily reading does not require hand-writing prompts.
Functional advantages:
afplay -r applies speed at playback time.[short pause] audio tags without treating bracketed citations as performance tags.Sadaltager, Charon, Rasalgethi, and Iapetus are highlighted as academic picks in the voice picker.Voice cloning is intentionally not included because the Gemini TTS API currently exposes prebuilt voices rather than a voice-clone endpoint.
gemini-3.1-flash-tts-preview: default, low-latency current preview model with expressive audio tags.gemini-2.5-flash-preview-tts: lower-cost fallback model.gemini-2.5-pro-preview-tts: studio-quality option for long-form or higher-fidelity narration when latency and cost matter less.These models accept text input and return audio output. Gemini TTS does not expose REST streaming for this workflow, so the extension uses chunked synthesis for faster starts, stop/resume, and more stable long selections.
The Gemini API key is created in Google AI Studio and belongs to a Google Cloud project. The key itself does not carry a separate balance; it inherits the quota, billing tier, and billing status of its project.
For this extension:
Useful search keywords:
Google AI Studio API keyGemini API billing AI StudioSmart Auto is the default. It does not rewrite, translate, or summarize the selected text. It only chooses the director preset before sending the transcript to Gemini TTS.
Smart Auto routing:
Available manual presets:
Gemini TTS detects input language automatically; there is no separate language_boost API parameter. This extension therefore uses prompt guidance instead of hidden language switches.
Best practice:
Preference options:
Gemini supports English inline audio tags such as [short pause], [serious], [slowly], and [whispers]. The official guide recommends English tags even when the transcript is not English.
This extension exposes that as a preference:
[short pause] between paragraphs for long papers and essays.The prompt explicitly tells Gemini that bracketed citations, footnote markers, and legal references remain content unless they are clear performance tags.
Academic picks:
Sadaltager: knowledgeable, default in this extension.Charon: informative.Rasalgethi: informative.Iapetus: clear.Other useful long-listening voices:
Erinome: clear.Schedar: even.Sulafat: warm.Vindemiatrix: gentle.More expressive voices:
Puck: upbeat.Achird: friendly.Aoede: breezy.Fenrir: excitable.Leda: youthful.Gacrux: mature.Gemini TTS supports multi-speaker audio for transcripts with up to two speakers. This extension keeps Single Speaker as the default for papers and legal material, and exposes Auto Two-Speaker Dialogue as an opt-in preference.
Use dialogue mode when the selected text already has exactly two clear speaker labels, for example:
Host: Today we are looking at Article 20.
Guest: The hard part is how courts apply it.
The first detected label uses the selected Quick Read voice. The second detected label uses Second Dialogue Voice (default fallback: Puck). If the text has zero, one, or more than two labels, the extension safely falls back to single-speaker narration.
Quick Read:
Choose a voice:
Manage long readings:
POST /v1beta/models/{model}:generateContentx-goog-api-key: <Gemini API Key>responseModalities: ["AUDIO"] plus either speechConfig.voiceConfig.prebuiltVoiceConfig.voiceName or, for opt-in two-speaker transcripts, speechConfig.multiSpeakerVoiceConfig.speakerVoiceConfigscontents (the TTS preview models reject systemInstruction with HTTP 400)afplayafplay -r <speed> — applied at playback time, so cached audio is reusable across speed changes(text, voice, model, language, experience, expressiveness, audio-tag mode, speaker mode, second voice, director notes, sample rate) plus a cache version. LRU sweep at 200 MB inside environment.supportPath/audio-cache/. Clear from the menu-bar Audio Cache row.$TMPDIR/gemini-tts.pid for active afplay; session lock in $TMPDIR/gemini-tts.session.lock covers the synthesis-only window before the first afplay is launched, so a Quick Read trigger during the lead chunk's synthesis still toggle-stops the running session.npm install
npm run dev
npm run build
npm run lint
Read selected text, or clipboard text if no selection is available. Trigger again to stop.
Resume the previous reading from the next unfinished chunk
Restart the previous reading from the beginning
Browse Gemini voices and read selected text aloud
Choose and preview the voice used by Quick Read
Stop the current TTS playback
Increase reading speed by 0.25× for the next segment.
Decrease reading speed by 0.25× for the next segment.
Menu-bar status of the current Gemini TTS reading with controls
launchCommand, instead of waiting for the 1-minute interval tick.afplay process exists) now stops the running session cleanly instead of starting a parallel reader.systemInstruction split: Gemini's TTS preview models reject it with HTTP 400 — Developer instruction is not enabled for this model. The director profile is back inline in contents. Verified directly against gemini-3.1-flash-tts-preview (HTTP 200, audio returned).finally block, so a transient failure during reading startup can no longer leak the lock and block all subsequent readings.fetch network errors (DNS hiccups, ECONNRESET, dropped TLS sockets) are now retried alongside HTTP 429/5xx, so a single packet loss during a long reading no longer aborts the session.x-goog-api-key authentication.gemini-3.1-flash-tts-preview.gemini-2.5-flash-preview-tts.gemini-2.5-pro-preview-tts.afplay.multiSpeakerVoiceConfig when the selected text contains exactly two speaker labels.Sadaltager.Sadaltager, Charon, Rasalgethi, and Iapetus as Academic Pick.