Introduction¶
In the Web GUI of DeepSeek Harness (DSH), assistant replies are plain text, and long replies can only be viewed line by line. If you already hold a Fish Audio API Key and your own voice model, the missing piece is just a layer of glue to connect these capabilities into the Web GUI—you don’t need to copy text to other tools, nor do you need to write scripts to call the API. The dsh-fish-tts introduced below does exactly that.
What is this¶
dsh-fish-tts is a third-party Text-to-Speech (TTS) plugin for the DSH Web GUI, maintained by MaRi23333, licensed under MIT, and currently at version 0.2.11. It supports only the Fish Audio API and requires a self-provided Key; the plugin does not distribute or host any Keys. It has been adapted and verified for the session API and UI icon changes in DSH 0.1.2-rc.1, requiring Node >= 22 (Node 20 has reached End of Life).
Regarding integration, the client registers three slots: conversation.chat.assistant-actions, conversation.input.left, and settings.section. These correspond to the message operation bar, the input box toolbar, and the settings page, respectively. Consequently, the Read Aloud button, Auto Read toggle, and settings page appear at the corresponding locations in the native interface.
Core Features¶
Read Aloud for Each Message¶
There is a “Read Aloud” button on the operation bar of each finalized assistant message. Clicking it synthesizes and plays that reply:
- Clicking it again while playing stops it, and does not replay from the beginning;
- Clicking a button on another message switches playback directly;
- Clicking it again while waiting for synthesis cancels the request.
Markdown is cleaned before synthesis, so paths, URLs, long numbers, and code blocks will not be read aloud.
Auto Read¶
There is an “Auto Read” toggle in the input box toolbar (syncs with the settings page). When enabled, it automatically reads new replies generated after the page loads.
Settings Page¶
The entry point is Settings → Voice (Fish TTS). Configurable options include:
- TTS Model: A dropdown with manual input support; supports
s2.1-pro-free/s2.1-pro/s2-proetc.; defaults tos2.1-pro-free. - Voice
reference_id: Required. Voice data is personal; the plugin does not provide a default voice. - API Key: AES-256-GCM encrypted storage.
- HTTP Proxy: Fill this in if direct connection fails.
- Preview Button, Volume Slider (default 60%), Speed Slider (0.5–2.0×, no pitch change; fixed at 1× if the browser does not support it).
All settings take effect immediately upon saving, and no restart is required. Reading and previewing both use the voice you configured. You can use your own Fish voice reference_id, including voices you have cloned yourself. The interface is bilingual and follows the DSH language settings.
Installation and Activation¶
Install from npm (recommended):
npx @deepseek-ai/dsh plugin --profile web add dsh-fish-tts
After installation, restart the dsh web (close the terminal and run dsh web again) and refresh the page.
You can also install from GitHub; the repository has the lib/ build artifacts committed, so a git installation does not require local building:
npx @deepseek-ai/dsh plugin --profile web add github:MaRi23333/dsh-fish-tts
A known pitfall: when switching from the GitHub version to the npm source, the bare package name add dsh-fish-tts is a silent no-op for an installed git version. You need to use @latest, or remove then add:
npx @deepseek-ai/dsh plugin --profile web add dsh-fish-tts@latest
Configuration and First Use¶
Following the steps above, the plugin is installed. Next, complete the first configuration in the settings page:
- Open Settings → Voice (Fish TTS);
- Fill in the API Key and voice
reference_id; - Click Save Settings, and the API Key status becomes “Configured”;
- Click Preview to verify—the Preview button stays grayed out if not saved or if the voice is empty.
You can also add config as a default value to the fish-tts line in the profile’s cordis.patch.yml (this will be overridden by the value saved in the settings page):
- id: fish-tts
config:
model: s2.1-pro-free
format: wav
stateDir: /custom/state/dir
Security and Limitations¶
- API Key Storage: The API Key is stored on disk in
$DSH_HOME/fish-tts/settings.jsonusing AES-256-GCM encryption. The key filekey.binis generated automatically and ACLs are tightened on Windows. The Key does not appear in any GET responses, logs, or the repository. - Local Use Only: All
/fish-tts/*routes reject requests from non-loopback sources (127.0.0.1 / ::1 / ::ffff:127.0.0.1) (403), even if the host is listening on 0.0.0.0. - Write Interfaces: The write interfaces (
synthesize/config) forceapplication/jsonand validate the same-origin/loopback Origin. - Proxy: The proxy does not support addresses with username/password (rejected on save); environment variables
HTTPS_PROXY/HTTP_PROXYwith credentials are ignored. - Limits: The synthesis request text limit is 12,000 characters. Results are cached in the process, up to 200 entries, and are cleared on restart.
Applicable Scenarios and Notes¶
Suitable for: Users who already have a Fish Audio account and Key, and want to use their own voices (including self-cloned voices) in the DSH Web GUI to listen to replies.
Notes:
- You can only use voices you have permission to use (
reference_id); unauthorized cloning or mimicking of public figures, celebrities, or others’ voices is prohibited. When distributing generated audio externally, it is recommended to proactively disclose it as AI-generated content. - The Fish Audio free quota is for personal, non-commercial use only; commercial use requires subscribing to the official paid plans.
- This project is an independent community project and has no affiliation, partnership, or endorsement relationship with Fish Audio / Hanabi AI Inc., nor with DeepSeek.
- The plugin runs with the current dsh process permissions. It is recommended to check the source code and license before installation.
Conclusion¶
To recap: dsh-fish-tts connects Fish Audio’s synthesis capabilities to the DSH Web GUI—one-click read aloud next to messages, auto-read in the input bar, unified management of models, voices, and encrypted keys in the settings page, with configurations taking effect immediately upon saving. Repository and directory page:
- GitHub: https://github.com/MaRi23333/dsh-fish-tts
- Community Plugin Directory Page: https://www.skillhub.cn/plugins/MaRi23333/dsh-fish-tts