dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Russian-first Voice input for DeepSeek Harness: local GigaAM v3 with punctuation, and a speech registry fix that makes recognizer switching work
Русский Voice input для DeepSeek Harness. Одна установка — и в композере микрофон, который сразу понимает русский.
Штатный плагин Voice input заточен под китайский: единственный провайдер — SenseVoice, и в релизном чекпойнте русского нет. Замер на Apple M1 (26.09.2026, 28.6 с русской речи): SenseVoice int8 вернул пустую расшифровку (0 слов, WER 100 %) и всё равно занял ~600 МБ RAM.
Замеры — на M1 / 8.6 ГБ, синтез речи macOS say -v Milena. Это смоук, а не бенчмарк.
dsh plugin --profile web add https://github.com/tayuLuc/dsh-ru-voice-inputПерезапустите Web UI. Дальше — кнопка микрофона между моделью и Send: нажать, разрешить доступ, записать, Stop. Расшифровка вставляется в черновик.
Первое использование скачивает и проверяет модель (ревизия и SHA-256 закреплены) в ~/.dsh/models/gigaam-v3-ctc/. SenseVoice не качается: в этом бандле его нет, у него нет русского.
Если pnpm ругается на ERR_PNPM_IGNORED_BUILDS — разрешите сборку нативного рантайма в ~/.dsh/profiles//pnpm-workspace.yaml:
allowBuilds:
onnxruntime-node: true
koffi: trueОдин пакет, четыре слоя, формально те же четыре строки, что у штатного Voice input:
Слой · Что это ./lib/registry.js · форк speech-to-text с починенным configure() ./lib/gigaam/index.js · провайдер GigaAM v3 CTC на onnxruntime-node или transcribe-cpp @deepseek-ai/dsh-experimental-api-speech-to-text · мост браузер↔хост, штатный @deepseek-ai/dsh-experimental-client-ui-voice-input · кнопка микрофона, штатная
Дефолты: распознаватель gigaam-v3-ctc-local, язык ru. Свежий профиль работает без кликов.
Слои 1 и 2 заданы относительными спецификаторами — загрузчик их резолвит внутри пакета. Так бандл остаётся самодостаточным: пакет, поставленный из git, не может зависеть от собственных подкаталогов.
Движок выбирается конфигом engine. По умолчанию auto: на Apple Silicon берётся mlx, везде остальное — onnx-asr.
engine · Что внутри · Mac · Nvidia · CPU · Пунктуация auto · выбирает сам · есть · есть · есть · есть mlx · gigaam-mlx, чистый MLX · есть · нет · нет · есть onnx-asr · onnx-asr, e2e через onnxruntime · есть · есть, CUDA · есть · есть gguf · GGUF Q8_0 через transcribe-cpp · есть, Metal · есть, CUDA · есть · нет onnx · int8 через onnxruntime-node · есть · есть · есть · нет
Замеры на Apple M1, прогретые, русская речь 5 с и 28.6 с:
движок · RTF 5 с · RTF 28.6 с mlx (e2e ctc) · 0.027 · 0.017 onnx-asr (e2e ctc) · 0.048 · — gguf (Q8_0) · — · 0.016 onnx (int8) · 0.038 · 0.043
Пунктуацию дают только e2e-движки. Словарь CTC-голов GigaAM — 34 токена: ▁, 32 русские буквы и `. Знаков препинания в нём нет физически, поэтому gguf и onnx` не могут их выдать ни при какой настройке.
Пример одного и того же места: панель а показывает (CTC) против Панель A показывает (e2e).
Кванты зависят от платформы, и это учтено: MLX-кванты годятся только на Apple Silicon, GGUF работает и через Metal, и через CUDA, а ONNX int8 — единый формат для всех.
Python ≥ 3.10 и ffmpeg в PATH:
uv venv ~/.dsh/venvs/gigaam-mlx --python 3.12
uv pip install --python ~/.dsh/venvs/gigaam-mlx/bin/python \
"gigaam-mlx @ git+https://github.com/aystream/gigaam-mlx.git"
uv pip install --python ~/.dsh/venvs/gigaam-mlx/bin/python onnx-asr onnxruntimeОдин venv обслуживает оба сайдкара; на не-Apple достаточно поставить только onnx-asr. Путь ищется так: e2ePythonPath, иначе $GIGAAM_MLX_PYTHON, иначе /venvs/gigaam-mlx/bin/python. Веса движок качает сам в кэш Hugging Face.
Цена первого запроса. В свежем процессе движок компилирует пайплайн: первый ответ ~1.7 с против 0.13 с прогретого. idleTimeoutMs: 0 ставить не стоит — воркер должен переживать паузу между записями.
Распознаватели маленькие, и имена они коверкают. Ни один из рантаймов не умеет hotword-биасинг, поэтому коррекция идёт по тексту после распознавания.
Словарь — JSON-массив в ~/.dsh/stt-lexicon.json:
["Sisyphus", "авто-брайн", "dsh", "GigaAM", "obsidian"]Термин подставляется только если его нет в тексте и найденное слово достаточно похоже (lexiconThreshold, по умолчанию 0.8). Порог режет и ложные срабатывания, и случаи вроде Сизифус → Sisyphus: восстановить тяжёлую транслитерацию строковой мерой нельзя, и гадать хуже, чем оставить слово как есть. Чистые случаи вроде дш → dsh и гигаам → GigaAM ловятся, потому что сводятся через одну раскладку букв.
Штатный configure() проверяет текущий язык против нового провайдера:
const id = patch.providerId ?? this.config.defaultProvider.get();
this.selectedProvider(id, patch.language ?? this.config.language.get());Из-за этого смена распознавателя невозможна, когда сохранённый язык не входит в список нового провайдера. В настройках это выглядит как «выбрал — откатило», и выхода нет: выбрать русский можно только у провайдера, который русский уже поддерживает.
Фикс: голое переключение провайдера берёт язык, который новый провайдер принимает, — сначала сохранённый, иначе первый в его списке. Явно заданный язык по-прежнему проверяется и по-прежнему отвергается вслух.
Контракт сервиса не изменён: имя speechToText, схема конфига и все методы те же, поэтому штатные мост и UI работают против форка без изменений.
npm test # реестр (11 проверок) + словарь (12 проверок)
node test/provider.mjs <clip.wav> # провайдер: регистрация, prepare, расшифровкаУ провайдера есть отрицательный контроль: тишина обязана дать пустой текст, иначе сломанная модель прошла бы как рабочая.
Живой замер движка:
node test/provider.mjs <clip.wav> ~/.dsh/models/gigaam-v3-ctc auto # или onnx-asr, mlx, gguf, onnx
node scripts/models.mjs # что лежит на диске и что можно убрать
node scripts/selftest.mjs <clip.wav> ~/.dsh/models/gigaam-v3-ctc onnx # замер только Node-движковRNNT вместо CTC в движке `e2e`. Сейчас по умолчанию ctc — он быстрее. rnnt заявлен точнее (~77× против ~330× realtime у автора на M2 Max), обе ветки с пунктуацией. Переключается конфигом e2eModel, без переустановки.
Память. По умолчанию воркер освобождается через 120 с простоя. idleTimeoutMs: 0 держит его загруженным постоянно — на ноутбуке этого стоит избегать.
MIT. Форк реестра — производная от @deepseek-ai/dsh-experimental-speech-to-text (база 0.2.1-rc.2, lib/ идентичен 0.1.7-rc.2). Совместимость с хостом задаётся engines.dsh (>=0.2.1-rc.2), а не пином версии: гейт dsh-app-boot проверяет бандл по этой строке. Веса модели не входят в поставку: провайдер тянет их сам по закреплённой ревизии.