speechflow 2.2.0 → 2.3.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.
Files changed (238) hide show
  1. package/{etc/claude.md → AGENTS.md} +8 -3
  2. package/CHANGELOG.md +78 -1
  3. package/README.md +28 -4
  4. package/etc/speechflow.yaml +3 -1
  5. package/etc/stx.conf +1 -1
  6. package/package.json +6 -6
  7. package/speechflow-cli/dst/speechflow-main-api.d.ts +2 -1
  8. package/speechflow-cli/dst/speechflow-main-api.js +57 -16
  9. package/speechflow-cli/dst/speechflow-main-api.js.map +1 -1
  10. package/speechflow-cli/dst/speechflow-main-cli.js +2 -2
  11. package/speechflow-cli/dst/speechflow-main-config.js +1 -1
  12. package/speechflow-cli/dst/speechflow-main-graph.js +55 -21
  13. package/speechflow-cli/dst/speechflow-main-graph.js.map +1 -1
  14. package/speechflow-cli/dst/speechflow-main-nodes.js +1 -1
  15. package/speechflow-cli/dst/speechflow-main-status.js +6 -3
  16. package/speechflow-cli/dst/speechflow-main-status.js.map +1 -1
  17. package/speechflow-cli/dst/speechflow-main.js +1 -1
  18. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js +7 -10
  19. package/speechflow-cli/dst/speechflow-node-a2a-compressor-wt.js.map +1 -1
  20. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js +8 -6
  21. package/speechflow-cli/dst/speechflow-node-a2a-compressor.js.map +1 -1
  22. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js +9 -5
  23. package/speechflow-cli/dst/speechflow-node-a2a-expander-wt.js.map +1 -1
  24. package/speechflow-cli/dst/speechflow-node-a2a-expander.js +6 -5
  25. package/speechflow-cli/dst/speechflow-node-a2a-expander.js.map +1 -1
  26. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js +2 -2
  27. package/speechflow-cli/dst/speechflow-node-a2a-ffmpeg.js.map +1 -1
  28. package/speechflow-cli/dst/speechflow-node-a2a-filler.js +2 -4
  29. package/speechflow-cli/dst/speechflow-node-a2a-filler.js.map +1 -1
  30. package/speechflow-cli/dst/speechflow-node-a2a-gain.js +1 -1
  31. package/speechflow-cli/dst/speechflow-node-a2a-gender.js +20 -12
  32. package/speechflow-cli/dst/speechflow-node-a2a-gender.js.map +1 -1
  33. package/speechflow-cli/dst/speechflow-node-a2a-gtcrn-wt.js +1 -1
  34. package/speechflow-cli/dst/speechflow-node-a2a-gtcrn.js +33 -11
  35. package/speechflow-cli/dst/speechflow-node-a2a-gtcrn.js.map +1 -1
  36. package/speechflow-cli/dst/speechflow-node-a2a-meter.js +1 -1
  37. package/speechflow-cli/dst/speechflow-node-a2a-mute.js +1 -1
  38. package/speechflow-cli/dst/speechflow-node-a2a-pitch.js +4 -3
  39. package/speechflow-cli/dst/speechflow-node-a2a-pitch.js.map +1 -1
  40. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise-wt.js +2 -2
  41. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise-wt.js.map +1 -1
  42. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js +19 -11
  43. package/speechflow-cli/dst/speechflow-node-a2a-rnnoise.js.map +1 -1
  44. package/speechflow-cli/dst/speechflow-node-a2a-speex.js +8 -8
  45. package/speechflow-cli/dst/speechflow-node-a2a-speex.js.map +1 -1
  46. package/speechflow-cli/dst/speechflow-node-a2a-vad.js +33 -29
  47. package/speechflow-cli/dst/speechflow-node-a2a-vad.js.map +1 -1
  48. package/speechflow-cli/dst/speechflow-node-a2a-wav.js +6 -5
  49. package/speechflow-cli/dst/speechflow-node-a2a-wav.js.map +1 -1
  50. package/speechflow-cli/dst/speechflow-node-a2t-amazon.d.ts +2 -1
  51. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js +34 -20
  52. package/speechflow-cli/dst/speechflow-node-a2t-amazon.js.map +1 -1
  53. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js +13 -5
  54. package/speechflow-cli/dst/speechflow-node-a2t-deepgram.js.map +1 -1
  55. package/speechflow-cli/dst/speechflow-node-a2t-google.js +3 -2
  56. package/speechflow-cli/dst/speechflow-node-a2t-google.js.map +1 -1
  57. package/speechflow-cli/dst/speechflow-node-a2t-openai.js +33 -27
  58. package/speechflow-cli/dst/speechflow-node-a2t-openai.js.map +1 -1
  59. package/speechflow-cli/dst/speechflow-node-t2a-amazon.js +16 -5
  60. package/speechflow-cli/dst/speechflow-node-t2a-amazon.js.map +1 -1
  61. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js +17 -5
  62. package/speechflow-cli/dst/speechflow-node-t2a-elevenlabs.js.map +1 -1
  63. package/speechflow-cli/dst/speechflow-node-t2a-google.js +17 -5
  64. package/speechflow-cli/dst/speechflow-node-t2a-google.js.map +1 -1
  65. package/speechflow-cli/dst/{speechflow-node-t2t-simulator.d.ts → speechflow-node-t2a-kitten.d.ts} +5 -1
  66. package/speechflow-cli/dst/speechflow-node-t2a-kitten.js +194 -0
  67. package/speechflow-cli/dst/speechflow-node-t2a-kitten.js.map +1 -0
  68. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js +21 -9
  69. package/speechflow-cli/dst/speechflow-node-t2a-kokoro.js.map +1 -1
  70. package/speechflow-cli/dst/speechflow-node-t2a-openai.js +17 -5
  71. package/speechflow-cli/dst/speechflow-node-t2a-openai.js.map +1 -1
  72. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js +21 -7
  73. package/speechflow-cli/dst/speechflow-node-t2a-supertonic.js.map +1 -1
  74. package/speechflow-cli/dst/speechflow-node-t2t-amazon.js +1 -1
  75. package/speechflow-cli/dst/speechflow-node-t2t-deepl.js +1 -1
  76. package/speechflow-cli/dst/speechflow-node-t2t-format.js +1 -1
  77. package/speechflow-cli/dst/speechflow-node-t2t-google.js +4 -2
  78. package/speechflow-cli/dst/speechflow-node-t2t-google.js.map +1 -1
  79. package/speechflow-cli/dst/speechflow-node-t2t-modify.js +1 -1
  80. package/speechflow-cli/dst/speechflow-node-t2t-opus.js +1 -1
  81. package/speechflow-cli/dst/speechflow-node-t2t-profanity.js +1 -1
  82. package/speechflow-cli/dst/speechflow-node-t2t-punctuation.js +1 -1
  83. package/speechflow-cli/dst/speechflow-node-t2t-sentence.js +1 -1
  84. package/speechflow-cli/dst/speechflow-node-t2t-spellcheck.js +1 -1
  85. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js +34 -14
  86. package/speechflow-cli/dst/speechflow-node-t2t-subtitle.js.map +1 -1
  87. package/speechflow-cli/dst/speechflow-node-t2t-summary.js +3 -3
  88. package/speechflow-cli/dst/speechflow-node-t2t-summary.js.map +1 -1
  89. package/speechflow-cli/dst/speechflow-node-t2t-translate.js +1 -1
  90. package/speechflow-cli/dst/speechflow-node-x2x-filter.js +3 -2
  91. package/speechflow-cli/dst/speechflow-node-x2x-filter.js.map +1 -1
  92. package/speechflow-cli/dst/speechflow-node-x2x-trace.js +1 -1
  93. package/speechflow-cli/dst/speechflow-node-xio-device.js +18 -7
  94. package/speechflow-cli/dst/speechflow-node-xio-device.js.map +1 -1
  95. package/speechflow-cli/dst/speechflow-node-xio-exec.js +23 -11
  96. package/speechflow-cli/dst/speechflow-node-xio-exec.js.map +1 -1
  97. package/speechflow-cli/dst/speechflow-node-xio-file.js +13 -7
  98. package/speechflow-cli/dst/speechflow-node-xio-file.js.map +1 -1
  99. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js +25 -12
  100. package/speechflow-cli/dst/speechflow-node-xio-mqtt.js.map +1 -1
  101. package/speechflow-cli/dst/speechflow-node-xio-vban.js +32 -20
  102. package/speechflow-cli/dst/speechflow-node-xio-vban.js.map +1 -1
  103. package/speechflow-cli/dst/speechflow-node-xio-webrtc.js +78 -62
  104. package/speechflow-cli/dst/speechflow-node-xio-webrtc.js.map +1 -1
  105. package/speechflow-cli/dst/speechflow-node-xio-websocket.d.ts +1 -0
  106. package/speechflow-cli/dst/speechflow-node-xio-websocket.js +63 -18
  107. package/speechflow-cli/dst/speechflow-node-xio-websocket.js.map +1 -1
  108. package/speechflow-cli/dst/speechflow-node.js +5 -7
  109. package/speechflow-cli/dst/speechflow-node.js.map +1 -1
  110. package/speechflow-cli/dst/speechflow-util-audio-wt.js +31 -5
  111. package/speechflow-cli/dst/speechflow-util-audio-wt.js.map +1 -1
  112. package/speechflow-cli/dst/speechflow-util-audio.d.ts +1 -1
  113. package/speechflow-cli/dst/speechflow-util-audio.js +25 -14
  114. package/speechflow-cli/dst/speechflow-util-audio.js.map +1 -1
  115. package/speechflow-cli/dst/speechflow-util-error.d.ts +1 -1
  116. package/speechflow-cli/dst/speechflow-util-error.js +2 -2
  117. package/speechflow-cli/dst/speechflow-util-error.js.map +1 -1
  118. package/speechflow-cli/dst/speechflow-util-llm.js +1 -1
  119. package/speechflow-cli/dst/speechflow-util-misc.d.ts +3 -2
  120. package/speechflow-cli/dst/speechflow-util-misc.js +63 -6
  121. package/speechflow-cli/dst/speechflow-util-misc.js.map +1 -1
  122. package/speechflow-cli/dst/speechflow-util-queue.d.ts +5 -17
  123. package/speechflow-cli/dst/speechflow-util-queue.js +57 -78
  124. package/speechflow-cli/dst/speechflow-util-queue.js.map +1 -1
  125. package/speechflow-cli/dst/speechflow-util-stream.d.ts +1 -1
  126. package/speechflow-cli/dst/speechflow-util-stream.js +35 -8
  127. package/speechflow-cli/dst/speechflow-util-stream.js.map +1 -1
  128. package/speechflow-cli/dst/speechflow-util.js +1 -1
  129. package/speechflow-cli/dst/speechflow.d.ts +1 -1
  130. package/speechflow-cli/dst/speechflow.js +1 -1
  131. package/speechflow-cli/etc/eslint.mjs +1 -1
  132. package/speechflow-cli/etc/oxlint.jsonc +2 -1
  133. package/speechflow-cli/etc/stx.conf +8 -2
  134. package/speechflow-cli/package.d/@ericedouard+vad-node-realtime+0.2.0.patch +2 -1
  135. package/speechflow-cli/package.d/@typescript-eslint+typescript-estree+8.57.2.patch +12 -0
  136. package/speechflow-cli/package.d/kitten-tts-js+0.1.2.patch +24 -0
  137. package/speechflow-cli/package.d/speex-resampler+3.0.1.patch +56 -0
  138. package/speechflow-cli/package.json +40 -30
  139. package/speechflow-cli/src/lib.d.ts +19 -1
  140. package/speechflow-cli/src/speechflow-main-api.ts +64 -19
  141. package/speechflow-cli/src/speechflow-main-cli.ts +2 -2
  142. package/speechflow-cli/src/speechflow-main-config.ts +1 -1
  143. package/speechflow-cli/src/speechflow-main-graph.ts +56 -22
  144. package/speechflow-cli/src/speechflow-main-nodes.ts +1 -1
  145. package/speechflow-cli/src/speechflow-main-status.ts +6 -3
  146. package/speechflow-cli/src/speechflow-main.ts +1 -1
  147. package/speechflow-cli/src/speechflow-node-a2a-compressor-wt.ts +7 -11
  148. package/speechflow-cli/src/speechflow-node-a2a-compressor.ts +8 -6
  149. package/speechflow-cli/src/speechflow-node-a2a-expander-wt.ts +10 -5
  150. package/speechflow-cli/src/speechflow-node-a2a-expander.ts +6 -5
  151. package/speechflow-cli/src/speechflow-node-a2a-ffmpeg.ts +3 -2
  152. package/speechflow-cli/src/speechflow-node-a2a-filler.ts +2 -4
  153. package/speechflow-cli/src/speechflow-node-a2a-gain.ts +1 -1
  154. package/speechflow-cli/src/speechflow-node-a2a-gender.ts +20 -13
  155. package/speechflow-cli/src/speechflow-node-a2a-gtcrn-wt.ts +1 -1
  156. package/speechflow-cli/src/speechflow-node-a2a-gtcrn.ts +43 -16
  157. package/speechflow-cli/src/speechflow-node-a2a-meter.ts +1 -1
  158. package/speechflow-cli/src/speechflow-node-a2a-mute.ts +1 -1
  159. package/speechflow-cli/src/speechflow-node-a2a-pitch.ts +4 -3
  160. package/speechflow-cli/src/speechflow-node-a2a-rnnoise-wt.ts +2 -2
  161. package/speechflow-cli/src/speechflow-node-a2a-rnnoise.ts +24 -12
  162. package/speechflow-cli/src/speechflow-node-a2a-speex.ts +10 -9
  163. package/speechflow-cli/src/speechflow-node-a2a-vad.ts +38 -31
  164. package/speechflow-cli/src/speechflow-node-a2a-wav.ts +6 -5
  165. package/speechflow-cli/src/speechflow-node-a2t-amazon.ts +35 -22
  166. package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +17 -6
  167. package/speechflow-cli/src/speechflow-node-a2t-google.ts +5 -4
  168. package/speechflow-cli/src/speechflow-node-a2t-openai.ts +39 -31
  169. package/speechflow-cli/src/speechflow-node-t2a-amazon.ts +16 -5
  170. package/speechflow-cli/src/speechflow-node-t2a-elevenlabs.ts +17 -5
  171. package/speechflow-cli/src/speechflow-node-t2a-google.ts +17 -5
  172. package/speechflow-cli/src/speechflow-node-t2a-kitten.ts +178 -0
  173. package/speechflow-cli/src/speechflow-node-t2a-kokoro.ts +21 -9
  174. package/speechflow-cli/src/speechflow-node-t2a-openai.ts +17 -5
  175. package/speechflow-cli/src/speechflow-node-t2a-supertonic.ts +21 -7
  176. package/speechflow-cli/src/speechflow-node-t2t-amazon.ts +1 -1
  177. package/speechflow-cli/src/speechflow-node-t2t-deepl.ts +1 -1
  178. package/speechflow-cli/src/speechflow-node-t2t-format.ts +1 -1
  179. package/speechflow-cli/src/speechflow-node-t2t-google.ts +4 -2
  180. package/speechflow-cli/src/speechflow-node-t2t-modify.ts +1 -1
  181. package/speechflow-cli/src/speechflow-node-t2t-opus.ts +1 -1
  182. package/speechflow-cli/src/speechflow-node-t2t-profanity.ts +1 -1
  183. package/speechflow-cli/src/speechflow-node-t2t-punctuation.ts +1 -1
  184. package/speechflow-cli/src/speechflow-node-t2t-sentence.ts +1 -1
  185. package/speechflow-cli/src/speechflow-node-t2t-spellcheck.ts +1 -1
  186. package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +39 -15
  187. package/speechflow-cli/src/speechflow-node-t2t-summary.ts +3 -3
  188. package/speechflow-cli/src/speechflow-node-t2t-translate.ts +1 -1
  189. package/speechflow-cli/src/speechflow-node-x2x-filter.ts +4 -3
  190. package/speechflow-cli/src/speechflow-node-x2x-trace.ts +1 -1
  191. package/speechflow-cli/src/speechflow-node-xio-device.ts +21 -7
  192. package/speechflow-cli/src/speechflow-node-xio-exec.ts +25 -11
  193. package/speechflow-cli/src/speechflow-node-xio-file.ts +15 -7
  194. package/speechflow-cli/src/speechflow-node-xio-mqtt.ts +28 -15
  195. package/speechflow-cli/src/speechflow-node-xio-vban.ts +35 -22
  196. package/speechflow-cli/src/speechflow-node-xio-webrtc.ts +85 -69
  197. package/speechflow-cli/src/speechflow-node-xio-websocket.ts +67 -20
  198. package/speechflow-cli/src/speechflow-node.ts +7 -8
  199. package/speechflow-cli/src/speechflow-util-audio-wt.ts +46 -7
  200. package/speechflow-cli/src/speechflow-util-audio.ts +27 -15
  201. package/speechflow-cli/src/speechflow-util-error.ts +3 -3
  202. package/speechflow-cli/src/speechflow-util-llm.ts +1 -1
  203. package/speechflow-cli/src/speechflow-util-misc.ts +63 -6
  204. package/speechflow-cli/src/speechflow-util-queue.ts +60 -81
  205. package/speechflow-cli/src/speechflow-util-stream.ts +40 -8
  206. package/speechflow-cli/src/speechflow-util.ts +1 -1
  207. package/speechflow-cli/src/speechflow.ts +1 -1
  208. package/speechflow-ui-db/dst/index.css +1 -1
  209. package/speechflow-ui-db/dst/index.html +1 -1
  210. package/speechflow-ui-db/dst/index.js +15 -15
  211. package/speechflow-ui-db/etc/eslint.mjs +1 -1
  212. package/speechflow-ui-db/etc/oxlint.jsonc +1 -1
  213. package/speechflow-ui-db/etc/stx.conf +1 -1
  214. package/speechflow-ui-db/etc/stylelint.js +1 -1
  215. package/speechflow-ui-db/etc/stylelint.yaml +1 -1
  216. package/speechflow-ui-db/etc/vite-client.mts +1 -1
  217. package/speechflow-ui-db/package.d/@typescript-eslint+typescript-estree+8.57.2.patch +12 -0
  218. package/speechflow-ui-db/package.json +22 -16
  219. package/speechflow-ui-db/src/app.styl +1 -1
  220. package/speechflow-ui-db/src/app.vue +4 -4
  221. package/speechflow-ui-db/src/index.html +1 -1
  222. package/speechflow-ui-db/src/index.ts +1 -1
  223. package/speechflow-ui-st/dst/index.html +1 -1
  224. package/speechflow-ui-st/dst/index.js +31 -31
  225. package/speechflow-ui-st/etc/eslint.mjs +1 -1
  226. package/speechflow-ui-st/etc/oxlint.jsonc +1 -1
  227. package/speechflow-ui-st/etc/stx.conf +1 -1
  228. package/speechflow-ui-st/etc/stylelint.js +1 -1
  229. package/speechflow-ui-st/etc/stylelint.yaml +1 -1
  230. package/speechflow-ui-st/etc/vite-client.mts +1 -1
  231. package/speechflow-ui-st/package.d/@typescript-eslint+typescript-estree+8.57.2.patch +12 -0
  232. package/speechflow-ui-st/package.json +23 -17
  233. package/speechflow-ui-st/src/app.styl +1 -1
  234. package/speechflow-ui-st/src/app.vue +9 -8
  235. package/speechflow-ui-st/src/index.html +1 -1
  236. package/speechflow-ui-st/src/index.ts +1 -1
  237. package/speechflow-cli/dst/speechflow-node-t2t-simulator.js +0 -128
  238. package/speechflow-cli/dst/speechflow-node-t2t-simulator.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"speechflow-util-stream.js","sourceRoot":"","sources":["../src/speechflow-util-stream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"speechflow-util-stream.js","sourceRoot":"","sources":["../src/speechflow-util-stream.ts"],"names":[],"mappings":";AAAA;;;;EAIE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBF,oFAkBC;AAGD,8CAYC;AAKD,oFAgCC;AAaD,8CAkBC;AAGD,8CAsBC;AAwFD,sCAuBC;AA3PD,6BAA6B;AAC7B,8DAAiD;AAEjD,6BAA6B;AAC7B,iCAA2C;AAC3C,4CAA2C;AAE3C,6BAA6B;AAC7B,uDAAuD;AACvD,wDAAuD;AAEvD;;2CAE2C;AAC3C,SAAgB,oCAAoC,CAChD,IAAsB,EACtB,qBAA8B;IAE9B,OAAO,IAAI,qBAAM,CAAC,SAAS,CAAC;QACxB,kBAAkB,EAAK,IAAI;QAC3B,kBAAkB,EAAK,KAAK;QAC5B,qBAAqB,EAAE,CAAC;QACxB,qBAAqB,EAAE,qBAAqB,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QACzG,aAAa,EAAU,KAAK;QAC5B,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;YACjD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACxB,QAAQ,EAAE,CAAA;QACd,CAAC;QACD,KAAK,CAAE,QAAQ;YACX,QAAQ,EAAE,CAAA;QACd,CAAC;KACJ,CAAC,CAAA;AACN,CAAC;AAED,sDAAsD;AACtD,SAAgB,iBAAiB,CAAE,IAAsB,EAAE,KAAwC;IAC/F,IAAI,KAAK,YAAY,iCAAe,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI;YACnB,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,mBAAmB,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAA;IACrG,CAAC;SACI,CAAC;QACF,IAAI,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzC,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;aAC7B,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAChD,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClC,CAAC;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED;;2CAE2C;AAC3C,SAAgB,oCAAoC,CAChD,IAAsB,EACtB,WAA2B,EAC3B,qBAA8B,EAC9B,UAAmB,EACnB,QAAiB,EACjB,QAAiB;IAEjB,OAAO,IAAI,qBAAM,CAAC,SAAS,CAAC;QACxB,kBAAkB,EAAK,KAAK;QAC5B,kBAAkB,EAAK,IAAI;QAC3B,qBAAqB,EAAE,qBAAqB,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC;QACzG,qBAAqB,EAAE,CAAC;QACxB,aAAa,EAAU,KAAK;QAC5B,SAAS,CAAE,KAAsB,EAAE,QAAQ,EAAE,QAAQ;YACjD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;YAC9B,MAAM,KAAK,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC3C,IAAI,GAAG,GAAG,KAAK,CAAA;YACf,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAe,EACrD,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;gBACnC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;YACrC,CAAC;YACD,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAoB,CAAA;YACjE,MAAM,GAAG,GAAG,IAAI,iCAAe,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;YACnE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACd,QAAQ,EAAE,CAAA;QACd,CAAC;QACD,KAAK,CAAE,QAAQ;YACX,QAAQ,EAAE,CAAA;QACd,CAAC;KACJ,CAAC,CAAA;AACN,CAAC;AAYD,sCAAsC;AACtC,SAAgB,iBAAiB,CAAE,KAAsB;IACrD,IAAI,OAAmB,CAAA;IACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9B,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;SACtC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;QACjC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC3C,CAAC;IACD,MAAM,IAAI,GAA8B;QACpC,cAAc,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE;QAC/C,YAAY,EAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC7C,IAAI,EAAY,KAAK,CAAC,IAAI;QAC1B,IAAI,EAAY,KAAK,CAAC,IAAI;QAC1B,OAAO;KACV,CAAA;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAChD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC;AAED,wCAAwC;AACxC,SAAgB,iBAAiB,CAAE,KAAiB;IAChD,IAAI,IAA+B,CAAA;IACnC,IAAI,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,MAAM,CAA4B,KAAK,CAAC,CAAA;IACxD,CAAC;IACD,OAAO,GAAY,EAAE,CAAC;QAClB,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAA;IACvD,CAAC;IACD,IAAI,OAAwB,CAAA;IAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;QACrB,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;;QAEnC,OAAO,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACtD,MAAM,KAAK,GAAG,IAAI,iCAAe,CAC7B,gBAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EACxC,gBAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,EACtC,IAAI,CAAC,IAAgC,EACrC,IAAI,CAAC,IAAwB,EAC7B,OAAO,EACP,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAC7C,CAAA;IACD,OAAO,KAAK,CAAA;AAChB,CAAC;AAED,kFAAkF;AAClF,MAAa,aAAc,SAAQ,qBAAM,CAAC,SAAS;IACvC,aAAa,CAAK;IAClB,MAAM,GAAI,CAAC,KAAU,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAA;IAC9C,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA,CAAC,CAAC,CAAA;IACrD,KAAK,GAAK,GAAa,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,CAAA;IACrD,YAAa,aAAkB,EAAE,UAAmC,EAAE;QAClE,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAA;QACjC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAA;QACjC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YAC3C,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5C,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAI,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC;IACL,CAAC;IACD,UAAU,CAAE,KAAU,EAAE,QAAwB,EAAE,QAAkC;QAChF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;YAC/C,OAAM;QACV,CAAC;QACD,IAAI,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACjD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACnD,IAAI,WAAW;oBACX,QAAQ,EAAE,CAAA;;oBAEV,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YAClD,CAAC;;gBAEG,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAC5D,CAAC;QACD,OAAO,GAAY,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QACnC,CAAC;IACL,CAAC;IACD,MAAM,CAAE,QAAkC;QACtC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAA;YAC/C,OAAM;QACV,CAAC;QACD,IAAI,CAAC;YACD,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC/C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,CAAA;gBAExB;4EAC4D;gBAC5D,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;gBAChC,OAAO,CAAC,IAAI,CAAC;oBACT,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;wBAClC,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;4BAChD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;4BACtD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAG,CAAC,GAAU,EAAE,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;wBACtE,CAAC;;4BAEG,OAAO,EAAE,CAAA;oBACjB,CAAC,CAAC;oBACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,8BAA8B,EAAE,EAAE,CAAC,MAAM,CAAC;iBAChE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;oBACZ,EAAE,CAAC,KAAK,EAAE,CAAA;gBACd,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;oBACT,QAAQ,EAAE,CAAA;gBACd,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;oBACV,yDAAyD;oBACzD,QAAQ,EAAE,CAAA;gBACd,CAAC,CAAC,CAAA;YACN,CAAC;;gBAEG,QAAQ,EAAE,CAAA;QAClB,CAAC;QACD,OAAO,GAAY,EAAE,CAAC;YAClB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAA;QACnC,CAAC;IACL,CAAC;IACD,QAAQ,CAAE,KAAmB,EAAE,QAAkC;QAC7D,IAAI,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAG,IAAI,CAAC,MAAM,CAAC,CAAA;YACvD,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;YACxD,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,EAAI,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1D,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACnC,CAAC;CACJ;AAlFD,sCAkFC;AAED,mDAAmD;AAC5C,KAAK,UAAU,aAAa,CAC/B,MAA4E;IAE5E,4CAA4C;IAC5C,IAAI,CAAG,MAAM,YAAY,qBAAM,CAAC,MAAM;WAC/B,MAAM,YAAY,qBAAM,CAAC,SAAS;WAClC,MAAM,YAAY,qBAAM,CAAC,QAAQ,CAAE;WACnC,CAAC,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAA;QAChC,MAAM,OAAO,CAAC,IAAI,CAAC;YACf,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;YACnC,CAAC,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,oBAAoB,EAAE,EAAE,CAAC,MAAM,CAAC;SACtD,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACZ,EAAE,CAAC,KAAK,EAAE,CAAA;QACd,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACV,yDAAyD;QAC7D,CAAC,CAAC,CAAA;IACN,CAAC;IAED,0BAA0B;IAC1B,MAAM,CAAC,OAAO,EAAE,CAAA;AACpB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /*
3
3
  ** SpeechFlow - Speech Processing Flow Graph
4
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
5
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
6
  */
7
7
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /*!
3
3
  ** SpeechFlow - Speech Processing Flow Graph
4
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
5
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
6
  */
7
7
  export {};
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  /*!
4
4
  ** SpeechFlow - Speech Processing Flow Graph
5
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
6
6
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
7
7
  */
8
8
  var __importDefault = (this && this.__importDefault) || function (mod) {
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** SpeechFlow - Speech Processing Flow Graph
3
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  */
6
6
 
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** SpeechFlow - Speech Processing Flow Graph
3
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  */
6
6
 
@@ -141,6 +141,7 @@
141
141
  "no-relative-parent-imports": "off",
142
142
  "prefer-module": "off",
143
143
  "prefer-ternary": "off",
144
+ "no-multiple-resolved": "off",
144
145
 
145
146
  "complexity": [ "error", { "max": 35 } ]
146
147
  }
@@ -1,13 +1,19 @@
1
1
  ##
2
2
  ## SpeechFlow - Speech Processing Flow Graph
3
- ## Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ## Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ## Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  ##
6
6
 
7
7
  # [speechflow-cli] make patches
8
8
  patch-make
9
9
  npm shrinkwrap && \
10
- patch-package --patch-dir package.d "@ericedouard/vad-node-realtime" && \
10
+ patch-package --patch-dir package.d \
11
+ "@ericedouard/vad-node-realtime" \
12
+ "@shiguredo" \
13
+ "sherpa-onnx" \
14
+ "kitten-tts-js" \
15
+ "speex-resampler" \
16
+ "@typescript-eslint/typescript-estree" && \
11
17
  shx rm -f npm-shrinkwrap.json
12
18
 
13
19
  # [speechflow-cli] (internal) apply patches
@@ -1,5 +1,5 @@
1
1
  diff --git a/node_modules/@ericedouard/vad-node-realtime/dist/common/models/v5.js b/node_modules/@ericedouard/vad-node-realtime/dist/common/models/v5.js
2
- index 4a75457..e3a4e9a 100644
2
+ index 4a75457..a26285b 100644
3
3
  --- a/node_modules/@ericedouard/vad-node-realtime/dist/common/models/v5.js
4
4
  +++ b/node_modules/@ericedouard/vad-node-realtime/dist/common/models/v5.js
5
5
  @@ -39,13 +39,11 @@ class SileroV5 {
@@ -16,3 +16,4 @@ index 4a75457..e3a4e9a 100644
16
16
  return new _a(_session, _state, _sr, ortInstance);
17
17
  };
18
18
  //# sourceMappingURL=v5.js.map
19
+
@@ -0,0 +1,12 @@
1
+ diff --git a/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.js b/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.js
2
+ index 8b0402b..b83ef25 100644
3
+ --- a/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.js
4
+ +++ b/node_modules/@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.js
5
+ @@ -75,7 +75,6 @@ function warnAboutTSVersion(parseSettings, passedLoggerFn) {
6
+ '\n',
7
+ border,
8
+ ].join('\n');
9
+ - parseSettings.log(versionWarning);
10
+ }
11
+ warnedAboutTSVersion = true;
12
+ }
@@ -0,0 +1,24 @@
1
+ diff --git a/node_modules/kitten-tts-js/src/kitten-tts.js b/node_modules/kitten-tts-js/src/kitten-tts.js
2
+ index 63e4d2a..9c6544a 100644
3
+ --- a/node_modules/kitten-tts-js/src/kitten-tts.js
4
+ +++ b/node_modules/kitten-tts-js/src/kitten-tts.js
5
+ @@ -59,8 +59,10 @@ export class KittenTTS {
6
+
7
+ // Load ONNX runtime (Node vs browser via conditional exports)
8
+ let ort;
9
+ + let isNode = false;
10
+ try {
11
+ ort = await import('onnxruntime-node');
12
+ + isNode = true;
13
+ } catch {
14
+ ort = await import('onnxruntime-web');
15
+ // Tell onnxruntime-web where its .wasm files live.
16
+ @@ -81,7 +83,7 @@ export class KittenTTS {
17
+ ort.env.wasm.simd = true;
18
+ }
19
+
20
+ - const sessionOptions = ort.env.wasm ? { executionProviders: ['wasm'] } : {};
21
+ + const sessionOptions = isNode ? {} : { executionProviders: ['wasm'] };
22
+ const session = await ort.InferenceSession.create(modelBuffer, sessionOptions);
23
+ const voices = await loadNpz(voicesBuffer);
24
+
@@ -0,0 +1,56 @@
1
+ diff --git a/node_modules/speex-resampler/app/index.d.ts b/node_modules/speex-resampler/app/index.d.ts
2
+ index ef85876..fdf42d0 100644
3
+ --- a/node_modules/speex-resampler/app/index.d.ts
4
+ +++ b/node_modules/speex-resampler/app/index.d.ts
5
+ @@ -26,6 +26,10 @@ declare class SpeexResampler {
6
+ * @param chunk interleaved PCM data in signed 16bits int
7
+ */
8
+ processChunk(chunk: Buffer): Buffer;
9
+ + /**
10
+ + * Destroy the resampler and free all WASM memory.
11
+ + */
12
+ + destroy(): void;
13
+ }
14
+ export declare class SpeexResamplerTransform extends Transform {
15
+ channels: any;
16
+ diff --git a/node_modules/speex-resampler/app/index.js b/node_modules/speex-resampler/app/index.js
17
+ index 509ec36..434b152 100644
18
+ --- a/node_modules/speex-resampler/app/index.js
19
+ +++ b/node_modules/speex-resampler/app/index.js
20
+ @@ -82,6 +82,36 @@ class SpeexResampler {
21
+ // we are copying the info in a new buffer here, we could just pass a buffer pointing to the same memory space if needed
22
+ return Buffer.from(speexModule.HEAPU8.slice(this._outBufferPtr, this._outBufferPtr + outSamplesPerChannelsWritten * this.channels * Uint16Array.BYTES_PER_ELEMENT).buffer);
23
+ }
24
+ + /**
25
+ + * Destroy the resampler and free all WASM memory.
26
+ + */
27
+ + destroy() {
28
+ + if (!speexModule) {
29
+ + return;
30
+ + }
31
+ + if (this._resamplerPtr) {
32
+ + speexModule._speex_resampler_destroy(this._resamplerPtr);
33
+ + this._resamplerPtr = 0;
34
+ + }
35
+ + if (this._inBufferPtr !== -1) {
36
+ + speexModule._free(this._inBufferPtr);
37
+ + this._inBufferPtr = -1;
38
+ + this._inBufferSize = -1;
39
+ + }
40
+ + if (this._outBufferPtr !== -1) {
41
+ + speexModule._free(this._outBufferPtr);
42
+ + this._outBufferPtr = -1;
43
+ + this._outBufferSize = -1;
44
+ + }
45
+ + if (this._inLengthPtr !== -1) {
46
+ + speexModule._free(this._inLengthPtr);
47
+ + this._inLengthPtr = -1;
48
+ + }
49
+ + if (this._outLengthPtr !== -1) {
50
+ + speexModule._free(this._outLengthPtr);
51
+ + this._outLengthPtr = -1;
52
+ + }
53
+ + }
54
+ }
55
+ SpeexResampler.initPromise = globalModulePromise;
56
+ const EMPTY_BUFFER = Buffer.alloc(0);
@@ -24,78 +24,79 @@
24
24
  "shell-parser": "1.0.0",
25
25
  "@deepgram/sdk": "4.11.3",
26
26
  "deepl-node": "1.24.0",
27
- "@elevenlabs/elevenlabs-js": "2.36.0",
27
+ "@elevenlabs/elevenlabs-js": "2.40.0",
28
28
  "get-stream": "9.0.1",
29
- "@dotenvx/dotenvx": "1.52.0",
29
+ "@dotenvx/dotenvx": "1.58.0",
30
30
  "speex-resampler": "3.0.1",
31
31
  "@sapphi-red/speex-preprocess-wasm": "0.4.0",
32
32
  "@shiguredo/rnnoise-wasm": "2025.1.5",
33
33
  "sherpa-onnx": "1.12.25",
34
- "axios": "1.13.5",
35
- "@aws-sdk/client-transcribe-streaming": "3.995.0",
36
- "@aws-sdk/client-translate": "3.995.0",
37
- "@aws-sdk/client-polly": "3.995.0",
34
+ "axios": "1.14.0",
35
+ "@aws-sdk/client-transcribe-streaming": "3.1019.0",
36
+ "@aws-sdk/client-translate": "3.1019.0",
37
+ "@aws-sdk/client-polly": "3.1019.0",
38
38
  "@google-cloud/translate": "9.3.0",
39
- "@google-cloud/speech": "7.2.1",
39
+ "@google-cloud/speech": "7.3.0",
40
40
  "@google-cloud/text-to-speech": "6.4.0",
41
- "node-web-audio-api": "1.0.8",
41
+ "node-web-audio-api": "1.0.9",
42
42
  "object-path": "0.11.8",
43
43
  "glob": "13.0.6",
44
- "ws": "8.19.0",
44
+ "ws": "8.20.0",
45
45
  "bufferutil": "4.1.0",
46
46
  "utf-8-validate": "6.0.6",
47
- "@hapi/hapi": "21.4.6",
47
+ "@hapi/hapi": "21.4.7",
48
48
  "@hapi/boom": "10.0.1",
49
49
  "@hapi/inert": "7.1.0",
50
50
  "hapi-plugin-header": "1.1.8",
51
51
  "hapi-plugin-websocket": "2.4.11",
52
52
  "@opensumi/reconnecting-websocket": "4.4.0",
53
53
  "ollama": "0.6.3",
54
- "openai": "6.22.0",
55
- "@anthropic-ai/sdk": "0.78.0",
56
- "@google/genai": "1.42.0",
54
+ "openai": "6.33.0",
55
+ "@anthropic-ai/sdk": "0.80.0",
56
+ "@google/genai": "1.46.0",
57
57
  "@rse/ffmpeg": "1.4.2",
58
58
  "ffmpeg-stream": "1.0.1",
59
59
  "installed-packages": "1.0.13",
60
60
  "syspath": "1.0.8",
61
61
  "wav": "1.0.2",
62
- "mqtt": "5.15.0",
62
+ "mqtt": "5.15.1",
63
63
  "vban": "1.5.6",
64
- "cbor2": "2.2.1",
65
- "arktype": "2.1.29",
64
+ "cbor2": "2.3.0",
65
+ "arktype": "2.2.0",
66
66
  "pure-uuid": "2.0.0",
67
67
  "wavefile": "11.0.0",
68
68
  "audio-inspect": "0.0.4",
69
69
  "@huggingface/transformers": "3.8.1",
70
- "@huggingface/hub": "2.10.3",
70
+ "@huggingface/hub": "2.11.0",
71
71
  "kokoro-js": "1.2.1",
72
+ "kitten-tts-js": "0.1.2",
72
73
  "@ericedouard/vad-node-realtime": "0.2.0",
73
74
  "osc-js": "2.4.1",
74
75
  "luxon": "3.7.2",
75
76
  "node-interval-tree": "2.1.2",
76
77
  "wrap-text": "1.0.10",
77
78
  "bad-words-next": "3.2.0",
78
- "@2toad/profanity": "3.2.0",
79
+ "@2toad/profanity": "3.3.0",
79
80
  "cli-table3": "0.6.5",
80
81
  "mkdirp": "3.0.1",
81
- "@soundtouchjs/audio-worklet": "0.3.0",
82
+ "@soundtouchjs/audio-worklet": "1.0.8",
82
83
  "werift": "0.22.9",
83
84
  "@discordjs/opus": "0.10.0",
84
85
  "@rse/stx": "1.1.4"
85
86
  },
86
87
  "devDependencies": {
87
- "eslint": "9.39.2",
88
- "@eslint/js": "9.39.2",
89
- "neostandard": "0.12.2",
88
+ "eslint": "9.39.4",
89
+ "@eslint/js": "9.39.4",
90
+ "neostandard": "0.13.0",
90
91
  "eslint-plugin-promise": "7.2.1",
91
92
  "eslint-plugin-import": "2.32.0",
92
93
  "eslint-plugin-node": "11.1.0",
93
- "typescript-eslint": "8.56.0",
94
- "@typescript-eslint/eslint-plugin": "8.56.0",
95
- "@typescript-eslint/parser": "8.56.0",
96
- "oxlint": "1.50.0",
97
- "oxlint-plugin-complexity": "2.0.0",
98
- "eslint-plugin-oxlint": "1.50.0",
94
+ "typescript-eslint": "8.57.2",
95
+ "@typescript-eslint/eslint-plugin": "8.57.2",
96
+ "@typescript-eslint/parser": "8.57.2",
97
+ "oxlint": "1.57.0",
98
+ "oxlint-plugin-complexity": "2.0.3",
99
+ "eslint-plugin-oxlint": "1.57.0",
99
100
 
100
101
  "@types/node": "24.10.1",
101
102
  "@types/yargs": "17.0.35",
@@ -113,20 +114,29 @@
113
114
  "nodemon": "3.1.14",
114
115
  "shx": "0.4.0",
115
116
  "@yao-pkg/pkg": "6.14.1",
116
- "typescript": "5.9.3",
117
+ "typescript": "6.0.2",
117
118
  "delay-cli": "3.0.0",
118
119
  "cross-env": "10.1.0"
119
120
  },
120
121
  "overrides": {
121
122
  "@huggingface/transformers": { "onnxruntime-node": "1.22.0", "onnxruntime-web": "1.22.0" },
122
123
  "@ericedouard/vad-node-realtime": { "onnxruntime-node": "1.22.0", "onnxruntime-web": "1.22.0" },
124
+ "typescript-eslint": { "typescript": ">=5.0.0" },
125
+ "@typescript-eslint/parser": { "typescript": ">=5.0.0" },
126
+ "@typescript-eslint/eslint-plugin": { "typescript": ">=5.0.0" },
127
+ "@typescript-eslint/typescript-estree": { "typescript": ">=5.0.0" },
123
128
  "eslint-plugin-promise": { "eslint": ">=9.0.0" },
124
129
  "eslint-plugin-import": { "eslint": ">=9.0.0" },
125
130
  "neostandard": { "eslint": ">=9.0.0" }
126
131
  },
127
132
  "upd": [
128
133
  "!onnxruntime-node",
129
- "!@types/node"
134
+ "!@types/node",
135
+ "!audio-inspect",
136
+ "!@deepgram/sdk",
137
+ "!sherpa-onnx",
138
+ "!eslint",
139
+ "!@eslint/js"
130
140
  ],
131
141
  "engines": {
132
142
  "node": ">=22.0.0"
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** SpeechFlow - Speech Processing Flow Graph
3
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  */
6
6
 
@@ -68,5 +68,23 @@ declare module "sherpa-onnx" {
68
68
  export default SherpaOnnx
69
69
  }
70
70
 
71
+ /* type definition for "kitten-tts-js" */
72
+ declare module "kitten-tts-js" {
73
+ export interface RawAudio {
74
+ data: Float32Array
75
+ sampling_rate: number
76
+ duration: number
77
+ toWav(): ArrayBuffer
78
+ save(filePath: string): Promise<void>
79
+ }
80
+ export class KittenTTS {
81
+ static from_pretrained (modelId: string): Promise<KittenTTS>
82
+ generate (text: string, opts?: { voice?: string, speed?: number, clean?: boolean }): Promise<RawAudio>
83
+ stream (text: string, opts?: { voice?: string, speed?: number, clean?: boolean }): AsyncGenerator<RawAudio>
84
+ list_voices (): string[]
85
+ release (): void
86
+ }
87
+ }
88
+
71
89
  /* eslint-enable no-unused-vars */
72
90
 
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** SpeechFlow - Speech Processing Flow Graph
3
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  */
6
6
 
@@ -37,6 +37,7 @@ export class APIServer {
37
37
  private wsPeers = new Map<string, WSPeerInfo>()
38
38
  private hapi: HAPI.Server | null = null
39
39
  private sendOSC: ((url: string, ...args: any[]) => void) | null = null
40
+ private graph: NodeGraph | null = null
40
41
 
41
42
  /* creation */
42
43
  constructor (
@@ -45,6 +46,9 @@ export class APIServer {
45
46
 
46
47
  /* start API server service */
47
48
  async start (args: CLIOptions, graph: NodeGraph): Promise<void> {
49
+ /* remember graph for later cleanup */
50
+ this.graph = graph
51
+
48
52
  /* define external request/response structure */
49
53
  const requestValidator = arktype.type({
50
54
  request: "string",
@@ -67,10 +71,13 @@ export class APIServer {
67
71
  throw new Error(`external request failed: no such node <${name}>`)
68
72
  }
69
73
  else {
74
+ const ac = new AbortController()
70
75
  await Promise.race([
71
76
  foundNode.receiveRequest(argList),
72
- util.timeout(10 * 1000)
73
- ]).catch((err: Error) => {
77
+ util.timeout(10 * 1000, "timeout", ac.signal)
78
+ ]).finally(() => {
79
+ ac.abort()
80
+ }).catch((err: Error) => {
74
81
  this.cli.log("warning", `external request to node <${name}> failed: ${err.message}`)
75
82
  throw err
76
83
  })
@@ -133,9 +140,14 @@ export class APIServer {
133
140
  method: "GET",
134
141
  path: "/api/dashboard",
135
142
  handler: (request: HAPI.Request, h: HAPI.ResponseToolkit) => {
136
- const config = []
143
+ const config: { type: string, id: string, name: string }[] = []
144
+ if (args.d === "")
145
+ return h.response(config).code(200)
137
146
  for (const block of args.d.split(",")) {
138
- const [ type, id, name ] = block.split(":")
147
+ const parts = block.split(":")
148
+ if (parts.length !== 3)
149
+ continue
150
+ const [ type, id, name ] = parts
139
151
  config.push({ type, id, name })
140
152
  }
141
153
  return h.response(config).code(200)
@@ -215,7 +227,10 @@ export class APIServer {
215
227
  for (const [ peer, info ] of this.wsPeers.entries()) {
216
228
  this.cli.log("debug", `HAPI: remote peer ${peer}: sending ${data}`)
217
229
  if (info.ws.readyState === WebSocket.OPEN)
218
- info.ws.send(data)
230
+ info.ws.send(data, (err) => {
231
+ if (err)
232
+ this.cli.log("warning", `HAPI: peer ${peer}: send failed: ${err.message}`)
233
+ })
219
234
  }
220
235
  })
221
236
  }
@@ -230,13 +245,18 @@ export class APIServer {
230
245
  const port = Number.parseInt(m[2], 10)
231
246
  this.sendOSC = (url: string, ...argList: any[]) => {
232
247
  const msg = new OSC.Message(url, ...argList)
233
- osc.send(msg, { host, port })
248
+ try {
249
+ osc.send(msg, { host, port })
250
+ }
251
+ catch (err: any) {
252
+ this.cli.log("warning", `OSC/UDP send to ${host}:${port} failed: ${err.message}`)
253
+ }
234
254
  }
235
255
  }
236
256
 
237
257
  /* hook for send-dashboard method of nodes */
238
258
  for (const node of graph.getGraphNodes()) {
239
- node.on("send-dashboard", (info: {
259
+ node.on("send-dashboard", async (info: {
240
260
  type: "audio" | "text",
241
261
  id: string,
242
262
  kind: "final" | "intermediate",
@@ -250,16 +270,26 @@ export class APIServer {
250
270
  for (const [ peer, peerInfo ] of this.wsPeers.entries()) {
251
271
  this.cli.log("debug", `HAPI: dashboard peer ${peer}: send ${data}`)
252
272
  if (peerInfo.ws.readyState === WebSocket.OPEN)
253
- peerInfo.ws.send(data)
273
+ peerInfo.ws.send(data, (err) => {
274
+ if (err)
275
+ this.cli.log("warning", `HAPI: dashboard peer ${peer}: send failed: ${err.message}`)
276
+ })
254
277
  }
278
+ const promises: Promise<void>[] = []
255
279
  for (const n of graph.getGraphNodes()) {
256
- Promise.race([
257
- n.receiveDashboard(info.type, info.id, info.kind, info.value),
258
- util.timeout(10 * 1000)
259
- ]).catch((err: Error) => {
260
- this.cli.log("warning", `sending dashboard info to node <${n.id}> failed: ${err.message}`)
261
- })
280
+ const ac = new AbortController()
281
+ promises.push(
282
+ Promise.race([
283
+ n.receiveDashboard(info.type, info.id, info.kind, info.value),
284
+ util.timeout(10 * 1000, "timeout", ac.signal)
285
+ ]).finally(() => {
286
+ ac.abort()
287
+ }).catch((err: Error) => {
288
+ this.cli.log("warning", `sending dashboard info to node <${n.id}> failed: ${err.message}`)
289
+ })
290
+ )
262
291
  }
292
+ await Promise.allSettled(promises)
263
293
  if (args.o !== "" && this.sendOSC)
264
294
  this.sendOSC("/speechflow/dashboard", info.type, info.id, info.kind, info.value)
265
295
  })
@@ -268,6 +298,15 @@ export class APIServer {
268
298
 
269
299
  /* stop API server service */
270
300
  async stop (args: CLIOptions): Promise<void> {
301
+ /* remove event listeners from graph nodes */
302
+ if (this.graph) {
303
+ for (const node of this.graph.getGraphNodes()) {
304
+ node.removeAllListeners("send-response")
305
+ node.removeAllListeners("send-dashboard")
306
+ }
307
+ this.graph = null
308
+ }
309
+
271
310
  /* shutdown HAPI service */
272
311
  if (this.hapi) {
273
312
  this.cli.log("info", `HAPI: stopping REST/WebSocket network service: http://${args.a}:${args.p}`)
@@ -294,10 +333,13 @@ export class APIServer {
294
333
  }
295
334
  }))
296
335
  }
336
+ const ac = new AbortController()
297
337
  await Promise.race([
298
338
  Promise.all(closePromises),
299
- util.timeout(5 * 1000)
300
- ]).catch((error: unknown) => {
339
+ util.timeout(5 * 1000, "timeout", ac.signal)
340
+ ]).finally(() => {
341
+ ac.abort()
342
+ }).catch((error: unknown) => {
301
343
  this.cli.log("warning", `HAPI: WebSockets failed to close: ${util.ensureError(error).message}`)
302
344
  })
303
345
  this.wsPeers.clear()
@@ -305,7 +347,7 @@ export class APIServer {
305
347
  }
306
348
 
307
349
  /* send information to dashboard on error */
308
- async sendErrorToDashboard (time: number, node: string, level: string, message: string): Promise<void> {
350
+ sendErrorToDashboard (time: number, node: string, level: string, message: string) {
309
351
  const data = JSON.stringify({
310
352
  response: "HINT",
311
353
  node,
@@ -314,7 +356,10 @@ export class APIServer {
314
356
  for (const [ peer, peerInfo ] of this.wsPeers.entries()) {
315
357
  this.cli.log("debug", `HAPI: dashboard peer ${peer}: send ${data}`)
316
358
  if (peerInfo.ws.readyState === WebSocket.OPEN)
317
- peerInfo.ws.send(data)
359
+ peerInfo.ws.send(data, (err) => {
360
+ if (err)
361
+ this.cli.log("warning", `HAPI: dashboard peer ${peer}: send failed: ${err.message}`)
362
+ })
318
363
  }
319
364
  }
320
365
  }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** SpeechFlow - Speech Processing Flow Graph
3
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  */
6
6
 
@@ -185,7 +185,7 @@ export class CLIContext {
185
185
  if (this.args.V) {
186
186
  process.stderr.write(`SpeechFlow ${pkg["x-stdver"]} (${pkg["x-release"]}) <${pkg.homepage}>\n`)
187
187
  process.stderr.write(`${pkg.description}\n`)
188
- process.stderr.write(`Copyright (c) 2024-2025 ${pkg.author.name} <${pkg.author.url}>\n`)
188
+ process.stderr.write(`Copyright (c) 2024-2026 ${pkg.author.name} <${pkg.author.url}>\n`)
189
189
  process.stderr.write(`Licensed under ${pkg.license} <http://spdx.org/licenses/${pkg.license}.html>\n`)
190
190
  process.exit(0)
191
191
  }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** SpeechFlow - Speech Processing Flow Graph
3
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
3
+ ** Copyright (c) 2024-2026 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
4
  ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
5
  */
6
6