Skip to content

Add doubao-tts extension#25705

Merged
raycastbot merged 4 commits intoraycast:mainfrom
xwzhangSZU:ext/doubao-tts
Mar 5, 2026
Merged

Add doubao-tts extension#25705
raycastbot merged 4 commits intoraycast:mainfrom
xwzhangSZU:ext/doubao-tts

Conversation

@xwzhangSZU
Copy link
Contributor

@xwzhangSZU xwzhangSZU commented Feb 22, 2026

Description

Doubao TTS lets you select any text on macOS and read it aloud via Raycast — powered by Volcengine Doubao TTS V3, the leading Chinese AI speech synthesis engine.

Commands

  • Quick Read Selected Text — Select text, trigger the command, instant reading (no UI). Trigger again to stop.
  • Read with Voice Selection — Browse 90+ voices organized by category (general, emotional, English, multilingual, fun accents) and read selected text.
  • Stop Reading — Stop the current TTS playback.

Key Features

  • 90+ built-in Chinese & English voices (TTS 2.0 and 1.0)
  • Smart text chunking — auto-splits long text by sentence for seamless playback
  • Toggle mode — trigger Quick Read again to stop, no separate stop command needed
  • Adjustable speech rate (0.5x – 2.0x)
  • Hotkey support — bind a global hotkey for select-and-read workflow

Configuration

Users need a free Volcengine account with Doubao TTS enabled. New users get a free quota. The extension requires:

  • App ID (X-Api-App-Id)
  • Access Key (X-Api-Access-Key)

Screencast

Command List Preferences Extension Management
Command List Preferences Extension Management

Checklist

- docs: update screenshots to 2000x1250 for Raycast Store
- fix: rename icon to command-icon for Raycast compatibility
- docs: add extension screenshots
- feat: add custom extension icon with dark mode support
- fix: sync all fixes from Raycast Store PR
- docs: fix screenshot captions (1.png=preferences, 3.png=quick-read)
- docs: update installation to Raycast Store workflow
- docs: bilingual README (English + Chinese)
- docs: add screenshots and enhance README
- chore: prepare extension for Raycast Store submission
- fix: update repo URL in README to match GitHub username
- feat: Raycast extension for Doubao TTS (V3 API)
@raycastbot raycastbot added the new extension Label for PRs with new extensions label Feb 22, 2026
@raycastbot
Copy link
Collaborator

Congratulations on your new Raycast extension! 🚀

We're currently experiencing a high volume of incoming requests. As a result, the initial review may take up to 10-15 business days.

Once the PR is approved and merged, the extension will be available on our Store.

@xwzhangSZU xwzhangSZU marked this pull request as ready for review February 22, 2026 16:52
@greptile-apps
Copy link
Contributor

greptile-apps bot commented Feb 22, 2026

Greptile Summary

This PR adds a new Doubao TTS extension that enables text-to-speech functionality using the Volcengine Doubao TTS V3 API. The extension provides three commands: quick read (no-view toggle mode), voice selection (view mode with 90+ voices), and stop playback.

Key changes:

  • Smart text chunking by sentence/clause with 1024-byte limit per API request
  • Cross-command playback control via PID file with TOCTOU mitigation (process validation before kill)
  • Voice-model compatibility validation to prevent API errors
  • Comprehensive voice catalog organized by category (general, emotional, English, multilingual, accents)
  • Proper error handling with user-friendly messages and preferences access

Issues found:

  • Chinese error message on volcengine-tts.ts:174 violates Raycast's US English policy (must be fixed)
  • Missing metadata/ folder for view-type command screenshots (required before publishing)

Code quality:

  • Well-structured with proper separation of concerns (API client, audio player, text chunker)
  • Uses built-in fetch (Node 21+), proper TypeScript types throughout
  • Security: PID validation prevents accidentally killing unrelated processes
  • Configuration follows Raycast standards (Prettier, ESLint, changelog format)

Confidence Score: 4/5

  • Safe to merge after fixing the Chinese error message; metadata folder can be added before store publication
  • The implementation is solid with good security practices (PID validation) and proper error handling. One critical localization issue must be fixed (Chinese error message), and metadata folder should be added for store compliance. Code quality is high with no logical errors or security vulnerabilities.
  • Pay attention to extensions/doubao-tts/src/api/volcengine-tts.ts (line 174 has Chinese error message that must be translated to English)

Important Files Changed

Filename Overview
extensions/doubao-tts/package.json Configuration is well-structured with proper preferences, commands, and dependencies. Missing metadata folder for view-type command.
extensions/doubao-tts/src/api/volcengine-tts.ts Core TTS API client with streaming response parsing. Contains Chinese error message on line 174 that must be translated to English.
extensions/doubao-tts/src/utils/audio-player.ts Audio playback manager using afplay with proper PID validation to prevent TOCTOU attacks.
extensions/doubao-tts/src/quick-read.tsx No-view command with toggle functionality for quick TTS playback and proper error handling.
extensions/doubao-tts/src/read-with-voice.tsx View command displaying voice selection UI with category-based organization and playback controls.

Last reviewed commit: 1214623

Copy link
Contributor

@greptile-apps greptile-apps bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

22 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

const voiceConfig = getVoiceById(speaker);
if (voiceConfig && voiceConfig.model !== baseModel) {
throw new TTSApiError(
`音色「${voiceConfig.name}」需要 ${voiceConfig.model},但当前模型为 ${currentModel}。请在偏好设置中更换默认音色或模型版本。`,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chinese error message violates Raycast's US English policy

Suggested change
`音色「${voiceConfig.name}」需要 ${voiceConfig.model},但当前模型为 ${currentModel}。请在偏好设置中更换默认音色或模型版本。`,
`Voice "${voiceConfig.name}" requires ${voiceConfig.model}, but current model is ${currentModel}. Please change default voice or model version in preferences.`,

Context Used: Rule from dashboard - What: Do not implement custom localization logic in Raycast extensions; use the preferences API for ... (source)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit e769bbd. The Chinese error message has been translated to English.

Comment on lines +16 to +37
"commands": [
{
"name": "quick-read",
"title": "Quick Read Selected Text",
"subtitle": "Doubao TTS",
"description": "Read selected text with default voice. Trigger again to stop.",
"mode": "no-view"
},
{
"name": "read-with-voice",
"title": "Read with Voice Selection",
"subtitle": "Doubao TTS",
"description": "Browse 90+ voices and read selected text aloud",
"mode": "view"
},
{
"name": "stop-reading",
"title": "Stop Reading",
"subtitle": "Doubao TTS",
"description": "Stop the current TTS playback",
"mode": "no-view"
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ensure you create a metadata/ folder with Raycast-styled screenshots. The extension has a view-type command (read-with-voice with mode: "view"), which requires professional metadata screenshots in a metadata/ folder.

Context Used: Rule from dashboard - What: Extensions with view-type commands must include a metadata/ folder containing Raycast-styled... (source)

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit 995fee9. Added metadata/ folder with Raycast-styled screenshots (2000x1250).

@xwzhangSZU xwzhangSZU mentioned this pull request Feb 22, 2026
4 tasks
@0xdhrv 0xdhrv self-assigned this Mar 5, 2026
Copy link
Contributor

@0xdhrv 0xdhrv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me, approved ✅

@raycastbot raycastbot merged commit d7c540c into raycast:main Mar 5, 2026
2 checks passed
@github-actions
Copy link
Contributor

github-actions bot commented Mar 5, 2026

Published to the Raycast Store:
https://raycast.com/xianwei_zhang/doubao-tts

@raycastbot
Copy link
Collaborator

🎉 🎉 🎉

Such a great contribution deserves a reward, but unfortunately we couldn't find your Raycast account based on your GitHub username (@xwzhangSZU).

Please link your GitHub account to your Raycast account to receive your credits and soon be able to exchange them for some swag.

LlaziG added a commit to LlaziG/raycast-extensions that referenced this pull request Mar 7, 2026
- chore(hugeicons-ui):Update hugeicons-ui: bump @hugeicons/core-free-icons and @hugeicons/react
- [Skills] Display Metadata from SKILL.md frontmatter (raycast#26101)
- Update CODEOWNERs (c2c1e0d)
- Add timely extension (raycast#25085)
- Fix: copy prompt/answer for selected message (raycast#25438)
- Update CODEOWNERs (46ecffc)
- Update todoist extension (raycast#26087)
- Dia: update @raycast/utils to 2.2.3 (raycast#26091)
- Update CODEOWNERs (3503a64)
- Add typewhisper extension (raycast#25733)
- Update CODEOWNERs (5ea5ef7)
- Add number-research extension (raycast#26060)
- Update trustmrr extension (raycast#26085)
- Update CODEOWNERs (40aabef)
- Add desktoprenamer extension (raycast#24610)
- Update tailwindcss extension (raycast#26067)
- Update CODEOWNERs (7a13ffd)
- Update time-awareness extension (raycast#25765)
- Update CODEOWNERs (6c50032)
- Update github-status extension (raycast#26063)
- Update anna-s-archive extension (raycast#26076)
- Update CODEOWNERs (46b879a)
- Update shopify-developer-changelog extension (raycast#25711)
- Update CODEOWNERs (22aa04d)
- Update weather extension (raycast#26074)
- Update kagi-news extension (raycast#25679)
- Update (raycast#26073)
- Update teak-raycast extension (raycast#25995)
- otp-inbox: Add Windows support (raycast#25441)
- Update CODEOWNERs (36e7a5f)
- Add trustmrr extension (raycast#26069)
- Update CODEOWNERs (d7c540c)
- Add doubao-tts extension (raycast#25705)
- GitHub: Improve auto-merge support (raycast#25256)
- Update CODEOWNERs (9f556d5)
- Update microsoft-edge extension add new feat to search and launch workspaces (raycast#25335)
- Add RouteMesh MCP server to model-context-protocol-registry (raycast#25960)
- feat: Add Advanced Batch Rename command with rule-based engine (raycast#25501)
- Update media-converter extension (raycast#25836)
- Update scheduler extension (raycast#26059)
- Docs: Update the utils docs
- [pipe-commands] Add data formatting utilities (raycast#25824)
- Update CODEOWNERs (5b660b2)
- Add hdri-library extension (raycast#25701)
- Update CODEOWNERs (2ea8b9c)
- Update ente-auth extension (raycast#25773)
- Update CODEOWNERs (b9b9e2b)
- Add grpcui extension (raycast#25697)
- Update CODEOWNERs (1730346)
- Update openrouter model search extension (raycast#26045)
- System Monitor: Fix stale temperature readings in menubar (raycast#26025)
- Update CODEOWNERs (4e3ff41)
- Fix truncated row values in pass extension (raycast#25843)
- Update CODEOWNERs (489aede)
- Add quickreferences-raycast extension (raycast#23629)
- Update CODEOWNERs (84a0a58)
- Update cleanshotx extension (raycast#25985)
- [ccusage] Hide "Usage Limits" details when using non-OAuth authentication (raycast#26009)
- Browser Bookmarks: Add support for Perplexity Comet browser (raycast#25874)
- Add Windows support (raycast#25882)
- Update bmrks extension (raycast#25952)
- Update CODEOWNERs (2faa166)
- Update radarr extension (raycast#25953)
- Update CODEOWNERs (d8b0e95)
- Update google-chrome extension (raycast#25939)
- Add PrusaConnect links to Prusa extension (raycast#25955)
- Update CODEOWNERs (9f8c615)
- Claude Code Launcher: Fix Ghostty PATH by using interactive shell (raycast#25976)
- Update aave-search extension (raycast#26016)
- uuid-generator: add Pack Type Id command (raycast#25800)
- Update CODEOWNERs (39fe5d1)
- [ccusage] Fix npx path resolution for fnm installs using XDG directories (raycast#26008)
- fix(arc): prevent duplicate windows when Arc is not running (raycast#25806)
- System Monitor: Add pin-to-display for menubar stats (raycast#25821)
- Update CODEOWNERs (ec57b0b)
- Add unified Wispr Flow extension (raycast#25218)
- Update shadcn ui extension (raycast#26011)
- Update CODEOWNERs (b354d33)
- feat(gumroad): add price filter and copy actions (raycast#25703)
- Update CODEOWNERs (134d6f9)
- Add raycast-ai-custom-providers extension (raycast#25180)
- Update CODEOWNERs (4accbb2)
- Add zo-raycast extension (raycast#25464)
- Update CODEOWNERs (227732f)
- Add job-dojo extension (raycast#25677)
- Update CODEOWNERs (eace185)
- Add wallhaven extension (raycast#25656)
- Update existing somafm extension: launch flow, refresh toasts, menu fallback (raycast#25187)
- Update CODEOWNERs (d0f014f)
- Add email-finder extension (raycast#24847)
- Update cut-out extension (raycast#25990)
- Update CODEOWNERs (1ef7a10)
- Add cut-out extension (raycast#25663)
- [Pokedex] Added support for Scarlet & Violet–style sprite artwork (raycast#25986)
- Discogs extension new functions (raycast#25686)
- Update nhk-program-search extension (raycast#25967)
- Update kimi extension (raycast#25962)
- Update CODEOWNERs (de246c1)
- Update shiori-sh extension (raycast#25944)
- fix(browser-bookmarks): fix slow initial load and open-in-browser reliability (raycast#25979)
- Update CODEOWNERs (0ad09cd)
- Add spacer extension (raycast#25652)
- [zotero] Fix Zotero 7+ / Better BibTeX compatibility (raycast#25634)
- Docs: update for the new API release
- added ARM64 sdk support (raycast#25966)
- Update CODEOWNERs (3051c01)
- Add Bird extension (raycast#25481)
- Update CODEOWNERs (7c4f8af)
- Add Lock Time extension (raycast#25255)
- Update CODEOWNERs (cdc0ceb)
- Add paste-safely extension (raycast#25951)
- Update CODEOWNERs (bd032c8)
- Add polars-documentation-search extension (raycast#25589)
- Update CODEOWNERs (564b0f2)
- Add DevContainer Features extension (raycast#25603)
- Update CODEOWNERs (2cdb8f6)
- Update gift-stardew-valley extension (raycast#25552)
- Update CODEOWNERs (f728891)
- Update Inkdrop extension (raycast#25529)
- Sourcegraph: Setup improvements (raycast#25950)
- [Skills] Add support for updating skills (raycast#25887)
- Update CODEOWNERs (cb956f6)
- Add search repositories feature for Github for Enterprise (raycast#25661)
- Fix/trakt manager user agent v2 (raycast#25825)
- Update `CricketCast` extension - add menu bar for scores (raycast#25942)
- Add Windows platform support to Goodreads extension (raycast#25936)
- idonthavespotify: Add Qobuz, Bandcamp, Pandora support & fix crash on unknown adapters (raycast#25937)
- Update singularityapp extension (raycast#25943)
- Update raycast-surge extension (raycast#25883)
- Update awork extension (raycast#25844)
- Update extend-display extension (raycast#25894)
- Update git-worktrees extension (raycast#25898)
- [Image Modification] Fix QSpace / QSpace Pro selection detection (raycast#25923)
- Update zeabur extension (raycast#25924)
- Update vietnamese-calendar extension (raycast#25917)
- [AzTU LMS] Fix Color & Add New Image (raycast#25912)
- Update CODEOWNERs (c2aba2b)
- Add Hop extension (raycast#25162)
- [Music Assistant Controls]:  Big update with many features (raycast#25860)
- [MXroute] set mail hosting status + open webmail link (raycast#25895)
- Update kitty extension (raycast#25856)
- Update CODEOWNERs (b73dbee)
- Addeed SDK implementation (raycast#25820)
- Update CODEOWNERs (66857dc)
- Add notilight-controller extension (raycast#25424)
- Update raycast-store-updates extension (raycast#25865)
- Update reader-mode extension (raycast#25872)
- Update CODEOWNERs (f8eeb0d)
- Update battery-optimizer extension (raycast#25509)
- fix: show window icons on first load in window-walker extension (raycast#25871)
- Update CODEOWNERs (7e705b7)
- Update t3 chat extension (raycast#25803)
- Update CODEOWNERs (19f337b)
- Update modify-hash extension (raycast#25816)
- Update CODEOWNERs (64e21d0)
- Add `ZeroSSL` extension - list certificates, view + validate csr (raycast#25861)
- [Cron Manager] Fix tasks disappearing from UI & permission handling (raycast#25845)
- Update CODEOWNERs (abe1d59)
- Add markdown-converter extension (raycast#24129)
- Update betaseries extension (raycast#25842)
- [Skills] Inline detail Panel (raycast#25658)
- Update CODEOWNERs (f1bac6d)
- Removed two extensions (raycast#25851)
- Update CODEOWNERs (53db7b3)
- Add shiori-sh extension (raycast#25757)
- Docs: update for the new API release
- feat(everything-search): allow custom cli arguments (raycast#24607)
- Update CODEOWNERs (93ff0be)
- Delete extensions/proton-pass-client directory (raycast#25841)
- update (raycast#25840)
- Update CODEOWNERs (d85419c)
- Add kaneo-for-raycast extension (raycast#25461)
- [Apple Reminders] Prevent accidental recurring reminders from AI (raycast#25746)
- [Apple Notes] Fix AI tool note ID mismatch, timeout, and search filtering (raycast#25720)
- fix: show window icons on first load in window-walker extension (raycast#25818)
- [Namecheap] fix error when no domain dns hosts (raycast#25827)
- Update youversion-suggest extension (raycast#25797)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

new extension Label for PRs with new extensions platform: macOS

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants