Skip to main content

dsh-omi-voice

34Stars0Forks0Issues1Watchers

Adds a 🔊 tap-to-read button to each AI response in DSH conversations, using Doubao TTS natural voice (BYOK, key stored locally in macOS engine only).

Evidence5/5methodologySourceInstallMaintenanceDSH versionSecurity scan
Machine-auditedInstall commandRepo verifieddsh-plugin topicLicenseREADMEAI wiki
Language
Swift
License
MIT
Branch
main
chinesedeepseek-harnessdsh-pluginread-aloudtext-to-speechttsvoice

Install

cmdweb profile
$ dsh plugin --profile web add dsh-omi-voice

Run the command above in your terminal to install this plugin via the dsh CLI. You can switch Profile in the top-right corner. New to dsh? Read the beginner tutorial

Install via your agent

Install the DeepSeek Harness plugin PolinniZhong/dsh-omi-voice for me: review the repository at https://github.com/PolinniZhong/dsh-omi-voice first, then run the install command and verify the plugin loads successfully.

Paste this instruction to the DSH Web GUI assistant — it will install and verify for you.

One-Line Pitch

Add a 🔊 button next to every AI response in DeepSeek Harness. Click it to have the local Omi engine call Doubao TTS 1.0 to read out the final response text. The Doubao API Key stays in your own Mac's Keychain (BYOK).

Core Features

  • Inject a three-state 🔊 button next to each assistant response: click once to read, click again while playing to pause, click again to resume from pause position
  • Only read the final response body; tool call logs, thinking processes, command executions, pure code fences, pure tables, and box drawings/ASCII graphics are filtered by the engine before the request. Button shows as disabled when there's nothing to read
  • Engine actively polls /v1/status to sync play/pause/failed/idle states. Show specific failure reason toast on read failure. Button auto-resets after engine disconnection
  • All text and playback control goes through local 127.0.0.1:8765 HTTP protocol. Plugin side does not store or touch the Doubao Key
  • Engine implements cost control: 3-second deduplication for identical text, 300ms throttle for any read, in-process LRU cache of 3 items/≤5MB, pure memory cleared on exit

Technical Implementation

  • Language: JavaScript (plugin side, runs in browser) + Swift 6 (Omi engine, separate source repo directory)
  • Key Dependencies: No runtime dependencies (dependencies in package.json is empty); browser side uses DSH built-in React; engine uses Foundation / AVFoundation / Network / Swift Concurrency
  • Architecture Pattern: DSH cordis client plugin, mounted via cordis.patch.yml with minimal Node placeholder entry, exports["./client"] + dsh.client.platform: web triggers client bundle auto-load; client registers read-aloud button component to conversation.chat.assistant-actions slot (client/lib/client.js:247-258), does not modify host Node side logic
  • Entry Files: Plugin entry host/lib/index.js (placeholder) + client entry client/lib/client.js; engine entries engine/Sources/ReadAloudConfig/main.swift and engine/Sources/ReadAloudService/main.swift, HTTP service in engine/Sources/ReadAloudService/LocalTTSService.swift

Use Cases

When you want to "listen" instead of "read" long DSH responses, replay AI answers while doing housework/commuting, or want visually impaired/low-vision users to hear AI answers on desktop. The cost is keeping an unsigned Omi engine running on your Mac and paying Doubao's per-character billing.

Prerequisites and Compatibility

DependencyMin VersionDescription
DeepSeek Harness (dsh web)Not declaredPlugin client injects via dsh.client.platform: web; Node entry is empty placeholder, package.json does not declare dshWorkshop / engines version
NodeNot declaredpackage.json does not declare engines.node; host/lib/index.js only serves as placeholder export
OSmacOS 13+ Apple SiliconEngine engine/Package.swift:6 declares platforms: [.macOS(.v13)]; engine/README.md:15 and engine/CHANGELOG.md:101 further restrict to Apple Silicon Mac, Windows/Linux engine unavailable
Xcode Command Line ToolsNo fixed versionEngine needs to be built from source with swiftc and codesign (engine/README.md:15, engine/build/build-service.sh)
Doubao TTS 1.0 ServiceConsole enable "Speech Synthesis 1.0"BYOK, need to create Access Key associated with this service in Volcano Engine console and fill in Omi engine settings page
Native ModulesNonePlugin dependencies: {}, no node:sqlite / node-pty etc.

Installation

dsh plugin --profile web add github:PolinniZhong/dsh-omi-voice

The engine (engine/, macOS menu bar App) needs to be separately built per engine/README.md and ditto to ~/Applications/Omi DSH.app. This repo's plugin install command won't install the engine for you.

Configuration

ConfigTypeDescriptionDefault
Engine HTTP AddresslocalStorage string (key dsh-omi-voice/engineBase)Base URL for plugin to call engine, e.g. to override when Omi engine port is changed or forwarded via SSHhttp://127.0.0.1:8765 (client/lib/client.js:58-65)

Doubao API Key, current voice, speech rate, etc. are managed by Omi engine independently and not in this plugin's config items; this plugin does not implement DSH cordis style ctx.config Schema.

FAQ

Q: Clicking 🔊 prompts "Omi DSH engine not detected" - what to do?

A: Engine is not running or closed. Open "Omi DSH" (Applications folder or ⌘+space search "Omi"), recommend checking "App Preferences > Launch at Login" in settings.

Q: Prompt says "Please configure Doubao API Key in Omi settings page first" - how to handle?

A: Engine is running but Key not saved. Open Omi settings page "API Key" item, follow README "Get Doubao API Key" three steps to enable "Speech Synthesis 1.0" in Volcano Engine console, create associated Access Key and fill it in; plugin itself has no Key input entry.

Q: Button is gray, clicking does nothing?

A: This response has no readable content after engine filtering (pure code, pure table, pure box drawing/ASCII graphics). Starting from v0.1.1, button shows as disabled and hover says "This response has no readable content", no Doubao request will be made.

Q: Can I switch Doubao voice? Is there voice selection UI in plugin?

A: No voice UI on plugin side, v1 protocol only returns current voice field; switching needs to be done in Omi engine settings page "Voice ID". Voice list endpoint /v1/voices is marked as v1.1 reserved in protocol.

Q: Is Windows or Linux supported?

A: Not supported. Omi engine only targets macOS 13+ Apple Silicon, needs to be built from source; although plugin JS part can load in any dsh web, without macOS engine there's no sound output.

Q: What's the difference from zero-config read-aloud plugins (like dsh-voice-chat)?

A: Zero-config types usually use system TTS, no Key needed, robotic voice, read entire paragraphs; this plugin uses Doubao TTS 1.0 natural voice, only reads final response and filters noise content, cost is BYOK per-character billing, needs Omi engine running locally.

Q: Where is data stored? Does it write chat history?

A: Engine does not save read text to disk, does not write history, does not callback any remote endpoints; plugin only communicates via 127.0.0.1. PRIVACY.md and docs/API.md §5 clearly state text and Key are not sent externally.

Q: How to uninstall?

A: Use dsh plugin --profile web remove github:PolinniZhong/dsh-omi-voice to remove plugin, then rm -rf "$HOME/Applications/Omi DSH.app" to delete engine; plugin uninstall also cleans up old version residual localStorage items (dsh-omi-voice/settings, dsh-omi-voice/autoSeq/*) at client.js:46-55 startup.

Getting Started Difficulty

Beginner — the plugin itself only exposes one button and optional engine address override. But to make it actually produce sound requires completing three extra things: build unsigned engine on Mac, apply for Doubao Access Key, fill into Omi settings page.

Known Issues and Limitations

  • Engine only supports macOS 13+ Apple Silicon (engine/Package.swift:6, engine/CHANGELOG.md:101), Windows / Linux have no corresponding build artifacts
  • Engine is currently "macOS Source Build Developer Preview", not completed Developer ID signing, notarization, installer distribution (engine/SECURITY.md:24, multiple declarations in engine/CHANGELOG.md), needs evaluation in isolated development environment
  • Protocol v1 does not implement long text auto-segmentation and prefetch, needs to wait for v1.1 (engine/CHANGELOG.md:103, docs/API.md:23); current text plays in ≤900 UTF-8 byte natural segments sequentially
  • Protocol v1 has no authentication token, any local process can call engine to trigger read; current impact is only "local speaker makes sound", both docs/API.md:172 and engine/CHANGELOG.md:104 note that if local file reading is supported later, token must be added
  • Starting from v0.1.1, auto-read and 📢 toggle removed (CHANGELOG.md:13), deliberately only click-to-read remains; product decision, please do not re-introduce
  • Current Keychain access strategy targets unsigned local development packages (engine/CHANGELOG.md:105),正式签名版本需要迁移到 Data Protection Keychain 与正式 Access Group

Read the usage guide →

Install steps, key points, FAQ and compatibility for this plugin — auto-derived from indexed fields.

Listing badge

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/PolinniZhong/dsh-omi-voice)

Paste this markdown into your GitHub README to link back to this listing. The badge only states the listing — not a security endorsement.

← Back to plugin directory