# dsh-voice-ai-girlfriend: giving a DeepSeek Harness plugin a voice and a face

> This project is a plugin for the DeepSeek Harness that turns a text chat into a speech-to-speech conversation, with Chinese speech recognition on the way in, a cloned voice on the way out, and a digital human window that lip-syncs while it speaks. It is Windows-only, needs an NVIDIA card, and is written around six running services.

**beiyege-01/dsh-voice-ai-girlfriend** — 语音 AI 女友（Voice AI girlfriend for DeepSeek Harness）：Whisper 语音输入 + Qwen3-TTS 声音克隆 + 句子级流式朗读 + 数字人动画窗。插话/排队双模式，说话即打断。

- Repository: https://github.com/beiyege-01/dsh-voice-ai-girlfriend
- Stars: 712 · Forks: 220
- Language: TypeScript
- License: NOASSERTION
- Published: 2026-10-22 · Updated: 2026-10-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/beiyege-01-dsh-voice-ai-girlfriend

## A voice pipeline stitched from six services

The architecture diagram in the README is the fastest way to understand the project. A browser hosts the DeepSeek Harness web interface on port 3080, with a conversation panel on the left holding the microphone and a companion window on the right playing the digital human video. From the browser, microphone capture goes to speech recognition, then to the agent's reply, then to text to speech, then to playback. Underneath sits a voice bridge on port 8765, which exposes the endpoints for recognition, for cloned speech, for the digital human, for the messaging bridge and for voice activity detection. The digital human itself runs as a separate container on port 8383, and the messaging side runs through NapCat with OneBot over HTTP and WebSocket. The README notes the bridge talks to the harness over a WebSocket and to the digital human over HTTP with CORS, and that the two directions are separate: the reply text goes to the digital human, and the reply text goes to the messaging side.

## Latency and noise rejection are the two features the README leads with

The README lists the personality traits, and the two that carry technical content are speed and pickiness. On speed, the claim is that it starts speaking within half a second of you finishing, with FunASR Chinese recognition taking about 150 milliseconds and the text to speech almost instant. On noise, the design is a minus 35 decibel noise gate combined with silero voice activity detection as a double check, so that fans, keyboards and television do not register and only your speech does. The barge-in behaviour is the other half of the interaction model. Interrupt it and it stops talking and listens, and if you would rather it finished, a switch puts it back into a queueing mode where replies are spoken one after another. The README describes the digital human toggle as the difference between video with synchronised speech and a close to instant pure voice read, and the switch list also covers pushing to the messaging app, the companion window and the barge-in versus queue mode.

## Streaming digital human video, segmented so it keeps up with speech

The digital human is the most involved part, and the README describes it in enough detail to understand why. A long reply is cut into segments of ten seconds or less, the picture for one segment is generated while the speech for the next is being synthesised, and the segments play one after another continuously, with the speech and the lip movement in sync. The result is that the video keeps pace with the answer instead of appearing after it. The digital human itself is a DUIX container running on the host with a cold start of one to three minutes, and the memory cost is substantial. The README lists the measured video memory use as four to six gigabytes when generating, and the whole chain with speech and the digital human working at once peaks at around fifteen gigabytes, which fills a sixteen gigabyte card. The recommendation is to stagger the two, letting the speech finish synthesising before the video generation starts, and sixteen gigabytes is called the recommended configuration with eight described as very tight and not recommended.

## Voice cloning, and how the voice is chosen

The output voice is not a fixed preset. The text to speech uses OmniVoice with voice cloning across more than six hundred languages, and the timbre is determined either by a reference audio clip you supply or by parameters you design, so the README says she can grow into a voice you like. The directory layout backs this up. The voices directory is self-created, with one subfolder per timbre, and it is separate from the assets directory, which holds five built-in idle animations under bg-images plus optional spare talking animations under task-videos. The README is explicit that the digital human video takes over once the switch is on, and that you can add your own idle animations by creating subfolders. The models directory, holding the FunASR and silero VAD models, is gitignored and not in the repository.

## One script to start the whole chain, in six idempotent steps

The recommended start path is a single script. You open Docker Desktop first, then double click bridge/start-full-stack.cmd, and the script brings up the whole chain in the right order and prints a self-check table at the end, with the browser opening a link that carries a token.

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File bridge\start-full-stack.ps1 -NoBrowser
```

The README lays out the six steps and marks the setup steps as idempotent, with the last two read-only, meaning you can run it again without breaking what is already up. Step one checks the Docker engine and the digital human container, starting the container if needed and waiting for port 9000 to answer, skipping anything already running. Step two calls a PowerShell script to start OmniVoice under WSL2 on port 9877, syncing the bridge config IP and bringing up the bridge on 8765. Step three is a bridge safety net that starts it if it is down and restarts it when the API key is missing, which the README ties to the balance badge returning a 503. Step four starts the harness web interface on 3080 with a tokenised link and never interrupts an existing session if 3080 is already serving. Step five reports the digital human state, the container, the segment progress and the submit counters, and step six summarises each link as OK or FAIL. The parameters let you start only the voice stack, use the older release, skip the browser, pull up the messaging client as well or skip the Docker check.

## The plugin contract, and the version table that has to match

Because this is a plugin for another project, the version compatibility is the first thing to check, and the README has a table for it. The harness is used at 0.1.3-alpha.1 with the web-v013 profile on port 3080, with an older release compatible at rc.8 with the web profile. The plugin itself is version 0.3.0 in a separate package repository, built with a Node build script, and the bridge is a single FastAPI file on uvicorn with a Python 3.14 virtual environment. The text to speech engine is OmniVoice under WSL2 with FlashInfer, the digital human is a specific DUIX image, and Docker Desktop 29.x is expected. The README explains that the plugin protocol is a bundle manifest plus dock and left slot contracts, that it was implemented against the older release, and that it was tested against the newer one in September 2026 with the slots, module loader and session prompt contract unchanged and no code changes needed. The recommended install is a plugin command against the GitHub source, and the balance tracking uses a composer dock slot.

## The repository is small, and the heavy parts live elsewhere

The top-level entries are the license, the readme, a gitignore and four directories. The bridge directory holds the standalone Python and FastAPI bridge, the configuration template, the requirements file and the cmd scripts for starting the bridge alone or the bridge and the web interface together. The assets directory holds the built-in idle animations and the optional talking videos. The dsh-plugin directory holds the client plugin source for the microphone, the switches, the companion window, the digital human and the streaming read, with a readme describing how to install it into the harness. The docs directory holds the development log. The models directory, with the FunASR and silero VAD models, is excluded from the repository, and the README estimates the repository and asset footprint at about eight megabytes, the Python environment and its dependencies including PyTorch at five to eight gigabytes, and the recognition model on top of that.

## Conclusion

dsh-voice-ai-girlfriend fits a Windows developer on the DeepSeek Harness who wants a spoken, animated companion rather than a text box, and who is prepared to run a FastAPI bridge, a TTS service under WSL2 and a digital human container alongside the IDE. It does not fit a Linux or macOS developer, and it does not fit a machine without an NVIDIA GPU, since the README is explicit that the inference depends on CUDA. Verify first that you have a supported NVIDIA card with enough memory for the full chain, that you have a DeepSeek Harness source tree to install the plugin into, and that the versions in the compatibility table still match what you have.

## FAQ

### What does dsh-voice-ai-girlfriend add to the DeepSeek Harness?

It turns the text chat into a speech-to-speech conversation with a companion window. Speech goes in through a microphone, is recognised, sent to the agent, spoken back with a cloned voice, and played alongside a digital human video that lip-syncs while it speaks.

### What hardware does dsh-voice-ai-girlfriend need?

Windows 10 or 11 64 bit, an NVIDIA discrete GPU with 16GB of video memory recommended, 16GB of system memory, and at least 30GB of free disk. The README states that without an NVIDIA card the project cannot be installed because the model inference depends on CUDA.

### How do I start the whole stack?

Open Docker Desktop first, then run the start-full-stack script, which brings up the services in order and prints a self-check table, opening the browser with a tokenised link. The setup steps are idempotent, so re-running them does not disturb sessions that are already up.

### Can I interrupt it while it is speaking?

Yes. By default, interrupting makes it stop talking and listen to you, and a switch puts it back into a queueing mode where it finishes the reply before handling the new input. Both the mode and the digital human, messaging push and companion window switches are available as one-click toolbar controls.

## Sources

- [beiyege-01/dsh-voice-ai-girlfriend on GitHub](https://github.com/beiyege-01/dsh-voice-ai-girlfriend)
- [Issues](https://github.com/beiyege-01/dsh-voice-ai-girlfriend/issues)
- [README](https://github.com/beiyege-01/dsh-voice-ai-girlfriend/blob/main/README.md)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/beiyege-01-dsh-voice-ai-girlfriend
