@drakulavich/kesha-voice-kit 1.22.0 → 1.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/NOTICES.md CHANGED
@@ -33,6 +33,16 @@ Text-to-speech (Russian, 5 baked-in speakers). Apache 2.0. Model: [alphacep/vosk
33
33
 
34
34
  **Runtime code:** Originally pulled from `crates.io` as `vosk-tts-rs 0.1.0`. As of #216 the runtime subset is **vendored** under `rust/vendor/vosk-tts/` (Apache 2.0; copied from [`andreytkachenko/vosk-tts-rs`](https://github.com/andreytkachenko/vosk-tts-rs) — see `rust/vendor/vosk-tts/LICENSE` and `rust/vendor/vosk-tts/NOTICE`). The vendored copy drops the upstream gRPC server/CLI/HTTP-model-fetch modules and replaces the `tokenizers` crate with a small inline BERT WordPiece tokenizer, eliminating the `prost`, `tonic`, `tokio`, `axum`, `hyper`, `reqwest`, `tokenizers`, `onig_sys`, `esaxx-rs`, `bzip2-sys`, `lzma-sys`, and `zstd-sys` transitive dependencies that broke Windows MSVC linkage.
35
35
 
36
+ ### klebster — CharsiuG2P byt5-tiny ONNX (multilingual G2P)
37
+
38
+ Grapheme-to-phoneme for es/fr/it/pt Kokoro voices (`kesha install --tts`, #212).
39
+ CC-BY 4.0. ONNX export by [klebster](https://huggingface.co/klebster/g2p_multilingual_byT5_tiny_onnx)
40
+ from the original CharsiuG2P model.
41
+
42
+ **Original model:** Zhu et al. 2022, "Multilingual Grapheme-to-Phoneme Conversion
43
+ with Language Neutral and Language Specific Representations",
44
+ [arXiv:2204.03067](https://arxiv.org/abs/2204.03067).
45
+
36
46
  ### misaki-rs (English G2P)
37
47
 
38
48
  Embedded grapheme-to-phoneme for English (Kokoro pipeline, #207). MIT. Source: [`misaki-rs`](https://github.com/MicheleYin/misaki-rs).
package/man/kesha.1 CHANGED
@@ -1,4 +1,4 @@
1
- .TH KESHA 1 "May 2026" "kesha" "User Commands"
1
+ .TH KESHA 1 "2026" "kesha" "User Commands"
2
2
  .SH NAME
3
3
  kesha \- open-source local voice toolkit
4
4
  .SH SYNOPSIS
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drakulavich/kesha-voice-kit",
3
- "version": "1.22.0",
3
+ "version": "1.23.0",
4
4
  "description": "Give your tools a voice — speech to text and back, 25 languages, up to ~19× faster than Whisper. On your machine.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -29,10 +29,16 @@
29
29
  "openclaw": {
30
30
  "extensions": [
31
31
  "./openclaw-plugin.cjs"
32
- ]
32
+ ],
33
+ "compat": {
34
+ "pluginApi": ">=2026.5.27"
35
+ },
36
+ "build": {
37
+ "openclawVersion": "2026.5.27"
38
+ }
33
39
  },
34
40
  "keshaEngine": {
35
- "version": "1.22.0"
41
+ "version": "1.23.0"
36
42
  },
37
43
  "scripts": {
38
44
  "test": "bun test",
@@ -62,9 +62,24 @@ const VAD_FILES: PlanFile[] = [
62
62
  { relPath: "models/silero-vad/silero_vad.onnx", sizeBytes: 2_327_524 },
63
63
  ];
64
64
 
65
+ // klebster CharsiuG2P byt5-tiny ONNX export (CC-BY 4.0 — see NOTICES.md).
66
+ // 3 files enabling multilingual G2P for es/fr/it/pt Kokoro voices (#212).
67
+ const G2P_CHARSIU_FILES: PlanFile[] = [
68
+ { relPath: "models/g2p/byt5-tiny/encoder_model.onnx", sizeBytes: 12_478_704 },
69
+ { relPath: "models/g2p/byt5-tiny/decoder_model.onnx", sizeBytes: 11_983_268 },
70
+ { relPath: "models/g2p/byt5-tiny/decoder_with_past_model.onnx", sizeBytes: 5_427_260 },
71
+ ];
72
+
65
73
  const KOKORO_FILES: PlanFile[] = [
66
74
  { relPath: "models/kokoro-82m/model.onnx", sizeBytes: 325_532_387 },
67
75
  { relPath: "models/kokoro-82m/voices/am_michael.bin", sizeBytes: 522_240 },
76
+ // Multilingual voice packs for es/fr/it/pt (#212).
77
+ // em_alex (es, male), ff_siwis (fr, female — only French voice in Kokoro v1.0),
78
+ // im_nicola (it, male), pm_alex (pt, male).
79
+ { relPath: "models/kokoro-82m/voices/em_alex.bin", sizeBytes: 522_240 },
80
+ { relPath: "models/kokoro-82m/voices/ff_siwis.bin", sizeBytes: 522_240 },
81
+ { relPath: "models/kokoro-82m/voices/im_nicola.bin", sizeBytes: 522_240 },
82
+ { relPath: "models/kokoro-82m/voices/pm_alex.bin", sizeBytes: 522_240 },
68
83
  ];
69
84
 
70
85
  const VOSK_RU_FILES: PlanFile[] = [
@@ -245,11 +260,21 @@ export async function renderInstallPlan(options: InstallPlanOptions = {}): Promi
245
260
  components.push(
246
261
  bundleComponent(
247
262
  cacheRoot,
248
- "TTS Kokoro EN",
263
+ "TTS Kokoro EN/ES/FR/IT/PT",
249
264
  "model cache",
250
265
  KOKORO_FILES,
251
266
  noCache,
252
- "English en-* voices",
267
+ "English en-* voices + multilingual es-*/fr-*/it-*/pt-* voices",
268
+ ),
269
+ );
270
+ components.push(
271
+ bundleComponent(
272
+ cacheRoot,
273
+ "G2P CharsiuG2P byt5-tiny",
274
+ "model cache",
275
+ G2P_CHARSIU_FILES,
276
+ noCache,
277
+ "multilingual grapheme-to-phoneme for es/fr/it/pt Kokoro voices (CC-BY 4.0)",
253
278
  ),
254
279
  );
255
280
  components.push(
@@ -257,9 +257,11 @@ function roff(value: string): string {
257
257
  }
258
258
 
259
259
  function manpageDate(): string {
260
- const now = new Date();
261
- const month = now.toLocaleString("en-US", { month: "long" });
262
- return `${month} ${now.getFullYear()}`;
260
+ // Year only — the man `.TH` date drove a monthly drift failure in the
261
+ // shell-artifacts test (committed "May 2026" vs regenerated "June 2026").
262
+ // Year granularity is plenty for a manpage revision date and stays stable
263
+ // across the year.
264
+ return `${new Date().getFullYear()}`;
263
265
  }
264
266
 
265
267
  function renderManpage(model: ArtifactModel): string {
@@ -14,6 +14,19 @@ const DARWIN_KOKORO_DEFAULTS: Record<string, string> = {
14
14
  zh: "zh-zm_yunjian",
15
15
  };
16
16
 
17
+ /**
18
+ * ONNX-platform (Linux / Windows / Intel macOS) multilingual defaults.
19
+ * These mirror the Rust `default_voice_for_lang` in the engine.
20
+ * es/it/pt are male; fr is the documented brand-rule exception
21
+ * (Kokoro v1.0 ships no male French voice).
22
+ */
23
+ const ONNX_KOKORO_DEFAULTS: Record<string, string> = {
24
+ es: "es-em_alex",
25
+ fr: "fr-ff_siwis",
26
+ it: "it-im_nicola",
27
+ pt: "pt-pm_alex",
28
+ };
29
+
17
30
  /** Map a detected language code to a default voice id. Unknown / low-confidence → undefined. */
18
31
  export function pickVoiceForLang(
19
32
  code: string | undefined,
@@ -30,10 +43,11 @@ export function pickVoiceForLang(
30
43
  // AVSpeech Milena is a macOS system voice (any arch); Vosk elsewhere.
31
44
  return platform === "darwin" ? RU_DARWIN_FALLBACK_VOICE : "ru-vosk-m02";
32
45
  default:
33
- // Multilingual Kokoro voices ship only on darwin-arm64 (FluidAudio ANE).
34
- // Intel Macs have no such voice pack, so don't auto-route to ids the
35
- // engine can't honour — fall through to the engine default instead.
46
+ // darwin-arm64: FluidAudio ANE voice pack (full multilingual set).
36
47
  if (platform === "darwin" && arch === "arm64") return DARWIN_KOKORO_DEFAULTS[baseCode];
37
- return undefined;
48
+ // ONNX platforms (Linux, Windows, Intel macOS): es/fr/it/pt are supported
49
+ // via CharsiuG2P + ONNX Kokoro. Other languages (hi, ja, zh, …) have no
50
+ // ONNX voice pack, so fall through to the engine default (undefined).
51
+ return ONNX_KOKORO_DEFAULTS[baseCode];
38
52
  }
39
53
  }