Spaces:
Paused
Paused
Julian Bilcke
commited on
Commit
·
4ddd98f
1
Parent(s):
ab89c61
test with whisper cpp (warning: might break the prod server)
Browse files- Dockerfile +1 -0
- package-lock.json +275 -0
- package.json +2 -0
- src/index.mts +50 -3
- src/speechToText/speechToTextWithWhisperLib.mts +21 -0
- src/speechToText/speechToTextWithWhisperSpace.mts +37 -0
- src/types.mts +10 -0
- src/utils/computeSecretFingerprint.mts +7 -0
- src/utils/convertMp3ToWavBase64.mts +42 -0
- src/utils/convertMp3ToWavFilePath.mts +38 -0
Dockerfile
CHANGED
|
@@ -31,6 +31,7 @@ COPY --chown=user package*.json $HOME/app
|
|
| 31 |
|
| 32 |
RUN npm install
|
| 33 |
|
|
|
|
| 34 |
# Copy the current directory contents into the container at $HOME/app setting the owner to the user
|
| 35 |
COPY --chown=user . $HOME/app
|
| 36 |
|
|
|
|
| 31 |
|
| 32 |
RUN npm install
|
| 33 |
|
| 34 |
+
|
| 35 |
# Copy the current directory contents into the container at $HOME/app setting the owner to the user
|
| 36 |
COPY --chown=user . $HOME/app
|
| 37 |
|
package-lock.json
CHANGED
|
@@ -23,12 +23,14 @@
|
|
| 23 |
"fs-extra": "^11.1.1",
|
| 24 |
"gpt-tokens": "^1.1.1",
|
| 25 |
"node-fetch": "^3.3.1",
|
|
|
|
| 26 |
"openai": "^3.3.0",
|
| 27 |
"puppeteer": "^20.8.0",
|
| 28 |
"resize-base64": "^1.0.12",
|
| 29 |
"sharp": "^0.32.4",
|
| 30 |
"temp-dir": "^3.0.0",
|
| 31 |
"ts-node": "^10.9.1",
|
|
|
|
| 32 |
"uuid": "^9.0.0",
|
| 33 |
"yaml": "^2.3.1"
|
| 34 |
}
|
|
@@ -76,6 +78,20 @@
|
|
| 76 |
"node": ">=12"
|
| 77 |
}
|
| 78 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
"node_modules/@gorgonjs/file-provider": {
|
| 80 |
"version": "1.4.1",
|
| 81 |
"resolved": "https://registry.npmjs.org/@gorgonjs/file-provider/-/file-provider-1.4.1.tgz",
|
|
@@ -897,6 +913,11 @@
|
|
| 897 |
"node": "*"
|
| 898 |
}
|
| 899 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 900 |
"node_modules/bufferutil": {
|
| 901 |
"version": "4.0.7",
|
| 902 |
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
|
|
@@ -1153,6 +1174,20 @@
|
|
| 1153 |
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
| 1154 |
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
|
| 1155 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1156 |
"node_modules/console-control-strings": {
|
| 1157 |
"version": "1.1.0",
|
| 1158 |
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
|
|
@@ -1974,6 +2009,65 @@
|
|
| 1974 |
"execa": "^0.10.0"
|
| 1975 |
}
|
| 1976 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1977 |
"node_modules/file-uri-to-path": {
|
| 1978 |
"version": "1.0.0",
|
| 1979 |
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
|
@@ -2646,6 +2740,19 @@
|
|
| 2646 |
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
| 2647 |
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
| 2648 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2649 |
"node_modules/http-signature": {
|
| 2650 |
"version": "1.2.0",
|
| 2651 |
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
|
@@ -2797,6 +2904,14 @@
|
|
| 2797 |
"kind-of": "^6.0.2"
|
| 2798 |
}
|
| 2799 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2800 |
"node_modules/iota-array": {
|
| 2801 |
"version": "1.0.0",
|
| 2802 |
"resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
|
|
@@ -2825,6 +2940,17 @@
|
|
| 2825 |
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
| 2826 |
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
| 2827 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2828 |
"node_modules/is-empty-iterable": {
|
| 2829 |
"version": "2.1.0",
|
| 2830 |
"resolved": "https://registry.npmjs.org/is-empty-iterable/-/is-empty-iterable-2.1.0.tgz",
|
|
@@ -3041,6 +3167,18 @@
|
|
| 3041 |
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
| 3042 |
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
|
| 3043 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3044 |
"node_modules/lru-cache": {
|
| 3045 |
"version": "7.18.3",
|
| 3046 |
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
|
|
@@ -3636,6 +3774,19 @@
|
|
| 3636 |
"node": ">= 8"
|
| 3637 |
}
|
| 3638 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3639 |
"node_modules/nopt": {
|
| 3640 |
"version": "6.0.0",
|
| 3641 |
"resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
|
|
@@ -3853,6 +4004,11 @@
|
|
| 3853 |
"node": ">=6"
|
| 3854 |
}
|
| 3855 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3856 |
"node_modules/parse-data-uri": {
|
| 3857 |
"version": "0.2.0",
|
| 3858 |
"resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz",
|
|
@@ -3907,6 +4063,11 @@
|
|
| 3907 |
"node": ">=4"
|
| 3908 |
}
|
| 3909 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3910 |
"node_modules/path-scurry": {
|
| 3911 |
"version": "1.10.1",
|
| 3912 |
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
|
|
@@ -4272,6 +4433,31 @@
|
|
| 4272 |
"rc": "cli.js"
|
| 4273 |
}
|
| 4274 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4275 |
"node_modules/readable-stream": {
|
| 4276 |
"version": "3.6.2",
|
| 4277 |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
|
|
@@ -4285,6 +4471,25 @@
|
|
| 4285 |
"node": ">= 6"
|
| 4286 |
}
|
| 4287 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4288 |
"node_modules/repeat-string": {
|
| 4289 |
"version": "1.6.1",
|
| 4290 |
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
|
@@ -4370,6 +4575,22 @@
|
|
| 4370 |
"create-readme": "^1.1.0"
|
| 4371 |
}
|
| 4372 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4373 |
"node_modules/resolve-from": {
|
| 4374 |
"version": "4.0.0",
|
| 4375 |
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
|
@@ -4478,6 +4699,15 @@
|
|
| 4478 |
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
| 4479 |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
| 4480 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4481 |
"node_modules/semiver": {
|
| 4482 |
"version": "1.1.0",
|
| 4483 |
"resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz",
|
|
@@ -4622,6 +4852,22 @@
|
|
| 4622 |
"node": ">=0.10.0"
|
| 4623 |
}
|
| 4624 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4625 |
"node_modules/side-channel": {
|
| 4626 |
"version": "1.0.4",
|
| 4627 |
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
|
@@ -4908,6 +5154,17 @@
|
|
| 4908 |
"node": ">=4"
|
| 4909 |
}
|
| 4910 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4911 |
"node_modules/tar": {
|
| 4912 |
"version": "6.1.15",
|
| 4913 |
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
|
|
@@ -5107,6 +5364,19 @@
|
|
| 5107 |
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
|
| 5108 |
"integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
|
| 5109 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5110 |
"node_modules/tunnel-agent": {
|
| 5111 |
"version": "0.6.0",
|
| 5112 |
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
|
@@ -5146,6 +5416,11 @@
|
|
| 5146 |
"node": ">= 0.6"
|
| 5147 |
}
|
| 5148 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5149 |
"node_modules/typedarray-pool": {
|
| 5150 |
"version": "1.2.0",
|
| 5151 |
"resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz",
|
|
|
|
| 23 |
"fs-extra": "^11.1.1",
|
| 24 |
"gpt-tokens": "^1.1.1",
|
| 25 |
"node-fetch": "^3.3.1",
|
| 26 |
+
"nodejs-whisper": "^0.1.4",
|
| 27 |
"openai": "^3.3.0",
|
| 28 |
"puppeteer": "^20.8.0",
|
| 29 |
"resize-base64": "^1.0.12",
|
| 30 |
"sharp": "^0.32.4",
|
| 31 |
"temp-dir": "^3.0.0",
|
| 32 |
"ts-node": "^10.9.1",
|
| 33 |
+
"tts-react": "^3.0.1",
|
| 34 |
"uuid": "^9.0.0",
|
| 35 |
"yaml": "^2.3.1"
|
| 36 |
}
|
|
|
|
| 78 |
"node": ">=12"
|
| 79 |
}
|
| 80 |
},
|
| 81 |
+
"node_modules/@derhuerst/http-basic": {
|
| 82 |
+
"version": "8.2.4",
|
| 83 |
+
"resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.4.tgz",
|
| 84 |
+
"integrity": "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw==",
|
| 85 |
+
"dependencies": {
|
| 86 |
+
"caseless": "^0.12.0",
|
| 87 |
+
"concat-stream": "^2.0.0",
|
| 88 |
+
"http-response-object": "^3.0.1",
|
| 89 |
+
"parse-cache-control": "^1.0.1"
|
| 90 |
+
},
|
| 91 |
+
"engines": {
|
| 92 |
+
"node": ">=6.0.0"
|
| 93 |
+
}
|
| 94 |
+
},
|
| 95 |
"node_modules/@gorgonjs/file-provider": {
|
| 96 |
"version": "1.4.1",
|
| 97 |
"resolved": "https://registry.npmjs.org/@gorgonjs/file-provider/-/file-provider-1.4.1.tgz",
|
|
|
|
| 913 |
"node": "*"
|
| 914 |
}
|
| 915 |
},
|
| 916 |
+
"node_modules/buffer-from": {
|
| 917 |
+
"version": "1.1.2",
|
| 918 |
+
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
|
| 919 |
+
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
|
| 920 |
+
},
|
| 921 |
"node_modules/bufferutil": {
|
| 922 |
"version": "4.0.7",
|
| 923 |
"resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz",
|
|
|
|
| 1174 |
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
| 1175 |
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
|
| 1176 |
},
|
| 1177 |
+
"node_modules/concat-stream": {
|
| 1178 |
+
"version": "2.0.0",
|
| 1179 |
+
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
|
| 1180 |
+
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
|
| 1181 |
+
"engines": [
|
| 1182 |
+
"node >= 6.0"
|
| 1183 |
+
],
|
| 1184 |
+
"dependencies": {
|
| 1185 |
+
"buffer-from": "^1.0.0",
|
| 1186 |
+
"inherits": "^2.0.3",
|
| 1187 |
+
"readable-stream": "^3.0.2",
|
| 1188 |
+
"typedarray": "^0.0.6"
|
| 1189 |
+
}
|
| 1190 |
+
},
|
| 1191 |
"node_modules/console-control-strings": {
|
| 1192 |
"version": "1.1.0",
|
| 1193 |
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
|
|
|
|
| 2009 |
"execa": "^0.10.0"
|
| 2010 |
}
|
| 2011 |
},
|
| 2012 |
+
"node_modules/ffmpeg-static": {
|
| 2013 |
+
"version": "5.2.0",
|
| 2014 |
+
"resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz",
|
| 2015 |
+
"integrity": "sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA==",
|
| 2016 |
+
"hasInstallScript": true,
|
| 2017 |
+
"dependencies": {
|
| 2018 |
+
"@derhuerst/http-basic": "^8.2.0",
|
| 2019 |
+
"env-paths": "^2.2.0",
|
| 2020 |
+
"https-proxy-agent": "^5.0.0",
|
| 2021 |
+
"progress": "^2.0.3"
|
| 2022 |
+
},
|
| 2023 |
+
"engines": {
|
| 2024 |
+
"node": ">=16"
|
| 2025 |
+
}
|
| 2026 |
+
},
|
| 2027 |
+
"node_modules/ffmpeg-static/node_modules/agent-base": {
|
| 2028 |
+
"version": "6.0.2",
|
| 2029 |
+
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
| 2030 |
+
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
|
| 2031 |
+
"dependencies": {
|
| 2032 |
+
"debug": "4"
|
| 2033 |
+
},
|
| 2034 |
+
"engines": {
|
| 2035 |
+
"node": ">= 6.0.0"
|
| 2036 |
+
}
|
| 2037 |
+
},
|
| 2038 |
+
"node_modules/ffmpeg-static/node_modules/debug": {
|
| 2039 |
+
"version": "4.3.4",
|
| 2040 |
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
| 2041 |
+
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
| 2042 |
+
"dependencies": {
|
| 2043 |
+
"ms": "2.1.2"
|
| 2044 |
+
},
|
| 2045 |
+
"engines": {
|
| 2046 |
+
"node": ">=6.0"
|
| 2047 |
+
},
|
| 2048 |
+
"peerDependenciesMeta": {
|
| 2049 |
+
"supports-color": {
|
| 2050 |
+
"optional": true
|
| 2051 |
+
}
|
| 2052 |
+
}
|
| 2053 |
+
},
|
| 2054 |
+
"node_modules/ffmpeg-static/node_modules/https-proxy-agent": {
|
| 2055 |
+
"version": "5.0.1",
|
| 2056 |
+
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
|
| 2057 |
+
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
|
| 2058 |
+
"dependencies": {
|
| 2059 |
+
"agent-base": "6",
|
| 2060 |
+
"debug": "4"
|
| 2061 |
+
},
|
| 2062 |
+
"engines": {
|
| 2063 |
+
"node": ">= 6"
|
| 2064 |
+
}
|
| 2065 |
+
},
|
| 2066 |
+
"node_modules/ffmpeg-static/node_modules/ms": {
|
| 2067 |
+
"version": "2.1.2",
|
| 2068 |
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
| 2069 |
+
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
| 2070 |
+
},
|
| 2071 |
"node_modules/file-uri-to-path": {
|
| 2072 |
"version": "1.0.0",
|
| 2073 |
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
|
|
|
| 2740 |
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
| 2741 |
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
| 2742 |
},
|
| 2743 |
+
"node_modules/http-response-object": {
|
| 2744 |
+
"version": "3.0.2",
|
| 2745 |
+
"resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz",
|
| 2746 |
+
"integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==",
|
| 2747 |
+
"dependencies": {
|
| 2748 |
+
"@types/node": "^10.0.3"
|
| 2749 |
+
}
|
| 2750 |
+
},
|
| 2751 |
+
"node_modules/http-response-object/node_modules/@types/node": {
|
| 2752 |
+
"version": "10.17.60",
|
| 2753 |
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz",
|
| 2754 |
+
"integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw=="
|
| 2755 |
+
},
|
| 2756 |
"node_modules/http-signature": {
|
| 2757 |
"version": "1.2.0",
|
| 2758 |
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
|
|
|
|
| 2904 |
"kind-of": "^6.0.2"
|
| 2905 |
}
|
| 2906 |
},
|
| 2907 |
+
"node_modules/interpret": {
|
| 2908 |
+
"version": "1.4.0",
|
| 2909 |
+
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
|
| 2910 |
+
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
|
| 2911 |
+
"engines": {
|
| 2912 |
+
"node": ">= 0.10"
|
| 2913 |
+
}
|
| 2914 |
+
},
|
| 2915 |
"node_modules/iota-array": {
|
| 2916 |
"version": "1.0.0",
|
| 2917 |
"resolved": "https://registry.npmjs.org/iota-array/-/iota-array-1.0.0.tgz",
|
|
|
|
| 2940 |
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
| 2941 |
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
| 2942 |
},
|
| 2943 |
+
"node_modules/is-core-module": {
|
| 2944 |
+
"version": "2.13.0",
|
| 2945 |
+
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
|
| 2946 |
+
"integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
|
| 2947 |
+
"dependencies": {
|
| 2948 |
+
"has": "^1.0.3"
|
| 2949 |
+
},
|
| 2950 |
+
"funding": {
|
| 2951 |
+
"url": "https://github.com/sponsors/ljharb"
|
| 2952 |
+
}
|
| 2953 |
+
},
|
| 2954 |
"node_modules/is-empty-iterable": {
|
| 2955 |
"version": "2.1.0",
|
| 2956 |
"resolved": "https://registry.npmjs.org/is-empty-iterable/-/is-empty-iterable-2.1.0.tgz",
|
|
|
|
| 3167 |
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
|
| 3168 |
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
|
| 3169 |
},
|
| 3170 |
+
"node_modules/loose-envify": {
|
| 3171 |
+
"version": "1.4.0",
|
| 3172 |
+
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
| 3173 |
+
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
| 3174 |
+
"peer": true,
|
| 3175 |
+
"dependencies": {
|
| 3176 |
+
"js-tokens": "^3.0.0 || ^4.0.0"
|
| 3177 |
+
},
|
| 3178 |
+
"bin": {
|
| 3179 |
+
"loose-envify": "cli.js"
|
| 3180 |
+
}
|
| 3181 |
+
},
|
| 3182 |
"node_modules/lru-cache": {
|
| 3183 |
"version": "7.18.3",
|
| 3184 |
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
|
|
|
|
| 3774 |
"node": ">= 8"
|
| 3775 |
}
|
| 3776 |
},
|
| 3777 |
+
"node_modules/nodejs-whisper": {
|
| 3778 |
+
"version": "0.1.4",
|
| 3779 |
+
"resolved": "https://registry.npmjs.org/nodejs-whisper/-/nodejs-whisper-0.1.4.tgz",
|
| 3780 |
+
"integrity": "sha512-V3cRV+K4hA4TGTgGxAcz3+zDPfPgD2e82KXojgS3Tgbw4RLnirzE1DdiW9hFrcuR3/6pyr7sXvctYhZUV4asvQ==",
|
| 3781 |
+
"dependencies": {
|
| 3782 |
+
"ffmpeg-static": "^5.2.0",
|
| 3783 |
+
"readline-sync": "^1.4.10",
|
| 3784 |
+
"shelljs": "^0.8.5"
|
| 3785 |
+
},
|
| 3786 |
+
"bin": {
|
| 3787 |
+
"download": "dist/downloadModel.js"
|
| 3788 |
+
}
|
| 3789 |
+
},
|
| 3790 |
"node_modules/nopt": {
|
| 3791 |
"version": "6.0.0",
|
| 3792 |
"resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
|
|
|
|
| 4004 |
"node": ">=6"
|
| 4005 |
}
|
| 4006 |
},
|
| 4007 |
+
"node_modules/parse-cache-control": {
|
| 4008 |
+
"version": "1.0.1",
|
| 4009 |
+
"resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
|
| 4010 |
+
"integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg=="
|
| 4011 |
+
},
|
| 4012 |
"node_modules/parse-data-uri": {
|
| 4013 |
"version": "0.2.0",
|
| 4014 |
"resolved": "https://registry.npmjs.org/parse-data-uri/-/parse-data-uri-0.2.0.tgz",
|
|
|
|
| 4063 |
"node": ">=4"
|
| 4064 |
}
|
| 4065 |
},
|
| 4066 |
+
"node_modules/path-parse": {
|
| 4067 |
+
"version": "1.0.7",
|
| 4068 |
+
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
| 4069 |
+
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
| 4070 |
+
},
|
| 4071 |
"node_modules/path-scurry": {
|
| 4072 |
"version": "1.10.1",
|
| 4073 |
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
|
|
|
|
| 4433 |
"rc": "cli.js"
|
| 4434 |
}
|
| 4435 |
},
|
| 4436 |
+
"node_modules/react": {
|
| 4437 |
+
"version": "18.2.0",
|
| 4438 |
+
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
|
| 4439 |
+
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
|
| 4440 |
+
"peer": true,
|
| 4441 |
+
"dependencies": {
|
| 4442 |
+
"loose-envify": "^1.1.0"
|
| 4443 |
+
},
|
| 4444 |
+
"engines": {
|
| 4445 |
+
"node": ">=0.10.0"
|
| 4446 |
+
}
|
| 4447 |
+
},
|
| 4448 |
+
"node_modules/react-dom": {
|
| 4449 |
+
"version": "18.2.0",
|
| 4450 |
+
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
|
| 4451 |
+
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
|
| 4452 |
+
"peer": true,
|
| 4453 |
+
"dependencies": {
|
| 4454 |
+
"loose-envify": "^1.1.0",
|
| 4455 |
+
"scheduler": "^0.23.0"
|
| 4456 |
+
},
|
| 4457 |
+
"peerDependencies": {
|
| 4458 |
+
"react": "^18.2.0"
|
| 4459 |
+
}
|
| 4460 |
+
},
|
| 4461 |
"node_modules/readable-stream": {
|
| 4462 |
"version": "3.6.2",
|
| 4463 |
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
|
|
|
|
| 4471 |
"node": ">= 6"
|
| 4472 |
}
|
| 4473 |
},
|
| 4474 |
+
"node_modules/readline-sync": {
|
| 4475 |
+
"version": "1.4.10",
|
| 4476 |
+
"resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
|
| 4477 |
+
"integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
|
| 4478 |
+
"engines": {
|
| 4479 |
+
"node": ">= 0.8.0"
|
| 4480 |
+
}
|
| 4481 |
+
},
|
| 4482 |
+
"node_modules/rechoir": {
|
| 4483 |
+
"version": "0.6.2",
|
| 4484 |
+
"resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
|
| 4485 |
+
"integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
|
| 4486 |
+
"dependencies": {
|
| 4487 |
+
"resolve": "^1.1.6"
|
| 4488 |
+
},
|
| 4489 |
+
"engines": {
|
| 4490 |
+
"node": ">= 0.10"
|
| 4491 |
+
}
|
| 4492 |
+
},
|
| 4493 |
"node_modules/repeat-string": {
|
| 4494 |
"version": "1.6.1",
|
| 4495 |
"resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
|
|
|
|
| 4575 |
"create-readme": "^1.1.0"
|
| 4576 |
}
|
| 4577 |
},
|
| 4578 |
+
"node_modules/resolve": {
|
| 4579 |
+
"version": "1.22.4",
|
| 4580 |
+
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
|
| 4581 |
+
"integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
|
| 4582 |
+
"dependencies": {
|
| 4583 |
+
"is-core-module": "^2.13.0",
|
| 4584 |
+
"path-parse": "^1.0.7",
|
| 4585 |
+
"supports-preserve-symlinks-flag": "^1.0.0"
|
| 4586 |
+
},
|
| 4587 |
+
"bin": {
|
| 4588 |
+
"resolve": "bin/resolve"
|
| 4589 |
+
},
|
| 4590 |
+
"funding": {
|
| 4591 |
+
"url": "https://github.com/sponsors/ljharb"
|
| 4592 |
+
}
|
| 4593 |
+
},
|
| 4594 |
"node_modules/resolve-from": {
|
| 4595 |
"version": "4.0.0",
|
| 4596 |
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
|
|
|
|
| 4699 |
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
|
| 4700 |
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
|
| 4701 |
},
|
| 4702 |
+
"node_modules/scheduler": {
|
| 4703 |
+
"version": "0.23.0",
|
| 4704 |
+
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
|
| 4705 |
+
"integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
|
| 4706 |
+
"peer": true,
|
| 4707 |
+
"dependencies": {
|
| 4708 |
+
"loose-envify": "^1.1.0"
|
| 4709 |
+
}
|
| 4710 |
+
},
|
| 4711 |
"node_modules/semiver": {
|
| 4712 |
"version": "1.1.0",
|
| 4713 |
"resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz",
|
|
|
|
| 4852 |
"node": ">=0.10.0"
|
| 4853 |
}
|
| 4854 |
},
|
| 4855 |
+
"node_modules/shelljs": {
|
| 4856 |
+
"version": "0.8.5",
|
| 4857 |
+
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
|
| 4858 |
+
"integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
|
| 4859 |
+
"dependencies": {
|
| 4860 |
+
"glob": "^7.0.0",
|
| 4861 |
+
"interpret": "^1.0.0",
|
| 4862 |
+
"rechoir": "^0.6.2"
|
| 4863 |
+
},
|
| 4864 |
+
"bin": {
|
| 4865 |
+
"shjs": "bin/shjs"
|
| 4866 |
+
},
|
| 4867 |
+
"engines": {
|
| 4868 |
+
"node": ">=4"
|
| 4869 |
+
}
|
| 4870 |
+
},
|
| 4871 |
"node_modules/side-channel": {
|
| 4872 |
"version": "1.0.4",
|
| 4873 |
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
|
|
|
| 5154 |
"node": ">=4"
|
| 5155 |
}
|
| 5156 |
},
|
| 5157 |
+
"node_modules/supports-preserve-symlinks-flag": {
|
| 5158 |
+
"version": "1.0.0",
|
| 5159 |
+
"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
|
| 5160 |
+
"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
|
| 5161 |
+
"engines": {
|
| 5162 |
+
"node": ">= 0.4"
|
| 5163 |
+
},
|
| 5164 |
+
"funding": {
|
| 5165 |
+
"url": "https://github.com/sponsors/ljharb"
|
| 5166 |
+
}
|
| 5167 |
+
},
|
| 5168 |
"node_modules/tar": {
|
| 5169 |
"version": "6.1.15",
|
| 5170 |
"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
|
|
|
|
| 5364 |
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
|
| 5365 |
"integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
|
| 5366 |
},
|
| 5367 |
+
"node_modules/tts-react": {
|
| 5368 |
+
"version": "3.0.1",
|
| 5369 |
+
"resolved": "https://registry.npmjs.org/tts-react/-/tts-react-3.0.1.tgz",
|
| 5370 |
+
"integrity": "sha512-v/kUYPyLHB9xAUtI+EF/dU1fEqzP6BByg8fLI9+BcZGJyT+tfT4Yv/cTE7bzhPBS9W90a79XujyikMrG1QqR9g==",
|
| 5371 |
+
"engines": {
|
| 5372 |
+
"node": ">=18.16.0",
|
| 5373 |
+
"npm": ">=9.5.1"
|
| 5374 |
+
},
|
| 5375 |
+
"peerDependencies": {
|
| 5376 |
+
"react": ">=17.0.0",
|
| 5377 |
+
"react-dom": ">=17.0.0"
|
| 5378 |
+
}
|
| 5379 |
+
},
|
| 5380 |
"node_modules/tunnel-agent": {
|
| 5381 |
"version": "0.6.0",
|
| 5382 |
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
|
|
|
| 5416 |
"node": ">= 0.6"
|
| 5417 |
}
|
| 5418 |
},
|
| 5419 |
+
"node_modules/typedarray": {
|
| 5420 |
+
"version": "0.0.6",
|
| 5421 |
+
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
|
| 5422 |
+
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
|
| 5423 |
+
},
|
| 5424 |
"node_modules/typedarray-pool": {
|
| 5425 |
"version": "1.2.0",
|
| 5426 |
"resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz",
|
package.json
CHANGED
|
@@ -30,12 +30,14 @@
|
|
| 30 |
"fs-extra": "^11.1.1",
|
| 31 |
"gpt-tokens": "^1.1.1",
|
| 32 |
"node-fetch": "^3.3.1",
|
|
|
|
| 33 |
"openai": "^3.3.0",
|
| 34 |
"puppeteer": "^20.8.0",
|
| 35 |
"resize-base64": "^1.0.12",
|
| 36 |
"sharp": "^0.32.4",
|
| 37 |
"temp-dir": "^3.0.0",
|
| 38 |
"ts-node": "^10.9.1",
|
|
|
|
| 39 |
"uuid": "^9.0.0",
|
| 40 |
"yaml": "^2.3.1"
|
| 41 |
}
|
|
|
|
| 30 |
"fs-extra": "^11.1.1",
|
| 31 |
"gpt-tokens": "^1.1.1",
|
| 32 |
"node-fetch": "^3.3.1",
|
| 33 |
+
"nodejs-whisper": "^0.1.4",
|
| 34 |
"openai": "^3.3.0",
|
| 35 |
"puppeteer": "^20.8.0",
|
| 36 |
"resize-base64": "^1.0.12",
|
| 37 |
"sharp": "^0.32.4",
|
| 38 |
"temp-dir": "^3.0.0",
|
| 39 |
"ts-node": "^10.9.1",
|
| 40 |
+
"tts-react": "^3.0.1",
|
| 41 |
"uuid": "^9.0.0",
|
| 42 |
"yaml": "^2.3.1"
|
| 43 |
}
|
src/index.mts
CHANGED
|
@@ -3,7 +3,7 @@ import path from "node:path"
|
|
| 3 |
|
| 4 |
import { validate as uuidValidate } from "uuid"
|
| 5 |
import express from "express"
|
| 6 |
-
import { Video, VideoStatus, VideoAPIRequest, RenderRequest, RenderedScene, ImageAnalysisRequest, ImageAnalysisResponse } from "./types.mts"
|
| 7 |
|
| 8 |
import { parseVideoRequest } from "./utils/parseVideoRequest.mts"
|
| 9 |
import { savePendingVideo } from "./scheduler/savePendingVideo.mts"
|
|
@@ -23,6 +23,7 @@ import { getRenderedScene, renderScene } from "./production/renderScene.mts"
|
|
| 23 |
import { parseRenderRequest } from "./utils/parseRenderRequest.mts"
|
| 24 |
import { loadRenderedSceneFromCache } from "./utils/loadRenderedSceneFromCache.mts"
|
| 25 |
import { analyzeImage } from "./analysis/analyzeImageWithIDEFICSAndNastyHack.mts"
|
|
|
|
| 26 |
|
| 27 |
initFolders()
|
| 28 |
// to disable all processing (eg. to debug)
|
|
@@ -75,9 +76,55 @@ app.post("/analyze", async (req, res) => {
|
|
| 75 |
try {
|
| 76 |
response.result = await analyzeImage(request.image, request.prompt)
|
| 77 |
} catch (err) {
|
| 78 |
-
console.log("failed to
|
| 79 |
console.log(err)
|
| 80 |
-
response.error = `failed to
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
}
|
| 82 |
|
| 83 |
if (response.error.length > 0) {
|
|
|
|
| 3 |
|
| 4 |
import { validate as uuidValidate } from "uuid"
|
| 5 |
import express from "express"
|
| 6 |
+
import { Video, VideoStatus, VideoAPIRequest, RenderRequest, RenderedScene, ImageAnalysisRequest, ImageAnalysisResponse, SoundAnalysisResponse, SoundAnalysisRequest } from "./types.mts"
|
| 7 |
|
| 8 |
import { parseVideoRequest } from "./utils/parseVideoRequest.mts"
|
| 9 |
import { savePendingVideo } from "./scheduler/savePendingVideo.mts"
|
|
|
|
| 23 |
import { parseRenderRequest } from "./utils/parseRenderRequest.mts"
|
| 24 |
import { loadRenderedSceneFromCache } from "./utils/loadRenderedSceneFromCache.mts"
|
| 25 |
import { analyzeImage } from "./analysis/analyzeImageWithIDEFICSAndNastyHack.mts"
|
| 26 |
+
import { speechToText } from "./speechToText/speechToTextWithWhisperLib.mts"
|
| 27 |
|
| 28 |
initFolders()
|
| 29 |
// to disable all processing (eg. to debug)
|
|
|
|
| 76 |
try {
|
| 77 |
response.result = await analyzeImage(request.image, request.prompt)
|
| 78 |
} catch (err) {
|
| 79 |
+
console.log("failed to analyze the image!")
|
| 80 |
console.log(err)
|
| 81 |
+
response.error = `failed to analyze the image: ${err}`
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
if (response.error.length > 0) {
|
| 85 |
+
// console.log("server error")
|
| 86 |
+
res.status(500)
|
| 87 |
+
res.write(JSON.stringify(response))
|
| 88 |
+
res.end()
|
| 89 |
+
return
|
| 90 |
+
} else {
|
| 91 |
+
// console.log("all good")
|
| 92 |
+
res.status(200)
|
| 93 |
+
res.write(JSON.stringify(response))
|
| 94 |
+
res.end()
|
| 95 |
+
return
|
| 96 |
+
}
|
| 97 |
+
})
|
| 98 |
+
|
| 99 |
+
|
| 100 |
+
// a sound recognition pipeline
|
| 101 |
+
app.post("/listen", async (req, res) => {
|
| 102 |
+
|
| 103 |
+
const request = req.body as SoundAnalysisRequest
|
| 104 |
+
|
| 105 |
+
if (!request.sound) {
|
| 106 |
+
console.log("Invalid sound")
|
| 107 |
+
res.status(400)
|
| 108 |
+
res.write(JSON.stringify({ result: "", error: "invalid sound" }))
|
| 109 |
+
res.end()
|
| 110 |
+
return
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
console.log("/listen called with: ", {
|
| 114 |
+
sound: request.sound.slice(0, 50)
|
| 115 |
+
})
|
| 116 |
+
|
| 117 |
+
const response: SoundAnalysisResponse = {
|
| 118 |
+
result: "",
|
| 119 |
+
error: ""
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
try {
|
| 123 |
+
response.result = await speechToText(request.sound)
|
| 124 |
+
} catch (err) {
|
| 125 |
+
console.log("failed to listen to the sound!")
|
| 126 |
+
console.log(err)
|
| 127 |
+
response.error = `failed to listen to the sound: ${err}`
|
| 128 |
}
|
| 129 |
|
| 130 |
if (response.error.length > 0) {
|
src/speechToText/speechToTextWithWhisperLib.mts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import { nodewhisper } from "nodejs-whisper"
|
| 3 |
+
|
| 4 |
+
import { convertMp3ToWavFilePath } from "../utils/convertMp3ToWavFilePath.mts"
|
| 5 |
+
|
| 6 |
+
export async function speechToText(sound: string): Promise<string> {
|
| 7 |
+
|
| 8 |
+
console.log("/speechToText: calling whisper binding..")
|
| 9 |
+
|
| 10 |
+
// TODO try a wav? audio/wav
|
| 11 |
+
const wavFilePath = await convertMp3ToWavFilePath(sound)
|
| 12 |
+
|
| 13 |
+
const result = await nodewhisper(wavFilePath, {
|
| 14 |
+
modelName: 'base.en', //Downloaded models name
|
| 15 |
+
})
|
| 16 |
+
|
| 17 |
+
console.log(result)
|
| 18 |
+
|
| 19 |
+
return "TODO"
|
| 20 |
+
|
| 21 |
+
}
|
src/speechToText/speechToTextWithWhisperSpace.mts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import { client } from "@gradio/client"
|
| 3 |
+
|
| 4 |
+
import { convertMp3ToWavBase64 } from "../utils/convertMp3ToWavBase64.mts"
|
| 5 |
+
|
| 6 |
+
const instances: string[] = [
|
| 7 |
+
`${process.env.VC_SPEECH_TO_TEXT_SPACE_API_URL_1 || ""}`,
|
| 8 |
+
].filter(instance => instance?.length > 0)
|
| 9 |
+
|
| 10 |
+
export async function speechToText(sound: string): Promise<string> {
|
| 11 |
+
|
| 12 |
+
const instance = instances.shift()
|
| 13 |
+
instances.push(instance)
|
| 14 |
+
|
| 15 |
+
const api = await client(instance, {
|
| 16 |
+
hf_token: `${process.env.VC_HF_API_TOKEN}` as any
|
| 17 |
+
})
|
| 18 |
+
|
| 19 |
+
console.log("/speechToText: calling Space..")
|
| 20 |
+
|
| 21 |
+
// TODO try a wav? audio/wav
|
| 22 |
+
const wav = await convertMp3ToWavBase64(sound)
|
| 23 |
+
|
| 24 |
+
// const input = sound
|
| 25 |
+
// const input = Buffer.from(sound, "base64")
|
| 26 |
+
// const input = new Blob([sound], { type: 'audio/mpeg' })
|
| 27 |
+
const input = new Blob([wav], { type: 'audio/wav' })
|
| 28 |
+
|
| 29 |
+
const result = await api.predict("/transcribe", [
|
| 30 |
+
input,
|
| 31 |
+
])
|
| 32 |
+
|
| 33 |
+
console.log(result)
|
| 34 |
+
|
| 35 |
+
return "TODO"
|
| 36 |
+
|
| 37 |
+
}
|
src/types.mts
CHANGED
|
@@ -320,6 +320,16 @@ export interface ImageAnalysisResponse {
|
|
| 320 |
error?: string
|
| 321 |
}
|
| 322 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 323 |
|
| 324 |
export interface ImageSegmentationRequest {
|
| 325 |
image: string // in base64
|
|
|
|
| 320 |
error?: string
|
| 321 |
}
|
| 322 |
|
| 323 |
+
export interface SoundAnalysisRequest {
|
| 324 |
+
sound: string // in base64
|
| 325 |
+
prompt: string
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
export interface SoundAnalysisResponse {
|
| 329 |
+
result: string
|
| 330 |
+
error?: string
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
|
| 334 |
export interface ImageSegmentationRequest {
|
| 335 |
image: string // in base64
|
src/utils/computeSecretFingerprint.mts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { computeSha256 } from "./computeSha256.mts"
|
| 2 |
+
|
| 3 |
+
const secretFingerprint = `${process.env.VC_SECRET_FINGERPRINT || ""}`
|
| 4 |
+
|
| 5 |
+
export function computeSecretFingerprint(input: string) {
|
| 6 |
+
return computeSha256(`${secretFingerprint}_${input}`)
|
| 7 |
+
}
|
src/utils/convertMp3ToWavBase64.mts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import path from "node:path"
|
| 3 |
+
import * as fs from "node:fs"
|
| 4 |
+
|
| 5 |
+
import { v4 as uuidv4 } from "uuid"
|
| 6 |
+
import tmpDir from "temp-dir"
|
| 7 |
+
import ffmpeg from "fluent-ffmpeg"
|
| 8 |
+
|
| 9 |
+
export function convertMp3ToWavBase64(base64: string) : Promise<string> {
|
| 10 |
+
return new Promise((resolve, reject) => {
|
| 11 |
+
|
| 12 |
+
const inputPath = path.join(tmpDir, `${uuidv4()}.mp3`)
|
| 13 |
+
const outputPath = path.join(tmpDir, `${uuidv4()}.wav`)
|
| 14 |
+
|
| 15 |
+
const base64Header = 'data:audio/mpeg;base64,';
|
| 16 |
+
|
| 17 |
+
fs.writeFile(inputPath, base64.replace(base64Header, ''), { encoding: 'base64' }, (writeError) => {
|
| 18 |
+
if (writeError) {
|
| 19 |
+
reject(writeError);
|
| 20 |
+
return;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
ffmpeg(inputPath)
|
| 24 |
+
.output(outputPath)
|
| 25 |
+
.on('end', () => {
|
| 26 |
+
fs.readFile(outputPath, { encoding: 'base64' }, (readError, data) => {
|
| 27 |
+
if (readError) {
|
| 28 |
+
reject(readError);
|
| 29 |
+
return;
|
| 30 |
+
}
|
| 31 |
+
resolve(`data:audio/wav;base64,${data}`);
|
| 32 |
+
fs.promises.unlink(inputPath);
|
| 33 |
+
fs.promises.unlink(outputPath);
|
| 34 |
+
});
|
| 35 |
+
})
|
| 36 |
+
.on('error', (conversionError) => {
|
| 37 |
+
reject(conversionError);
|
| 38 |
+
})
|
| 39 |
+
.run();
|
| 40 |
+
});
|
| 41 |
+
});
|
| 42 |
+
}
|
src/utils/convertMp3ToWavFilePath.mts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import path from "node:path"
|
| 3 |
+
import * as fs from "node:fs"
|
| 4 |
+
|
| 5 |
+
import { v4 as uuidv4 } from "uuid"
|
| 6 |
+
import tmpDir from "temp-dir"
|
| 7 |
+
import ffmpeg from "fluent-ffmpeg"
|
| 8 |
+
|
| 9 |
+
export function convertMp3ToWavFilePath(base64: string) : Promise<string> {
|
| 10 |
+
return new Promise((resolve, reject) => {
|
| 11 |
+
|
| 12 |
+
// this one will be deleted at the end
|
| 13 |
+
const tmpInputPath = path.join(tmpDir, `${uuidv4()}.mp3`)
|
| 14 |
+
|
| 15 |
+
const tmpOutputPath = path.join(tmpDir, `${uuidv4()}.wav`)
|
| 16 |
+
|
| 17 |
+
const base64Header = 'data:audio/mpeg;base64,';
|
| 18 |
+
|
| 19 |
+
fs.writeFile(tmpInputPath, base64.replace(base64Header, ''), { encoding: 'base64' }, (writeError) => {
|
| 20 |
+
if (writeError) {
|
| 21 |
+
reject(writeError);
|
| 22 |
+
return;
|
| 23 |
+
}
|
| 24 |
+
|
| 25 |
+
ffmpeg(tmpInputPath)
|
| 26 |
+
.output(tmpOutputPath)
|
| 27 |
+
.on('end', () => {
|
| 28 |
+
fs.promises.unlink(tmpInputPath)
|
| 29 |
+
resolve(tmpOutputPath)
|
| 30 |
+
|
| 31 |
+
})
|
| 32 |
+
.on('error', (conversionError) => {
|
| 33 |
+
reject(conversionError);
|
| 34 |
+
})
|
| 35 |
+
.run();
|
| 36 |
+
});
|
| 37 |
+
});
|
| 38 |
+
}
|