Skip to content
dsh.fish
Bundle

dsh-read-aloud

A speaker button beside the Like button: read any assistant reply aloud with the browser's built-in speech engine, with speed and voice control. · 在点赞旁加一个小喇叭,朗读 DSH 的回复,支持倍速与音色。

Source
cccc12138
License
MIT
Updated
Updated yesterday

Readme

# dsh-read-aloud

English | [中文](README.zh.md)

A speaker button beside the Like button: read any DeepSeek Harness reply aloud.

Every finalized assistant message gets one extra action in the row it already
has, immediately to the right of 👍👎:

```
copy · 👍 👎 · 🔊 · branch
```

Click it and the reply is spoken by your browser's own speech engine. Nothing
is uploaded, no API key is involved, and no host-side code runs.

## Install

```sh
dsh plugin --profile web add dsh-read-aloud
```

Or install it from **Settings → Plugin Market**. Most installs go live after a
page refresh.

## Use

| Action | Result |
| --- | --- |
| Click the speaker | Starts reading this reply from the top |
| Click again while reading | Pauses; the icon becomes ▶ |
| Click again while paused | Resumes from the same sentence |
| Click another message's speaker | Stops the current one and starts that one |
| `Esc` | Stops immediately, wherever the pointer is |
| Hover the speaker | Opens the speed and voice panel |

The button shows three states: 🔈 idle, ⏸ reading, ▶ paused. Reading ends by
itself, and the icon returns to 🔈.

### Speed and voice

Hovering the button opens a small panel that stays with the message you are
listening to:

```
Speed   [0.5×] [0.75×] [1×] [1.25×] [1.5×] [1.75×] [2×]
Voice   [ System default ▾ ]
```

Both choices take effect on the sentence being read and are remembered in the
browser's local storage. Voices come from your operating system; the list is
sorted with Chinese voices first, and **System default** picks a voice matching
your interface language.

## What gets read

Replies are Markdown, and reading Markdown literally sounds terrible — URLs get
spelled out character by character and code blocks become noise. So the text is
cleaned first:

| Kept | Dropped |
| --- | --- |
| Prose and headings | Fenced code blocks (silently) |
| List items, with their markers removed | Table rows |
| Inline code content, without the backticks | Image syntax |
| Link labels | Link targets and bare URLs |
| Emphasis text, without `**` and `*` | HTML tags, file paths, emoji |

Long replies are read **in full** — nothing is truncated. The text is queued in
sentence-sized pieces rather than handed to the engine in one lump, because
several engines silently cut short or drop a single very long utterance.

## Requirements

- DeepSeek Harness **0.1.2-rc.1** or newer
- A browser with the Web Speech API. Speech comes from your operating system's
  installed voices, so an OS with no voice for the reply's language will stay
  silent — Windows and macOS both ship usable voices, and Edge exposes
  additional natural voices.
- If the engine is missing entirely, the button says so instead of failing
  silently.

## Privacy

- No network requests. The plugin never contacts a server.
- No API keys, no accounts, no telemetry.
- No host-side code: `lib/index.js` is an empty `apply` that exists only so the
  plugin appears in the profile's loader.
- Speed and voice live in your browser's local storage under
  `dsh-read-aloud/settings`. Clearing site data resets them to `1×` and
  **System default**; nothing else is affected.

## Compatibility

The plugin declares `engines.dsh >= 0.1.2-rc.1` and registers one entry in the
`conversation.chat.assistant-actions` slot at `order: 20`, so it sits beside the
shipped feedback entry (`order: 10`) without replacing it. It reads the reply
text through the slot's own `useChat` standard prop, so it needs no host RPC and
no DOM scraping.

## Development

```sh
npm test
```

The bundle is hand-written in the client-module format the web shell loads, so
there is no build step and no bundler — `lib/client.js` is shipped as authored.
The test loads that shipped file with a stubbed module graph and exercises the
text-cleaning, chunking, message-lookup and voice-listing helpers.

## License

MIT

Install

dsh plugin --profile web add github:cccc12138/dsh-read-aloud

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source