Preface

The philosophy of DSH is that “everything is a plugin.” In terminal agents, two operational costs are often underestimated: converting a command into a message when stepping away from the keyboard, and avoiding the need to read through large output word-by-word while a task is running. dsh-voice is a voice bundle for DSH, covering speech-to-text, text-to-speech, and walk-away reading. It defaults to a local-first approach; audio files are saved locally, with no automatic recording or playback.

What is it

Jesse-njx/dsh-voice is maintained by Jesse-njx, licensed under MIT, verified version 0.1.0, and requires Node.js >=20. It is a DSH bundle providing transcribe, speak, and /voice capabilities, and renders voice-note cards in the Web client.

Core Features

Speech-to-Text

transcribe supports two types of sources:

  • { file: <path> }: Transcribe an existing audio file.
  • { record: { seconds? } }: Transcribe audio recorded from the microphone.

The transcription result is inserted as a user message, displayed by the Web client as a voice-note card.

Text-to-Speech

speak accepts text, synthesizes and plays it in a background task, and immediately returns { jobId, audioRef }. It is suitable for walk-away narration during long builds or headless runs, such as synthesizing a result into a status announcement.

Auto-Read Replies

readReplies and /voice provide a session-level toggle for auto-reading replies, which is disabled by default. It can be toggled in real-time using /voice.

Local-First

Audio files are regular files under ~/.dsh/voice/, and session logs only save references and transcriptions. The default values are as follows:

  • stt.backend automatically selects from whisper-local to macos for offline processing.
  • tts.backend is say
  • readReplies is false
  • audioDir is ~/.dsh/voice

Backends

STT (Speech-to-Text) backends support whisper-local, openai, macos, and fake.

TTS (Text-to-Speech) backends support say, piper, edge-tts, and fake.

Cloud backends are only available when explicitly configured and will not be selected automatically.

Working with dsh-crosstalk

When dsh-crosstalk is installed, transcribe({ source, to: <peer> }) can send the transcribe result as a peer message to another local session.

Installation and Usage

First, ensure your local machine meets Node.js >=20, then execute the installation command:

dsh plugin --profile web add @dsh-voice/bundle

After installation, transcribe, speak, and /voice are provided by this bundle.

Typical Usage

Using /voice

The following commands are used to check status, toggle auto-reading, or directly read a line of text:

/voice status
/voice on
/voice off
/voice speak build finished, 0 failures

Calling transcribe

The following calls demonstrate file transcription and microphone recording transcription:

transcribe({ source: { file: "/path/to/note.m4a" } })
transcribe({ source: { record: { seconds: 5 } } })

source is either: an existing audio file path, or microphone recording parameters.

Calling speak

The following call demonstrates reading a text:

speak({ text: "build finished, 0 failures" })

It returns { jobId, audioRef }.

Sending to Another Local Session

When dsh-crosstalk is installed, you can call it like this:

transcribe({ source: { file: "/path/to/note.m4a" }, to: "<peer>" })

Use Cases and Considerations

Suitable for users who need to leave voice commands within a DSH session, want replies to be readable, or receive status announcements after long-running tasks.

Note the following limitations:

  • Plugins run with the permissions of the current dsh process; ensure you check the source code and license before installing.
  • Audio does not leave the local machine by default; it will only be sent to the cloud if you explicitly configure the following cloud backends:
stt.backend: openai
tts.backend: edge-tts
  • The openai backend reads credentials via OPENAI_API_KEY.
  • Recording and playback only occur on explicit tool calls; readReplies is disabled by default.
  • v0.1 non-goals include real-time streaming dialogue, outbound synthesized voice, group WeChat context audio, speaker separation, music/sound effects, raw audio into session logs, and wake words/continuous listening.

Conclusion

Following these steps, dsh-voice can turn voice input into user messages, convert replies into playable local audio, and maintain local storage by default.

GitHub: https://github.com/Jesse-njx/dsh-voice

Community Directory: A specific URL is not provided in the verified materials.