speechflow 1.3.1 → 1.4.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 (156) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/etc/stx.conf +54 -58
  3. package/package.json +25 -106
  4. package/{etc → speechflow-cli/etc}/eslint.mjs +1 -2
  5. package/speechflow-cli/etc/stx.conf +77 -0
  6. package/speechflow-cli/package.json +116 -0
  7. package/{src → speechflow-cli/src}/speechflow-node-a2a-gender.ts +148 -64
  8. package/speechflow-cli/src/speechflow-node-a2a-meter.ts +217 -0
  9. package/{src → speechflow-cli/src}/speechflow-node-a2a-mute.ts +39 -11
  10. package/speechflow-cli/src/speechflow-node-a2a-vad.ts +384 -0
  11. package/{src → speechflow-cli/src}/speechflow-node-a2a-wav.ts +27 -11
  12. package/speechflow-cli/src/speechflow-node-a2t-deepgram.ts +313 -0
  13. package/{src → speechflow-cli/src}/speechflow-node-t2a-elevenlabs.ts +59 -12
  14. package/{src → speechflow-cli/src}/speechflow-node-t2a-kokoro.ts +11 -4
  15. package/{src → speechflow-cli/src}/speechflow-node-t2t-deepl.ts +9 -4
  16. package/{src → speechflow-cli/src}/speechflow-node-t2t-format.ts +2 -2
  17. package/{src → speechflow-cli/src}/speechflow-node-t2t-ollama.ts +1 -1
  18. package/{src → speechflow-cli/src}/speechflow-node-t2t-openai.ts +1 -1
  19. package/{src → speechflow-cli/src}/speechflow-node-t2t-sentence.ts +37 -20
  20. package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +276 -0
  21. package/{src → speechflow-cli/src}/speechflow-node-t2t-transformers.ts +4 -3
  22. package/{src → speechflow-cli/src}/speechflow-node-x2x-filter.ts +9 -5
  23. package/{src → speechflow-cli/src}/speechflow-node-x2x-trace.ts +16 -8
  24. package/{src → speechflow-cli/src}/speechflow-node-xio-device.ts +12 -8
  25. package/{src → speechflow-cli/src}/speechflow-node-xio-file.ts +9 -3
  26. package/{src → speechflow-cli/src}/speechflow-node-xio-mqtt.ts +5 -2
  27. package/{src → speechflow-cli/src}/speechflow-node-xio-websocket.ts +12 -12
  28. package/{src → speechflow-cli/src}/speechflow-node.ts +7 -0
  29. package/{src → speechflow-cli/src}/speechflow-utils.ts +78 -44
  30. package/{src → speechflow-cli/src}/speechflow.ts +188 -53
  31. package/speechflow-ui-db/etc/eslint.mjs +106 -0
  32. package/speechflow-ui-db/etc/htmllint.json +55 -0
  33. package/speechflow-ui-db/etc/stx.conf +79 -0
  34. package/speechflow-ui-db/etc/stylelint.js +46 -0
  35. package/speechflow-ui-db/etc/stylelint.yaml +33 -0
  36. package/speechflow-ui-db/etc/tsc-client.json +30 -0
  37. package/speechflow-ui-db/etc/tsc.node.json +9 -0
  38. package/speechflow-ui-db/etc/vite-client.mts +63 -0
  39. package/speechflow-ui-db/package.d/htmllint-cli+0.0.7.patch +20 -0
  40. package/speechflow-ui-db/package.json +75 -0
  41. package/speechflow-ui-db/src/app-icon.ai +1989 -4
  42. package/speechflow-ui-db/src/app-icon.svg +26 -0
  43. package/speechflow-ui-db/src/app.styl +64 -0
  44. package/speechflow-ui-db/src/app.vue +221 -0
  45. package/speechflow-ui-db/src/index.html +23 -0
  46. package/speechflow-ui-db/src/index.ts +26 -0
  47. package/{dst/speechflow.d.ts → speechflow-ui-db/src/lib.d.ts} +5 -3
  48. package/speechflow-ui-db/src/tsconfig.json +3 -0
  49. package/speechflow-ui-st/etc/eslint.mjs +106 -0
  50. package/speechflow-ui-st/etc/htmllint.json +55 -0
  51. package/speechflow-ui-st/etc/stx.conf +79 -0
  52. package/speechflow-ui-st/etc/stylelint.js +46 -0
  53. package/speechflow-ui-st/etc/stylelint.yaml +33 -0
  54. package/speechflow-ui-st/etc/tsc-client.json +30 -0
  55. package/speechflow-ui-st/etc/tsc.node.json +9 -0
  56. package/speechflow-ui-st/etc/vite-client.mts +63 -0
  57. package/speechflow-ui-st/package.d/htmllint-cli+0.0.7.patch +20 -0
  58. package/speechflow-ui-st/package.json +79 -0
  59. package/speechflow-ui-st/src/app-icon.ai +1989 -4
  60. package/speechflow-ui-st/src/app-icon.svg +26 -0
  61. package/speechflow-ui-st/src/app.styl +64 -0
  62. package/speechflow-ui-st/src/app.vue +142 -0
  63. package/speechflow-ui-st/src/index.html +23 -0
  64. package/speechflow-ui-st/src/index.ts +26 -0
  65. package/speechflow-ui-st/src/lib.d.ts +9 -0
  66. package/speechflow-ui-st/src/tsconfig.json +3 -0
  67. package/dst/speechflow-node-a2a-ffmpeg.d.ts +0 -13
  68. package/dst/speechflow-node-a2a-ffmpeg.js +0 -153
  69. package/dst/speechflow-node-a2a-ffmpeg.js.map +0 -1
  70. package/dst/speechflow-node-a2a-gender.d.ts +0 -18
  71. package/dst/speechflow-node-a2a-gender.js +0 -271
  72. package/dst/speechflow-node-a2a-gender.js.map +0 -1
  73. package/dst/speechflow-node-a2a-meter.d.ts +0 -12
  74. package/dst/speechflow-node-a2a-meter.js +0 -155
  75. package/dst/speechflow-node-a2a-meter.js.map +0 -1
  76. package/dst/speechflow-node-a2a-mute.d.ts +0 -16
  77. package/dst/speechflow-node-a2a-mute.js +0 -91
  78. package/dst/speechflow-node-a2a-mute.js.map +0 -1
  79. package/dst/speechflow-node-a2a-vad.d.ts +0 -16
  80. package/dst/speechflow-node-a2a-vad.js +0 -285
  81. package/dst/speechflow-node-a2a-vad.js.map +0 -1
  82. package/dst/speechflow-node-a2a-wav.d.ts +0 -11
  83. package/dst/speechflow-node-a2a-wav.js +0 -195
  84. package/dst/speechflow-node-a2a-wav.js.map +0 -1
  85. package/dst/speechflow-node-a2t-deepgram.d.ts +0 -15
  86. package/dst/speechflow-node-a2t-deepgram.js +0 -255
  87. package/dst/speechflow-node-a2t-deepgram.js.map +0 -1
  88. package/dst/speechflow-node-t2a-elevenlabs.d.ts +0 -16
  89. package/dst/speechflow-node-t2a-elevenlabs.js +0 -195
  90. package/dst/speechflow-node-t2a-elevenlabs.js.map +0 -1
  91. package/dst/speechflow-node-t2a-kokoro.d.ts +0 -13
  92. package/dst/speechflow-node-t2a-kokoro.js +0 -149
  93. package/dst/speechflow-node-t2a-kokoro.js.map +0 -1
  94. package/dst/speechflow-node-t2t-deepl.d.ts +0 -15
  95. package/dst/speechflow-node-t2t-deepl.js +0 -142
  96. package/dst/speechflow-node-t2t-deepl.js.map +0 -1
  97. package/dst/speechflow-node-t2t-format.d.ts +0 -11
  98. package/dst/speechflow-node-t2t-format.js +0 -82
  99. package/dst/speechflow-node-t2t-format.js.map +0 -1
  100. package/dst/speechflow-node-t2t-ollama.d.ts +0 -13
  101. package/dst/speechflow-node-t2t-ollama.js +0 -247
  102. package/dst/speechflow-node-t2t-ollama.js.map +0 -1
  103. package/dst/speechflow-node-t2t-openai.d.ts +0 -13
  104. package/dst/speechflow-node-t2t-openai.js +0 -227
  105. package/dst/speechflow-node-t2t-openai.js.map +0 -1
  106. package/dst/speechflow-node-t2t-sentence.d.ts +0 -17
  107. package/dst/speechflow-node-t2t-sentence.js +0 -234
  108. package/dst/speechflow-node-t2t-sentence.js.map +0 -1
  109. package/dst/speechflow-node-t2t-subtitle.d.ts +0 -13
  110. package/dst/speechflow-node-t2t-subtitle.js +0 -278
  111. package/dst/speechflow-node-t2t-subtitle.js.map +0 -1
  112. package/dst/speechflow-node-t2t-transformers.d.ts +0 -14
  113. package/dst/speechflow-node-t2t-transformers.js +0 -265
  114. package/dst/speechflow-node-t2t-transformers.js.map +0 -1
  115. package/dst/speechflow-node-x2x-filter.d.ts +0 -11
  116. package/dst/speechflow-node-x2x-filter.js +0 -117
  117. package/dst/speechflow-node-x2x-filter.js.map +0 -1
  118. package/dst/speechflow-node-x2x-trace.d.ts +0 -11
  119. package/dst/speechflow-node-x2x-trace.js +0 -111
  120. package/dst/speechflow-node-x2x-trace.js.map +0 -1
  121. package/dst/speechflow-node-xio-device.d.ts +0 -13
  122. package/dst/speechflow-node-xio-device.js +0 -226
  123. package/dst/speechflow-node-xio-device.js.map +0 -1
  124. package/dst/speechflow-node-xio-file.d.ts +0 -11
  125. package/dst/speechflow-node-xio-file.js +0 -210
  126. package/dst/speechflow-node-xio-file.js.map +0 -1
  127. package/dst/speechflow-node-xio-mqtt.d.ts +0 -13
  128. package/dst/speechflow-node-xio-mqtt.js +0 -185
  129. package/dst/speechflow-node-xio-mqtt.js.map +0 -1
  130. package/dst/speechflow-node-xio-websocket.d.ts +0 -13
  131. package/dst/speechflow-node-xio-websocket.js +0 -278
  132. package/dst/speechflow-node-xio-websocket.js.map +0 -1
  133. package/dst/speechflow-node.d.ts +0 -65
  134. package/dst/speechflow-node.js +0 -180
  135. package/dst/speechflow-node.js.map +0 -1
  136. package/dst/speechflow-utils.d.ts +0 -69
  137. package/dst/speechflow-utils.js +0 -486
  138. package/dst/speechflow-utils.js.map +0 -1
  139. package/dst/speechflow.js +0 -768
  140. package/dst/speechflow.js.map +0 -1
  141. package/src/speechflow-node-a2a-meter.ts +0 -130
  142. package/src/speechflow-node-a2a-vad.ts +0 -285
  143. package/src/speechflow-node-a2t-deepgram.ts +0 -234
  144. package/src/speechflow-node-t2t-subtitle.ts +0 -149
  145. /package/{etc → speechflow-cli/etc}/biome.jsonc +0 -0
  146. /package/{etc → speechflow-cli/etc}/oxlint.jsonc +0 -0
  147. /package/{etc → speechflow-cli/etc}/speechflow.bat +0 -0
  148. /package/{etc → speechflow-cli/etc}/speechflow.sh +0 -0
  149. /package/{etc → speechflow-cli/etc}/speechflow.yaml +0 -0
  150. /package/{etc → speechflow-cli/etc}/tsconfig.json +0 -0
  151. /package/{package.d → speechflow-cli/package.d}/@ericedouard+vad-node-realtime+0.2.0.patch +0 -0
  152. /package/{src → speechflow-cli/src}/lib.d.ts +0 -0
  153. /package/{src → speechflow-cli/src}/speechflow-logo.ai +0 -0
  154. /package/{src → speechflow-cli/src}/speechflow-logo.svg +0 -0
  155. /package/{src → speechflow-cli/src}/speechflow-node-a2a-ffmpeg.ts +0 -0
  156. /package/{tsconfig.json → speechflow-cli/tsconfig.json} +0 -0
@@ -0,0 +1,26 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 512 512">
3
+ <!-- Generator: Adobe Illustrator 29.6.0, SVG Export Plug-In . SVG Version: 2.1.1 Build 207) -->
4
+ <defs>
5
+ <style>
6
+ .st0 {
7
+ fill: #fff;
8
+ fill-rule: evenodd;
9
+ }
10
+
11
+ .st1 {
12
+ fill: #222;
13
+ }
14
+ </style>
15
+ </defs>
16
+ <rect class="st1" x="-.2" y="0" width="512.6" height="512.1" rx="71.9" ry="71.9"/>
17
+ <g id="Icon">
18
+ <path class="st0" d="M201.8,235v35.2c0,10.5,4.2,20.6,11.6,28,7.4,7.4,17.5,11.6,28,11.6h35.2c10.5,0,20.6-4.2,28-11.6,7.4-7.4,11.6-17.5,11.6-28v-35.2c0-10.5-4.2-20.6-11.6-28-7.4-7.4-17.5-11.6-28-11.6h-35.2c-10.5,0-20.6,4.2-28,11.6s-11.6,17.5-11.6,28Z"/>
19
+ <path class="st0" d="M69.8,103v35.2c0,10.5,4.2,20.6,11.6,28,7.4,7.4,17.5,11.6,28,11.6h35.2c10.5,0,20.6-4.2,28-11.6,7.4-7.4,11.6-17.5,11.6-28v-35.2c0-10.5-4.2-20.6-11.6-28-7.4-7.4-17.5-11.6-28-11.6h-35.2c-10.5,0-20.6,4.2-28,11.6s-11.6,17.5-11.6,28Z"/>
20
+ <path class="st0" d="M333.7,367v35.2c0,10.5,4.2,20.6,11.6,28,7.4,7.4,17.5,11.6,28,11.6h35.2c10.5,0,20.6-4.2,28-11.6,7.4-7.4,11.6-17.5,11.6-28v-35.2c0-10.5-4.2-20.6-11.6-28-7.4-7.4-17.5-11.6-28-11.6h-35.2c-10.5,0-20.6,4.2-28,11.6-7.4,7.4-11.6,17.5-11.6,28Z"/>
21
+ <path class="st0" d="M171,133.8h228.8c5.8,0,11.4,2.3,15.6,6.4,4.1,4.1,6.4,9.7,6.4,15.6v61.6c0,5.8-2.3,11.4-6.4,15.6-4.1,4.1-9.7,6.4-15.6,6.4h-52.8c-7.3,0-13.2,5.9-13.2,13.2s5.9,13.2,13.2,13.2h52.8c12.8,0,25.1-5.1,34.2-14.2,9.1-9.1,14.2-21.4,14.2-34.2v-61.6c0-12.8-5.1-25.1-14.2-34.2-9.1-9.1-21.4-14.2-34.2-14.2h-228.8c-7.3,0-13.2,5.9-13.2,13.2s5.9,13.2,13.2,13.2Z"/>
22
+ <path class="st0" d="M276.5,371.4H118.2c-5.8,0-11.4-2.3-15.6-6.4-4.1-4.1-6.4-9.7-6.4-15.6v-61.6c0-5.8,2.3-11.4,6.4-15.6,4.1-4.1,9.7-6.4,15.6-6.4h96.8c7.3,0,13.2-5.9,13.2-13.2s-5.9-13.2-13.2-13.2h-96.8c-12.8,0-25.1,5.1-34.2,14.2-9.1,9.1-14.2,21.4-14.2,34.2v61.6c0,12.8,5.1,25.1,14.2,34.2,9.1,9.1,21.4,14.2,34.2,14.2h158.4c7.3,0,13.2-5.9,13.2-13.2s-5.9-13.2-13.2-13.2Z"/>
23
+ <path class="st0" d="M391.5,278.5l-25.9-25.9,25.9-25.9c5.2-5.1,5.2-13.5,0-18.7-5.1-5.2-13.5-5.2-18.7,0l-35.2,35.2c-5.2,5.2-5.2,13.5,0,18.7l35.2,35.2c5.1,5.2,13.5,5.2,18.7,0,5.2-5.1,5.2-13.5,0-18.7h0Z"/>
24
+ <path class="st0" d="M268.3,429.1l35.2-35.2c5.2-5.2,5.2-13.5,0-18.7l-35.2-35.2c-5.1-5.2-13.5-5.2-18.7,0-5.2,5.1-5.2,13.5,0,18.7l25.9,25.9-25.9,25.9c-5.2,5.1-5.2,13.5,0,18.7,5.1,5.2,13.5,5.2,18.7,0h0Z"/>
25
+ </g>
26
+ </svg>
@@ -0,0 +1,64 @@
1
+ /*
2
+ ** SpeechFlow - Speech Processing Flow Graph
3
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+
7
+ :root
8
+ --color-std-bg-0: #000000
9
+ --color-std-bg-1: #1a1a1a
10
+ --color-std-bg-2: #242424
11
+ --color-std-bg-3: #2e2e2e
12
+ --color-std-bg-4: #383838
13
+ --color-std-bg-5: #424242
14
+
15
+ --color-std-fg-0: #606060
16
+ --color-std-fg-1: #808080
17
+ --color-std-fg-2: #a0a0a0
18
+ --color-std-fg-3: #c0c0c0
19
+ --color-std-fg-4: #e0e0e0
20
+ --color-std-fg-5: #ffffff
21
+
22
+ --color-acc-bg-1: #114477
23
+ --color-acc-bg-2: #225588
24
+ --color-acc-bg-3: #336699
25
+ --color-acc-bg-4: #4477aa
26
+ --color-acc-bg-5: #5588bb
27
+
28
+ --color-acc-fg-0: #6090c0
29
+ --color-acc-fg-1: #80b0e0
30
+ --color-acc-fg-2: #88b8e8
31
+ --color-acc-fg-3: #90c0f0
32
+ --color-acc-fg-4: #98c8f8
33
+ --color-acc-fg-5: #a0d0ff
34
+
35
+ --color-sig-bg-1: #904800
36
+ --color-sig-bg-2: #a05810
37
+ --color-sig-bg-3: #b06820
38
+ --color-sig-bg-4: #c07830
39
+ --color-sig-bg-5: #d08840
40
+
41
+ --color-sig-fg-0: #c0b090
42
+ --color-sig-fg-1: #e0d0b0
43
+ --color-sig-fg-2: #e8d8b8
44
+ --color-sig-fg-3: #f0e0c0
45
+ --color-sig-fg-4: #f8e8c8
46
+ --color-sig-fg-5: #fff0d0
47
+
48
+ --font-family: "TypoPRO Source Sans Pro", sans-serif
49
+
50
+
51
+ html,
52
+ body
53
+ margin: 0
54
+ padding: 0
55
+ width: 100vw
56
+ height: 100vh
57
+ overflow: hidden
58
+ color: var(--color-std-fg-3)
59
+ background-color: transparent
60
+ font-family: var(--font-family)
61
+ font-weight: normal
62
+ user-select: none
63
+ font-size: 11pt
64
+
@@ -0,0 +1,142 @@
1
+ <!--
2
+ **
3
+ ** SpeechFlow - Speech Processing Flow Graph
4
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
+ **
7
+ -->
8
+
9
+ <template>
10
+ <div class="app">
11
+ <div class="block">
12
+ <div class="text-col"
13
+ v-bind:class="{ intermediate: lastTextBlockKind === 'intermediate' }">
14
+ <div v-bind:key="value"
15
+ v-for="(value, idx) of text"
16
+ class="text-value">
17
+ {{ value as unknown as string }}
18
+ <span class="cursor" v-if="idx === (text.length - 1) && lastTextBlockKind === 'intermediate'">
19
+ <spinner-grid class="spinner-grid" size="32"/>
20
+ </span>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </template>
26
+
27
+ <style lang="stylus">
28
+ .app
29
+ position: relative
30
+ width: 100vw
31
+ height: 100vh
32
+ margin: 0
33
+ padding: 0
34
+ display: flex
35
+ flex-direction: column
36
+ justify-content: center
37
+ align-items: center
38
+ .block
39
+ height: 20vh
40
+ width: 80vw
41
+ position: absolute
42
+ bottom: 1vh
43
+ .text-col
44
+ width: 100%
45
+ height: 100%
46
+ overflow-x: hidden
47
+ overflow-y: scroll
48
+ display: flex
49
+ flex-direction: column
50
+ align-items: flex-end
51
+ justify-content: flex-end
52
+ .text-value
53
+ width: calc(100% - 2 * 1.0vw)
54
+ background-color: #000000c0
55
+ color: #ffffff
56
+ border-radius: 1vw
57
+ font-size: 2vw
58
+ padding: 0.5vw 1.0vw
59
+ margin-bottom: 0.5vw
60
+ overflow-wrap: break-word
61
+ .cursor
62
+ display: inline-block
63
+ margin-left: 10px
64
+ .text-col.intermediate
65
+ .text-value:last-child
66
+ background-color: #666666c0
67
+ </style>
68
+
69
+ <script setup lang="ts">
70
+ import { defineComponent } from "vue"
71
+ import { VueSpinnerGrid } from "vue3-spinners"
72
+ import moment from "moment"
73
+ import { Duration } from "luxon"
74
+ import ReconnectingWebSocket from "@opensumi/reconnecting-websocket"
75
+ </script>
76
+
77
+ <script lang="ts">
78
+ type SpeechFlowChunk = {
79
+ timestampStart: Duration,
80
+ timestampEnd: Duration,
81
+ kind: "intermediate" | "final",
82
+ type: "text",
83
+ payload: string,
84
+ meta: Map<string, any>
85
+ }
86
+ export default defineComponent({
87
+ name: "app",
88
+ components: {
89
+ "spinner-grid": VueSpinnerGrid
90
+ },
91
+ data: () => ({
92
+ text: [],
93
+ lastTextBlockKind: ""
94
+ }),
95
+ created () {
96
+ },
97
+ async mounted () {
98
+ /* determine API URL */
99
+ let url = document.location.href
100
+ url = url.replace(/#.+$/, "")
101
+ url = url.replace(/\/[^/]*$/, "")
102
+ url = url + "/api"
103
+
104
+ /* connect to WebSocket API for receiving dashboard information */
105
+ const ws = new ReconnectingWebSocket(url, [], {
106
+ reconnectionDelayGrowFactor: 1.3,
107
+ maxReconnectionDelay: 4000,
108
+ minReconnectionDelay: 1000,
109
+ connectionTimeout: 4000,
110
+ minUptime: 5000
111
+ })
112
+ ws.addEventListener("open", (ev) => {
113
+ })
114
+ ws.addEventListener("message", (ev) => {
115
+ const chunk = JSON.parse(ev.data) as SpeechFlowChunk
116
+ if (this.lastTextBlockKind === "intermediate") {
117
+ const arr = this.text as string[]
118
+ arr[arr.length - 1] = chunk.payload
119
+ }
120
+ else {
121
+ const arr = this.text as string[]
122
+ arr.push(chunk.payload)
123
+ this.text = this.text.slice(-2)
124
+ }
125
+ this.lastTextBlockKind = chunk.kind
126
+ })
127
+ },
128
+ methods: {
129
+ log (level: string, msg: string, data: { [ key: string ]: any } | null = null) {
130
+ const timestamp = moment().format("YYYY-MM-DD hh:mm:ss.SSS")
131
+ let output = `${timestamp} [${level}]: ${msg}`
132
+ if (data !== null)
133
+ output += ` (${Object.keys(data)
134
+ .map((key) => key + ": " + JSON.stringify(data[key]))
135
+ .join(", ")
136
+ })`
137
+ console.log(output)
138
+ }
139
+ }
140
+ })
141
+ </script>
142
+
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ **
4
+ ** SpeechFlow - Speech Processing Flow Graph
5
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
6
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
7
+ **
8
+ -->
9
+ <html>
10
+ <head>
11
+ <meta charset="utf-8" />
12
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
13
+ <meta name="viewport" content="width=device-width, minimum-scale=0.1, initial-scale=1.0, maximum-scale=10, user-scalable=no" />
14
+ <link rel="icon" type="image/svg+xml" href="./app-icon.svg" />
15
+ <title>SpeechFlow</title>
16
+ <script type="module" src="index.ts"></script>
17
+ </head>
18
+ <body>
19
+ <div id="app">
20
+ <app></app>
21
+ </div>
22
+ </body>
23
+ </html>
@@ -0,0 +1,26 @@
1
+ /*
2
+ ** SpeechFlow - Speech Processing Flow Graph
3
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+
7
+ /* external dependencies */
8
+ import * as Vue from "vue"
9
+ import "typopro-web/web/TypoPRO-SourceSansPro/TypoPRO-SourceSansPro-Regular.css"
10
+ import "typopro-web/web/TypoPRO-SourceSansPro/TypoPRO-SourceSansPro-Bold.css"
11
+ import "@fortawesome/fontawesome-free/js/all.min.js"
12
+ import "@fortawesome/fontawesome-free/css/all.min.css"
13
+
14
+ /* internal dependencies */
15
+ import App from "./app.vue"
16
+ import "./app.styl"
17
+
18
+ document.addEventListener("DOMContentLoaded", (ev: Event) => {
19
+ (async () => {
20
+ const app = Vue.createApp(App)
21
+ app.mount("#app")
22
+ })().catch((err) => {
23
+ console.error(`app: ERROR: top-level: ${err}`)
24
+ })
25
+ })
26
+
@@ -0,0 +1,9 @@
1
+ /*
2
+ ** SpeechFlow - Speech Processing Flow Graph
3
+ ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
4
+ ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
5
+ */
6
+
7
+ declare global {}
8
+ export {}
9
+
@@ -0,0 +1,3 @@
1
+ {
2
+ "extends": "../etc/tsc-client.json"
3
+ }
@@ -1,13 +0,0 @@
1
- import SpeechFlowNode from "./speechflow-node";
2
- export default class SpeechFlowNodeFFmpeg extends SpeechFlowNode {
3
- static name: string;
4
- private ffmpegBinary;
5
- private ffmpeg;
6
- constructor(id: string, cfg: {
7
- [id: string]: any;
8
- }, opts: {
9
- [id: string]: any;
10
- }, args: any[]);
11
- open(): Promise<void>;
12
- close(): Promise<void>;
13
- }
@@ -1,153 +0,0 @@
1
- "use strict";
2
- /*
3
- ** SpeechFlow - Speech Processing Flow Graph
4
- ** Copyright (c) 2024-2025 Dr. Ralf S. Engelschall <rse@engelschall.com>
5
- ** Licensed under GPL 3.0 <https://spdx.org/licenses/GPL-3.0-only>
6
- */
7
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
- if (k2 === undefined) k2 = k;
9
- var desc = Object.getOwnPropertyDescriptor(m, k);
10
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
- desc = { enumerable: true, get: function() { return m[k]; } };
12
- }
13
- Object.defineProperty(o, k2, desc);
14
- }) : (function(o, m, k, k2) {
15
- if (k2 === undefined) k2 = k;
16
- o[k2] = m[k];
17
- }));
18
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
- Object.defineProperty(o, "default", { enumerable: true, value: v });
20
- }) : function(o, v) {
21
- o["default"] = v;
22
- });
23
- var __importStar = (this && this.__importStar) || (function () {
24
- var ownKeys = function(o) {
25
- ownKeys = Object.getOwnPropertyNames || function (o) {
26
- var ar = [];
27
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
- return ar;
29
- };
30
- return ownKeys(o);
31
- };
32
- return function (mod) {
33
- if (mod && mod.__esModule) return mod;
34
- var result = {};
35
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
- __setModuleDefault(result, mod);
37
- return result;
38
- };
39
- })();
40
- var __importDefault = (this && this.__importDefault) || function (mod) {
41
- return (mod && mod.__esModule) ? mod : { "default": mod };
42
- };
43
- Object.defineProperty(exports, "__esModule", { value: true });
44
- /* standard dependencies */
45
- const node_stream_1 = __importDefault(require("node:stream"));
46
- /* external dependencies */
47
- const ffmpeg_1 = __importDefault(require("@rse/ffmpeg"));
48
- const ffmpeg_stream_1 = require("ffmpeg-stream");
49
- /* internal dependencies */
50
- const speechflow_node_1 = __importDefault(require("./speechflow-node"));
51
- const utils = __importStar(require("./speechflow-utils"));
52
- /* SpeechFlow node for FFmpeg */
53
- class SpeechFlowNodeFFmpeg extends speechflow_node_1.default {
54
- /* declare official node name */
55
- static name = "ffmpeg";
56
- /* internal state */
57
- ffmpegBinary = ffmpeg_1.default.supported ? ffmpeg_1.default.binary : "ffmpeg";
58
- ffmpeg = null;
59
- /* construct node */
60
- constructor(id, cfg, opts, args) {
61
- super(id, cfg, opts, args);
62
- /* declare node configuration parameters */
63
- this.configure({
64
- src: { type: "string", pos: 0, val: "pcm", match: /^(?:pcm|wav|mp3|opus)$/ },
65
- dst: { type: "string", pos: 1, val: "wav", match: /^(?:pcm|wav|mp3|opus)$/ }
66
- });
67
- /* declare node input/output format */
68
- this.input = "audio";
69
- this.output = "audio";
70
- }
71
- /* open node */
72
- async open() {
73
- /* sanity check situation */
74
- if (this.params.src === this.params.dst)
75
- throw new Error("source and destination formats should not be the same");
76
- /* instantiate FFmpeg sub-process */
77
- this.ffmpeg = new ffmpeg_stream_1.Converter(this.ffmpegBinary);
78
- const streamInput = this.ffmpeg.createInputStream({
79
- /* FFmpeg input options */
80
- "fflags": "nobuffer",
81
- "flags": "low_delay",
82
- "probesize": 32,
83
- "analyzeduration": 0,
84
- ...(this.params.src === "pcm" ? {
85
- "f": "s16le",
86
- "ar": this.config.audioSampleRate,
87
- "ac": this.config.audioChannels
88
- } : {}),
89
- ...(this.params.src === "wav" ? {
90
- "f": "wav"
91
- } : {}),
92
- ...(this.params.src === "mp3" ? {
93
- "f": "mp3"
94
- } : {}),
95
- ...(this.params.src === "opus" ? {
96
- "f": "opus"
97
- } : {})
98
- });
99
- const streamOutput = this.ffmpeg.createOutputStream({
100
- /* FFmpeg output options */
101
- "flush_packets": 1,
102
- ...(this.params.dst === "pcm" ? {
103
- "c:a": "pcm_s16le",
104
- "ar": this.config.audioSampleRate,
105
- "ac": this.config.audioChannels,
106
- "f": "s16le",
107
- } : {}),
108
- ...(this.params.dst === "wav" ? {
109
- "f": "wav"
110
- } : {}),
111
- ...(this.params.dst === "mp3" ? {
112
- "c:a": "libmp3lame",
113
- "b:a": "192k",
114
- "f": "mp3"
115
- } : {}),
116
- ...(this.params.dst === "opus" ? {
117
- "acodec": "libopus",
118
- "f": "opus"
119
- } : {})
120
- });
121
- this.ffmpeg.run();
122
- /* establish a duplex stream and connect it to FFmpeg */
123
- this.stream = node_stream_1.default.Duplex.from({
124
- writable: streamInput,
125
- readable: streamOutput
126
- });
127
- /* wrap streams with conversions for chunk vs plain audio */
128
- const wrapper1 = utils.createTransformStreamForWritableSide();
129
- const wrapper2 = utils.createTransformStreamForReadableSide("audio", () => this.timeZero);
130
- this.stream = node_stream_1.default.compose(wrapper1, this.stream, wrapper2);
131
- }
132
- /* close node */
133
- async close() {
134
- /* close duplex stream */
135
- if (this.stream !== null) {
136
- await new Promise((resolve) => {
137
- if (this.stream instanceof node_stream_1.default.Duplex)
138
- this.stream.end(() => { resolve(); });
139
- else
140
- resolve();
141
- });
142
- this.stream.destroy();
143
- this.stream = null;
144
- }
145
- /* shutdown FFmpeg */
146
- if (this.ffmpeg !== null) {
147
- this.ffmpeg.kill();
148
- this.ffmpeg = null;
149
- }
150
- }
151
- }
152
- exports.default = SpeechFlowNodeFFmpeg;
153
- //# sourceMappingURL=speechflow-node-a2a-ffmpeg.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"speechflow-node-a2a-ffmpeg.js","sourceRoot":"","sources":["../src/speechflow-node-a2a-ffmpeg.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import SpeechFlowNode from "./speechflow-node";
2
- export default class SpeechFlowNodeGender extends SpeechFlowNode {
3
- static name: string;
4
- private static speexInitialized;
5
- private classifier;
6
- private queue;
7
- private queueRecv;
8
- private queueAC;
9
- private queueSend;
10
- private shutdown;
11
- constructor(id: string, cfg: {
12
- [id: string]: any;
13
- }, opts: {
14
- [id: string]: any;
15
- }, args: any[]);
16
- open(): Promise<void>;
17
- close(): Promise<void>;
18
- }