In-chat read-aloud for DeepSeek Harness: tap to read, pause and resume AI replies with natural Doubao TTS voices (BYOK), reading only the final answer with code, tables and diagrams filtered; local engine, plugin keeps no API key.
Install
# from npm (prebuilt)
dsh plugin --profile web add dsh-omi-voice
# from GitHub (first run asks for allowBuilds approval — follow the hint, retry)
dsh plugin --profile web add github:PolinniZhong/dsh-omi-voice
Any plugin you install runs third-party code with your own permissions — it can read your files, use your credentials, and reach the network, and tool approvals don’t sandbox it. GitHub-sourced plugins also run build scripts at install time — pnpm blocks those until you allow them, so an install can stop with ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED or ERR_PNPM_IGNORED_BUILDS; dsh prints the exact key to add under allowBuilds in your profile’s pnpm-workspace.yaml, and the install works on the next run. Allowing a build is a trust decision: only install sources you trust, and pin a commit (github:owner/repo#sha).
README
中文 | English
Hear AI replies in DeepSeek Harness (DSH) spoken aloud in a natural Doubao TTS voice. Voice synthesis runs in a local Omi engine on your Mac, and your Doubao API Key stays in your own Keychain (BYOK) — the plugin never touches your key.
Overview
| Item | Description |
|---|---|
| Name | dsh-omi-voice |
| Platform | DeepSeek Harness (dsh web, incl. desktop) + macOS Omi engine v0.1.3+ |
| Problem solved | DSH's built-in TTS (system voice / Edge TTS) sounds robotic; clipboard tools force you to copy first |
| How it works | Tap 🔊 on a reply to read / pause / resume; reads only the final answer — tool logs, code, tables, diagrams are filtered out before synthesis |
| Voice | Doubao TTS 1.0 (seed-tts-1.0), natural Chinese voice, pause/resume from where you paused |
| Privacy | API Key lives in the Omi engine's macOS Keychain; plugin has zero key access; localhost-only (127.0.0.1) |
| Cost | BYOK, billed by character; in-memory LRU cache + dedup avoid repeat billing |
| License | MIT |
Get started in 3 steps
- Install the plugin and build/open the Omi engine (see "Getting a Doubao API Key" and "Installation" below).
- Save your Doubao API Key once in the Omi engine settings.
- Tap 🔊 next to any AI reply in DSH to hear it.
flowchart LR
A[Tap 🔊] --> B[Plugin extracts the final answer text]
B --> C[POST 127.0.0.1:8765/v1/speak]
C --> D[Omi engine cleans + segments]
D --> E[Doubao TTS streaming synthesis]
E --> F[Local speaker playback]
Getting a Doubao API Key (first-time users)
This plugin is BYOK: Doubao speech is billed to your own Volcengine account by character count. Three steps:
Step 1 · Find "Doubao Speech": log in to the Volcengine Console and open the "Doubao Speech" (speech technology) service.
Step 2 · Enable "Speech Synthesis 1.0": enable the "Speech Synthesis 1.0" product in the service list.
Step 3 · Create an API Key: when creating an Access Key, link it to the "Speech Synthesis 1.0" service you enabled; paste the resulting API Key into the Omi engine settings ("Settings > API Key") and save.
The API Key is stored only in the Omi engine's macOS Keychain — the plugin has zero key access and nothing leaves your machine.
Installation
dsh plugin --profile web add "github:PolinniZhong/dsh-omi-voice#v0.1.3&path:/"
For local development you can install a directory directly:
dsh plugin --profile web add /path/to/dsh-omi-voice
Engine (Omi DSH) build steps: see engine/README.md — run ./engine/build/build-service.sh, then ditto the result to ~/Applications/Omi DSH.app.
Usage
- Tap 🔊 to read; tap again while playing = pause; tap again = resume from where you paused; tapping 🔊 on another message interrupts and reads the new one.
- Reads only the final answer: tool execution logs and thinking are not read; code fences, tables, and pure graphics (box-drawing/ASCII) are filtered before the request — replies containing only such content show a disabled button with "nothing to read".
- When the engine is off or the key is missing, tapping shows a clear hint (including where to open Omi).
Cost transparency
Doubao TTS (seed-tts-1.0) is billed by character to your Volcengine account. Therefore:
- Synthesis happens only when you manually tap 🔊 — no auto-read;
- The engine dedups identical text within 3 seconds and keeps an in-memory LRU cache (last 3 items, ≤5MB, memory-only, cleared on quit) so re-reading recent content doesn't re-bill;
- Replies with no speakable content (pure tables/code) never hit the TTS API (
invalid_text).
Architecture & protocol
The plugin is just a "remote control": playback, speed, pause/resume, caching, and text cleaning all happen in the Omi engine. Protocol: docs/API.md (/v1/status, /v1/speak, /v1/pause, /v1/resume, /v1/stop).
FAQ
| Question | Answer |
|---|---|
| Tap 🔊 shows "Omi DSH engine not detected" | Open the "Omi DSH" app (~/Applications or press ⌘Space and search "Omi"); consider enabling "Launch at login" |
| "Configure your Doubao API Key in Omi settings" | Open "Omi DSH" settings and save the key once (see "Getting a Doubao API Key") |
| Button is greyed out / nothing happens | The reply has no readable content (pure code/table/diagram), auto-filtered |
| Can I change the voice? | Yes, via the Omi engine settings "Voice ID" (the plugin has no voice picker yet) |
| Windows support? | Not yet — the Omi engine is macOS Apple Silicon only |
| vs. dsh-voice-chat | It is free/no-key but uses the robotic system voice; this plugin uses the natural Doubao voice at the cost of BYOK character billing |
Related
- Engine: this repo's
engine/(Omi DSH local engine, Swift source + build scripts) - Ecosystem: awesome-dsh-plugin
Project docs
- AGENTS.md — agent instructions (Codex convention)
- docs/DESIGN.md — architecture & design
- docs/DECISIONS.md — design decision log
- docs/MEMORY.md — long-term knowledge (gotchas & conclusions)
- docs/HANDOFF.md — handoff & continuation
- docs/API.md — local protocol
License
MIT
Community comments
Comments are public GitHub Discussions. Loading them connects to GitHub and Giscus; a GitHub account is required to post.