speechflow 1.3.2 → 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.
- package/CHANGELOG.md +17 -0
- package/etc/stx.conf +54 -58
- package/package.json +25 -106
- package/speechflow-cli/etc/stx.conf +77 -0
- package/speechflow-cli/package.json +116 -0
- package/speechflow-cli/src/speechflow-node-a2a-meter.ts +217 -0
- package/{src → speechflow-cli/src}/speechflow-node-a2a-vad.ts +14 -21
- package/{src → speechflow-cli/src}/speechflow-node-a2t-deepgram.ts +21 -38
- package/{src → speechflow-cli/src}/speechflow-node-t2a-elevenlabs.ts +10 -16
- package/speechflow-cli/src/speechflow-node-t2t-subtitle.ts +276 -0
- package/{src → speechflow-cli/src}/speechflow-node-x2x-filter.ts +5 -1
- package/{src → speechflow-cli/src}/speechflow-node-x2x-trace.ts +15 -7
- package/{src → speechflow-cli/src}/speechflow-node.ts +7 -0
- package/{src → speechflow-cli/src}/speechflow.ts +81 -25
- package/speechflow-ui-db/etc/eslint.mjs +106 -0
- package/speechflow-ui-db/etc/htmllint.json +55 -0
- package/speechflow-ui-db/etc/stx.conf +79 -0
- package/speechflow-ui-db/etc/stylelint.js +46 -0
- package/speechflow-ui-db/etc/stylelint.yaml +33 -0
- package/speechflow-ui-db/etc/tsc-client.json +30 -0
- package/speechflow-ui-db/etc/tsc.node.json +9 -0
- package/speechflow-ui-db/etc/vite-client.mts +63 -0
- package/speechflow-ui-db/package.d/htmllint-cli+0.0.7.patch +20 -0
- package/speechflow-ui-db/package.json +75 -0
- package/speechflow-ui-db/src/app-icon.ai +1989 -4
- package/speechflow-ui-db/src/app-icon.svg +26 -0
- package/speechflow-ui-db/src/app.styl +64 -0
- package/speechflow-ui-db/src/app.vue +221 -0
- package/speechflow-ui-db/src/index.html +23 -0
- package/speechflow-ui-db/src/index.ts +26 -0
- package/{dst/speechflow.d.ts → speechflow-ui-db/src/lib.d.ts} +5 -3
- package/speechflow-ui-db/src/tsconfig.json +3 -0
- package/speechflow-ui-st/etc/eslint.mjs +106 -0
- package/speechflow-ui-st/etc/htmllint.json +55 -0
- package/speechflow-ui-st/etc/stx.conf +79 -0
- package/speechflow-ui-st/etc/stylelint.js +46 -0
- package/speechflow-ui-st/etc/stylelint.yaml +33 -0
- package/speechflow-ui-st/etc/tsc-client.json +30 -0
- package/speechflow-ui-st/etc/tsc.node.json +9 -0
- package/speechflow-ui-st/etc/vite-client.mts +63 -0
- package/speechflow-ui-st/package.d/htmllint-cli+0.0.7.patch +20 -0
- package/speechflow-ui-st/package.json +79 -0
- package/speechflow-ui-st/src/app-icon.ai +1989 -4
- package/speechflow-ui-st/src/app-icon.svg +26 -0
- package/speechflow-ui-st/src/app.styl +64 -0
- package/speechflow-ui-st/src/app.vue +142 -0
- package/speechflow-ui-st/src/index.html +23 -0
- package/speechflow-ui-st/src/index.ts +26 -0
- package/speechflow-ui-st/src/lib.d.ts +9 -0
- package/speechflow-ui-st/src/tsconfig.json +3 -0
- package/dst/speechflow-node-a2a-ffmpeg.d.ts +0 -13
- package/dst/speechflow-node-a2a-ffmpeg.js +0 -153
- package/dst/speechflow-node-a2a-ffmpeg.js.map +0 -1
- package/dst/speechflow-node-a2a-gender.d.ts +0 -20
- package/dst/speechflow-node-a2a-gender.js +0 -349
- package/dst/speechflow-node-a2a-gender.js.map +0 -1
- package/dst/speechflow-node-a2a-meter.d.ts +0 -14
- package/dst/speechflow-node-a2a-meter.js +0 -196
- package/dst/speechflow-node-a2a-meter.js.map +0 -1
- package/dst/speechflow-node-a2a-mute.d.ts +0 -17
- package/dst/speechflow-node-a2a-mute.js +0 -117
- package/dst/speechflow-node-a2a-mute.js.map +0 -1
- package/dst/speechflow-node-a2a-vad.d.ts +0 -19
- package/dst/speechflow-node-a2a-vad.js +0 -383
- package/dst/speechflow-node-a2a-vad.js.map +0 -1
- package/dst/speechflow-node-a2a-wav.d.ts +0 -11
- package/dst/speechflow-node-a2a-wav.js +0 -211
- package/dst/speechflow-node-a2a-wav.js.map +0 -1
- package/dst/speechflow-node-a2t-deepgram.d.ts +0 -19
- package/dst/speechflow-node-a2t-deepgram.js +0 -345
- package/dst/speechflow-node-a2t-deepgram.js.map +0 -1
- package/dst/speechflow-node-t2a-elevenlabs.d.ts +0 -18
- package/dst/speechflow-node-t2a-elevenlabs.js +0 -244
- package/dst/speechflow-node-t2a-elevenlabs.js.map +0 -1
- package/dst/speechflow-node-t2a-kokoro.d.ts +0 -14
- package/dst/speechflow-node-t2a-kokoro.js +0 -155
- package/dst/speechflow-node-t2a-kokoro.js.map +0 -1
- package/dst/speechflow-node-t2t-deepl.d.ts +0 -15
- package/dst/speechflow-node-t2t-deepl.js +0 -146
- package/dst/speechflow-node-t2t-deepl.js.map +0 -1
- package/dst/speechflow-node-t2t-format.d.ts +0 -11
- package/dst/speechflow-node-t2t-format.js +0 -82
- package/dst/speechflow-node-t2t-format.js.map +0 -1
- package/dst/speechflow-node-t2t-ollama.d.ts +0 -13
- package/dst/speechflow-node-t2t-ollama.js +0 -247
- package/dst/speechflow-node-t2t-ollama.js.map +0 -1
- package/dst/speechflow-node-t2t-openai.d.ts +0 -13
- package/dst/speechflow-node-t2t-openai.js +0 -227
- package/dst/speechflow-node-t2t-openai.js.map +0 -1
- package/dst/speechflow-node-t2t-sentence.d.ts +0 -17
- package/dst/speechflow-node-t2t-sentence.js +0 -250
- package/dst/speechflow-node-t2t-sentence.js.map +0 -1
- package/dst/speechflow-node-t2t-subtitle.d.ts +0 -12
- package/dst/speechflow-node-t2t-subtitle.js +0 -166
- package/dst/speechflow-node-t2t-subtitle.js.map +0 -1
- package/dst/speechflow-node-t2t-transformers.d.ts +0 -14
- package/dst/speechflow-node-t2t-transformers.js +0 -265
- package/dst/speechflow-node-t2t-transformers.js.map +0 -1
- package/dst/speechflow-node-x2x-filter.d.ts +0 -11
- package/dst/speechflow-node-x2x-filter.js +0 -117
- package/dst/speechflow-node-x2x-filter.js.map +0 -1
- package/dst/speechflow-node-x2x-trace.d.ts +0 -11
- package/dst/speechflow-node-x2x-trace.js +0 -104
- package/dst/speechflow-node-x2x-trace.js.map +0 -1
- package/dst/speechflow-node-xio-device.d.ts +0 -13
- package/dst/speechflow-node-xio-device.js +0 -230
- package/dst/speechflow-node-xio-device.js.map +0 -1
- package/dst/speechflow-node-xio-file.d.ts +0 -11
- package/dst/speechflow-node-xio-file.js +0 -216
- package/dst/speechflow-node-xio-file.js.map +0 -1
- package/dst/speechflow-node-xio-mqtt.d.ts +0 -13
- package/dst/speechflow-node-xio-mqtt.js +0 -188
- package/dst/speechflow-node-xio-mqtt.js.map +0 -1
- package/dst/speechflow-node-xio-websocket.d.ts +0 -13
- package/dst/speechflow-node-xio-websocket.js +0 -278
- package/dst/speechflow-node-xio-websocket.js.map +0 -1
- package/dst/speechflow-node.d.ts +0 -63
- package/dst/speechflow-node.js +0 -177
- package/dst/speechflow-node.js.map +0 -1
- package/dst/speechflow-utils.d.ts +0 -74
- package/dst/speechflow-utils.js +0 -519
- package/dst/speechflow-utils.js.map +0 -1
- package/dst/speechflow.js +0 -787
- package/dst/speechflow.js.map +0 -1
- package/src/speechflow-node-a2a-meter.ts +0 -177
- package/src/speechflow-node-t2t-subtitle.ts +0 -149
- /package/{etc → speechflow-cli/etc}/biome.jsonc +0 -0
- /package/{etc → speechflow-cli/etc}/eslint.mjs +0 -0
- /package/{etc → speechflow-cli/etc}/oxlint.jsonc +0 -0
- /package/{etc → speechflow-cli/etc}/speechflow.bat +0 -0
- /package/{etc → speechflow-cli/etc}/speechflow.sh +0 -0
- /package/{etc → speechflow-cli/etc}/speechflow.yaml +0 -0
- /package/{etc → speechflow-cli/etc}/tsconfig.json +0 -0
- /package/{package.d → speechflow-cli/package.d}/@ericedouard+vad-node-realtime+0.2.0.patch +0 -0
- /package/{src → speechflow-cli/src}/lib.d.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-logo.ai +0 -0
- /package/{src → speechflow-cli/src}/speechflow-logo.svg +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-a2a-ffmpeg.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-a2a-gender.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-a2a-mute.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-a2a-wav.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2a-kokoro.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2t-deepl.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2t-format.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2t-ollama.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2t-openai.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2t-sentence.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-t2t-transformers.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-xio-device.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-xio-file.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-xio-mqtt.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-node-xio-websocket.ts +0 -0
- /package/{src → speechflow-cli/src}/speechflow-utils.ts +0 -0
- /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
|
+
|
|
@@ -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,20 +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
|
-
private workingOffTimer;
|
|
12
|
-
private progressInterval;
|
|
13
|
-
constructor(id: string, cfg: {
|
|
14
|
-
[id: string]: any;
|
|
15
|
-
}, opts: {
|
|
16
|
-
[id: string]: any;
|
|
17
|
-
}, args: any[]);
|
|
18
|
-
open(): Promise<void>;
|
|
19
|
-
close(): Promise<void>;
|
|
20
|
-
}
|