Ver Fonte

Merge branch 'pitch'

AXCWG há 3 meses atrás
pai
commit
0b59e120b7
3 ficheiros alterados com 405 adições e 18 exclusões
  1. 58 18
      main.js
  2. 341 0
      package-lock.json
  3. 6 0
      package.json

+ 58 - 18
main.js

@@ -41,6 +41,8 @@ const https = require("node:https");
 const {OpenCC} = require("opencc");
 const {HttpsProxyAgent} = require("https-proxy-agent");
 const sortArray = require("sort-array");
+const Kali = require("@descript/kali");
+const WavEncoder = require("wav-encoder");
 const converters2t = new OpenCC('s2t.json')
 const convertert2s = new OpenCC('t2s.json')
 app.use(bodyParser.json({"limit": "200mb"}));
@@ -91,7 +93,7 @@ async function Submit(req) {
             console.log("can parse ")
             fetch(req.body.albumCover).then(res => {
                 res.arrayBuffer().then(async r => {
-                    if(r.byteLength === 0){
+                    if (r.byteLength === 0) {
                         GC()
                         currentTask.shift();
                         console.log(queue.contents)
@@ -522,19 +524,58 @@ let availCache = {};
 // }, 1800000)
 
 // Fetch
-app.get('/:uuid', function (req, res) {
+app.get('/:uuid', async function (req, res) {
 
     let uuid = req.params.uuid;
+    let pitch = req.query.pitch;
+
+    async function Provider() {
 
-    function Provider(err, rows) {
         try {
-            availCache[uuid] = rows[0]
-            res.contentType("audio/mp3");
-            res.header("Access-Control-Allow-Origin", "*");
-            res.header("Access-Control-Allow-Headers", "Content-Type");
-            res.header('Content-Disposition', `attachment; filename="${encodeURI(availCache[uuid].song_name)}.mp3"`);
+
             /** @type {ArrayBuffer}*/
-            res.sendSeekable(availCache[uuid].databinary)
+            if(!pitch){
+                res.contentType("audio/mp3");
+                res.header("Access-Control-Allow-Origin", "*");
+                res.header("Access-Control-Allow-Headers", "Content-Type");
+                res.header('Content-Disposition', `attachment; filename="${encodeURI(availCache[uuid].song_name)}.mp3"`);
+                res.sendSeekable(availCache[uuid].databinary)
+            }else{
+                let decodeAudio = await import('audio-decode')
+                let decoders = decodeAudio.decoders;
+                await decoders.mp3();
+                let decoded = await decoders.mp3(availCache[uuid].databinary)
+                fs.writeFileSync('./test', decoded.getChannelData(0))
+                let Kali = require('@descript/kali')
+                let kali = new Kali(1)
+                let samplerate = decoded.sampleRate / pitch
+                kali.setup(samplerate, pitch, true)
+                kali.input(decoded.getChannelData(0))
+
+                kali.process()
+                let output = new Float32Array(samplerate * decoded.duration)
+                kali.output(output);
+
+
+                const WavEncoder = require('wav-encoder')
+                const prep = {
+                    sampleRate: samplerate,
+                    channelData: [
+                        output
+                    ]
+                }
+                let wavBuffer = await WavEncoder.encode(prep)
+
+
+
+
+                res.contentType("audio/wav");
+                res.header("Access-Control-Allow-Origin", "*");
+                res.header("Access-Control-Allow-Headers", "Content-Type");
+                res.header("Access-Control-Allow-Origin", "*");
+                res.header('Content-Disposition', `attachment; filename="${encodeURI(availCache[uuid].song_name)}.wav"`);
+                res.sendSeekable(Buffer.from(wavBuffer))
+            }
 
 
         } catch (e) {
@@ -544,19 +585,18 @@ app.get('/:uuid', function (req, res) {
             console.log("Triggered err");
 
         }
-    }
 
-    if (availCache[uuid] !== undefined) {
-        res.contentType("audio/mp3");
-        res.header("Access-Control-Allow-Origin", "*");
-        res.header("Access-Control-Allow-Headers", "Content-Type");
-        res.header("Access-Control-Allow-Origin", "*");
-        res.header('Content-Disposition', `attachment; filename="${encodeURI(availCache[uuid].song_name)}.mp3"`);
-        res.sendSeekable(availCache[uuid].databinary)
 
+    }
+
+    if (availCache[uuid]) {
+        await Provider();
 
     } else {
-        db.execute("SELECT song_name, databinary FROM instrunet_entry WHERE uuid = ?", [uuid], Provider)
+        db.execute("SELECT song_name, databinary FROM instrunet_entry WHERE uuid = ?", [uuid], (err, rows)=>{
+            availCache[uuid] = rows[0]
+            Provider()
+        })
 
     }
 

+ 341 - 0
package-lock.json

@@ -9,6 +9,9 @@
       "version": "1.0.0",
       "license": "MIT",
       "dependencies": {
+        "@descript/kali": "^0.0.7",
+        "audio-decode": "^2.2.2",
+        "audio-encoder": "^1.0.4",
         "body-parser": "^1.20.3",
         "cnchar": "^3.2.6",
         "express": "^4.21.1",
@@ -16,15 +19,18 @@
         "https": "^1.0.0",
         "https-proxy-agent": "^7.0.6",
         "js-queue": "^2.0.2",
+        "lamejs": "zhuker/lamejs",
         "minimist": "^1.2.8",
         "mysql2": "^3.11.5",
         "node-fetch": "^2.7.0",
         "node-run-cmd": "^1.0.1",
         "nodemailer": "^6.9.16",
         "opencc": "github:BYVoid/OpenCC",
+        "pitch-shift": "^0.0.0",
         "send-seekable": "^1.0.4",
         "sort-array": "^5.0.0",
         "sqlite3": "^5.1.7",
+        "wav-encoder": "^1.3.0",
         "webp-converter": "^2.3.3",
         "webp-converter-browser": "^1.0.4",
         "ws": "^8.18.0"
@@ -42,6 +48,19 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@descript/kali": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/@descript/kali/-/kali-0.0.7.tgz",
+      "integrity": "sha512-N2YkJHOxoIJ7L+R7Gnjhv0gQHibyjBOSx9DmdLfZKEt5Mw49e9eEMx7kCoAyTlsfMEESvDA6A/gq2SbPLZ0sSQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@eshaz/web-worker": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@eshaz/web-worker/-/web-worker-1.2.2.tgz",
+      "integrity": "sha512-WxXiHFmD9u/owrzempiDlBB1ZYqiLnm9s6aPc8AlFQalq2tKmqdmMr9GXOupDgzXtqnBipj8Un0gkIm7Sjf8mw=="
+    },
     "node_modules/@gar/promisify": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
@@ -156,6 +175,53 @@
         "node": ">=10"
       }
     },
+    "node_modules/@thi.ng/bitstream": {
+      "version": "2.4.10",
+      "resolved": "https://registry.npmjs.org/@thi.ng/bitstream/-/bitstream-2.4.10.tgz",
+      "integrity": "sha512-0m/X+cNaXV3u7cUFifeG6n7p/nBCliGsaVAXn9OGZ8reChb8fUmZTbbuWZbDsA4/zqH7ySIbxWYH77R0L0qzyA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/postspectacular"
+        },
+        {
+          "type": "patreon",
+          "url": "https://patreon.com/thing_umbrella"
+        },
+        {
+          "type": "liberapay",
+          "url": "https://liberapay.com/thi.ng"
+        }
+      ],
+      "dependencies": {
+        "@thi.ng/errors": "^2.5.24"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@thi.ng/errors": {
+      "version": "2.5.24",
+      "resolved": "https://registry.npmjs.org/@thi.ng/errors/-/errors-2.5.24.tgz",
+      "integrity": "sha512-XcUe550Xls6gUpw3VtJtXySgdTRocN3xPaQRraQx6YnKFuGz5/Lk//4TnXx8coPAiDr3eLDOfCyM23kxAWL9Rg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/postspectacular"
+        },
+        {
+          "type": "patreon",
+          "url": "https://patreon.com/thing_umbrella"
+        },
+        {
+          "type": "liberapay",
+          "url": "https://liberapay.com/thi.ng"
+        }
+      ],
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/@tootallnate/once": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
@@ -166,6 +232,41 @@
         "node": ">= 6"
       }
     },
+    "node_modules/@wasm-audio-decoders/common": {
+      "version": "9.0.5",
+      "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/common/-/common-9.0.5.tgz",
+      "integrity": "sha512-b9JNh9sPAvn8PVIizNh9D60WkfQong/u9ea873H47u7zvVDLctxYIp2aZw9CQqXaQdk7JB3MoU5UHiseO40swg==",
+      "dependencies": {
+        "@eshaz/web-worker": "1.2.2",
+        "simple-yenc": "^1.0.4"
+      }
+    },
+    "node_modules/@wasm-audio-decoders/flac": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/flac/-/flac-0.2.5.tgz",
+      "integrity": "sha512-8M//CgB3PlkWwn47KcwD0tO6DZBA7/AGG0ukHSG0G97UbNEUNINvKDWAKPVWznzHsqeBP6axw+K/38dzng64JA==",
+      "dependencies": {
+        "@wasm-audio-decoders/common": "9.0.5",
+        "codec-parser": "2.5.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/eshaz"
+      }
+    },
+    "node_modules/@wasm-audio-decoders/ogg-vorbis": {
+      "version": "0.1.16",
+      "resolved": "https://registry.npmjs.org/@wasm-audio-decoders/ogg-vorbis/-/ogg-vorbis-0.1.16.tgz",
+      "integrity": "sha512-HcEx4LPZbbzjhs9bTXgMaXLVCSMSo/egY9paJxAnE9tsYbvseAaGtVddLYktl3Qi/G+nW/ZzUXg4144izJjqCw==",
+      "dependencies": {
+        "@wasm-audio-decoders/common": "9.0.5",
+        "codec-parser": "2.5.0"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/eshaz"
+      }
+    },
     "node_modules/abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -278,6 +379,42 @@
       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
       "license": "MIT"
     },
+    "node_modules/audio-buffer": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/audio-buffer/-/audio-buffer-5.0.0.tgz",
+      "integrity": "sha512-gsDyj1wwUp8u7NBB+eW6yhLb9ICf+0eBmDX8NGaAS00w8/fLqFdxUlL5Ge/U8kB64DlQhdonxYC59dXy1J7H/w=="
+    },
+    "node_modules/audio-decode": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/audio-decode/-/audio-decode-2.2.2.tgz",
+      "integrity": "sha512-xyh7z6dpRT+5Ez4ggV2cEkSShkDvvIBBmVPR3kYY7uIBqRO1BGNjofip6JnjBnvezhrU3ypBGZjepyKFDZWnDw==",
+      "dependencies": {
+        "@wasm-audio-decoders/flac": "^0.2.4",
+        "@wasm-audio-decoders/ogg-vorbis": "^0.1.15",
+        "audio-buffer": "^5.0.0",
+        "audio-type": "^2.2.1",
+        "mpg123-decoder": "^1.0.0",
+        "node-wav": "^0.0.2",
+        "ogg-opus-decoder": "^1.6.12",
+        "qoa-format": "^1.0.1"
+      }
+    },
+    "node_modules/audio-encoder": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/audio-encoder/-/audio-encoder-1.0.4.tgz",
+      "integrity": "sha512-B9SH/AqqyrrDtSY51QXZoDjFmLeDgBLi7yDKI4wv8w3uzIPTsj0WEnzUiKNLmEANEJygxTjtYUGYVOSVaNNhjw==",
+      "dependencies": {
+        "lamejs": "1.2.1"
+      }
+    },
+    "node_modules/audio-type": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/audio-type/-/audio-type-2.2.1.tgz",
+      "integrity": "sha512-En9AY6EG1qYqEy5L/quryzbA4akBpJrnBZNxeKTqGHC2xT9Qc4aZ8b7CcbOMFTTc/MGdoNyp+SN4zInZNKxMYA==",
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/aws-ssl-profiles": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
@@ -322,6 +459,11 @@
         "file-uri-to-path": "1.0.0"
       }
     },
+    "node_modules/bit-twiddle": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-0.0.2.tgz",
+      "integrity": "sha512-76iFAOrkcuw5UPA30Pt32XaytMHXz/04JembgIwsQAp7ImHYSWNq1shBbrlWf6CUvh1+amQ81LI8hNhqQgsBEw=="
+    },
     "node_modules/bl": {
       "version": "4.1.0",
       "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
@@ -510,6 +652,11 @@
       "integrity": "sha512-LGU2ss7KcsI1Psme73+jffUX0ZDuChr6P9Rj2j8lynJHStklNpoC/+kheKSSUcXQ1u2KNvZt1Shs/5efcihHkg==",
       "license": "MIT"
     },
+    "node_modules/codec-parser": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/codec-parser/-/codec-parser-2.5.0.tgz",
+      "integrity": "sha512-Ru9t80fV8B0ZiixQl8xhMTLru+dzuis/KQld32/x5T/+3LwZb0/YvQdSKytX9JqCnRdiupvAvyYJINKrXieziQ=="
+    },
     "node_modules/color-support": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
@@ -572,6 +719,14 @@
       "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
+    "node_modules/cwise": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/cwise/-/cwise-0.1.2.tgz",
+      "integrity": "sha512-eXla00JmiEzetUZM3d5/YBHZyaBGj6HZFAIvOLenjtJl/aVm9OK+8MIi91WnLvWp54MxCq/cJazQFBNS4XDL4g==",
+      "dependencies": {
+        "falafel": "~0.1.6"
+      }
+    },
     "node_modules/debug": {
       "version": "4.3.7",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
@@ -673,6 +828,23 @@
         "node": ">=8"
       }
     },
+    "node_modules/detect-pitch": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/detect-pitch/-/detect-pitch-0.1.2.tgz",
+      "integrity": "sha512-dsIRyIGumgAkTGODB2SEQGf0xK++41Xv8fXPFUdqIJDG/t+eR8q5D/JcvPae8ikvbef+tQ2RxI1FaVsKwV9deA==",
+      "dependencies": {
+        "bit-twiddle": "~0.0.2",
+        "ndarray": "~0.2.4",
+        "ndarray-fft": "~0.0.2",
+        "ndarray-ops": "~0.1.3",
+        "typedarray-pool": "~0.1.1"
+      }
+    },
+    "node_modules/dup": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/dup/-/dup-0.0.0.tgz",
+      "integrity": "sha512-gfPVn3o0/vNDPsVcLGQqwrVXBELWi4EyIo+Pl6ImnYpXEHbfGPfc6m5bfJlBQI8dr8d8A4AlDaH/inn331GIEA=="
+    },
     "node_modules/easy-stack": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz",
@@ -766,6 +938,18 @@
       "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
       "license": "MIT"
     },
+    "node_modules/esprima": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz",
+      "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/etag": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -841,6 +1025,17 @@
       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
       "license": "MIT"
     },
+    "node_modules/falafel": {
+      "version": "0.1.6",
+      "resolved": "https://registry.npmjs.org/falafel/-/falafel-0.1.6.tgz",
+      "integrity": "sha512-r1s3VwKzm6PB35MZmnfZoF6NTgSKRxf8How2lBsrDq81OsYXb/2fR8ysfURHCTlFpqJDQVA88iB70wFrFRYDsA==",
+      "dependencies": {
+        "esprima": "~1.0.2"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/file-uri-to-path": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
@@ -889,6 +1084,11 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/frame-hop": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/frame-hop/-/frame-hop-0.0.0.tgz",
+      "integrity": "sha512-rOZAZ2cT1oLiKYKQdlG40fktu8Pma8RYyqCxgoiGPno1hoRwo9G39i2KPFwkfzBecJGL8V/312QynNNR/1+W7w=="
+    },
     "node_modules/fresh": {
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -1336,6 +1536,13 @@
       "license": "MIT",
       "optional": true
     },
+    "node_modules/lamejs": {
+      "version": "1.2.1",
+      "resolved": "git+ssh://git@github.com/zhuker/lamejs.git#582bbba6a12f981b984d8fb9e1874499fed85675",
+      "dependencies": {
+        "use-strict": "1.0.1"
+      }
+    },
     "node_modules/long": {
       "version": "5.2.3",
       "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
@@ -1642,6 +1849,18 @@
       "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
       "license": "MIT"
     },
+    "node_modules/mpg123-decoder": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/mpg123-decoder/-/mpg123-decoder-1.0.0.tgz",
+      "integrity": "sha512-WV+pyuMUhRqv7s8S6p/Ii4KQHdBD1pb3yaABxcKJRsNp+HQ/Y6z2iIBIaOZu0JMHPTOoICYt0REDZ7XfLu+n/g==",
+      "dependencies": {
+        "@wasm-audio-decoders/common": "9.0.5"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/eshaz"
+      }
+    },
     "node_modules/ms": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -1710,6 +1929,41 @@
       "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==",
       "license": "MIT"
     },
+    "node_modules/ndarray": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/ndarray/-/ndarray-0.2.4.tgz",
+      "integrity": "sha512-LJMawx4VXPIwq5WgaFzBjT/+gvOq45VNqlhSDcm+n39Yqc3CRZwgYB8ZWNnQZUUI/+pbw4xhrHCvoC/aoc9SVw=="
+    },
+    "node_modules/ndarray-fft": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/ndarray-fft/-/ndarray-fft-0.0.2.tgz",
+      "integrity": "sha512-zm3/bSOuLVFRYZD2N7z0wb7MfEhC0w9v7DBNTiKO7ULmB0Ynblzv1FIdS3yu+ZW33HBmI0VkBl0atENenVsHPA==",
+      "dependencies": {
+        "bit-twiddle": "~0.0.2",
+        "cwise": "~0.1.2",
+        "ndarray": "~0.2.0",
+        "ndarray-ops": "~0.1.3",
+        "typedarray-pool": "0.0.1"
+      }
+    },
+    "node_modules/ndarray-fft/node_modules/typedarray-pool": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-0.0.1.tgz",
+      "integrity": "sha512-8PU+emzZqNGzTXNvYaT223cG2IhSLHNimrWwisEC/quYu7PTOyjESdMUl1mVytAeCHofDvxHUVWlFuJ1IkqfPw==",
+      "dependencies": {
+        "bit-twiddle": "~0.0.2",
+        "dup": "~0.0.0"
+      }
+    },
+    "node_modules/ndarray-ops": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/ndarray-ops/-/ndarray-ops-0.1.3.tgz",
+      "integrity": "sha512-Hh9tT1h4inGhM+dFocTYXOtIjq3PX/5LjBTbjF/ELwTwmApjcNH6qlD/29tbvRljcpwUPPVGyg9+JSQSuyqVag==",
+      "dependencies": {
+        "cwise": "~0.1.2",
+        "ndarray": "~0.2.0"
+      }
+    },
     "node_modules/negotiator": {
       "version": "0.6.4",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
@@ -1789,6 +2043,14 @@
       "integrity": "sha512-OUePfObrxlzQa3NE9QFUGgyPvTi81/fV41gwSU+HE4tZ7sEHiRC+O88gjw68WXp7BSj9uWjEbdEv4ei0117ffA==",
       "license": "MIT"
     },
+    "node_modules/node-wav": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/node-wav/-/node-wav-0.0.2.tgz",
+      "integrity": "sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==",
+      "engines": {
+        "node": ">=4.4.0"
+      }
+    },
     "node_modules/nodemailer": {
       "version": "6.9.16",
       "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz",
@@ -1851,6 +2113,20 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/ogg-opus-decoder": {
+      "version": "1.6.14",
+      "resolved": "https://registry.npmjs.org/ogg-opus-decoder/-/ogg-opus-decoder-1.6.14.tgz",
+      "integrity": "sha512-RQpk9yFl/mqXFwcgf1BrEYWL92HZk++aU1fOO8mPZ1+1DUYbJdpdUQEFfbPE1xcBkRGU3p75DjEO+EDMNeikFQ==",
+      "dependencies": {
+        "@wasm-audio-decoders/common": "9.0.5",
+        "codec-parser": "2.5.0",
+        "opus-decoder": "0.7.7"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/eshaz"
+      }
+    },
     "node_modules/on-finished": {
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -1885,6 +2161,23 @@
         "node": ">= 8.0.0"
       }
     },
+    "node_modules/opus-decoder": {
+      "version": "0.7.7",
+      "resolved": "https://registry.npmjs.org/opus-decoder/-/opus-decoder-0.7.7.tgz",
+      "integrity": "sha512-KWDyCi/9aXnNN+jrjs+aaVdwiwzDdac81S9ul0iv1CTs4+5K4VDZKuJjIImrYOBA2oSNHDjVq4xzn6BE+XbI1A==",
+      "dependencies": {
+        "@wasm-audio-decoders/common": "9.0.5"
+      },
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/eshaz"
+      }
+    },
+    "node_modules/overlap-add": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/overlap-add/-/overlap-add-0.0.0.tgz",
+      "integrity": "sha512-FhnM3n/dUE81x4aGDVJMC2m3qh3JQ7anj7AtDdGjU0wdLM/HePcWJvCMJF7qzjB37DQTFaVZ+A5yd9/c3KCxOA=="
+    },
     "node_modules/p-map": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
@@ -1925,6 +2218,17 @@
       "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
       "license": "MIT"
     },
+    "node_modules/pitch-shift": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/pitch-shift/-/pitch-shift-0.0.0.tgz",
+      "integrity": "sha512-tebLbkWoDosEKXDmUuJK3wGTDwvZHmmPGUrpaXv7mea8gVJgY+RqllQnVDXffNRvLiB/kTGByinVr5V/Q84Seg==",
+      "dependencies": {
+        "detect-pitch": "~0.1.2",
+        "frame-hop": "~0.0.0",
+        "overlap-add": "~0.0.0",
+        "typedarray-pool": "~0.1.1"
+      }
+    },
     "node_modules/prebuild-install": {
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz",
@@ -1995,6 +2299,14 @@
         "once": "^1.3.1"
       }
     },
+    "node_modules/qoa-format": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/qoa-format/-/qoa-format-1.0.1.tgz",
+      "integrity": "sha512-dMB0Z6XQjdpz/Cw4Rf6RiBpQvUSPCfYlQMWvmuWlWkAT7nDQD29cVZ1SwDUB6DYJSitHENwbt90lqfI+7bvMcw==",
+      "dependencies": {
+        "@thi.ng/bitstream": "^2.2.12"
+      }
+    },
     "node_modules/qs": {
       "version": "6.13.0",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
@@ -2338,6 +2650,15 @@
         "simple-concat": "^1.0.0"
       }
     },
+    "node_modules/simple-yenc": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/simple-yenc/-/simple-yenc-1.0.4.tgz",
+      "integrity": "sha512-5gvxpSd79e9a3V4QDYUqnqxeD4HGlhCakVpb6gMnDD7lexJggSBJRBO5h52y/iJrdXRilX9UCuDaIJhSWm5OWw==",
+      "funding": {
+        "type": "individual",
+        "url": "https://github.com/sponsors/eshaz"
+      }
+    },
     "node_modules/smart-buffer": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
@@ -2622,6 +2943,15 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/typedarray-pool": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-0.1.2.tgz",
+      "integrity": "sha512-VwKhM9XrrG2aCWsKmELft4NU0EDgkPNMAXJud8x04UrFjJMlib9ET2G0TlphKaHtn688T1ZGmaOtJ7PshHl9PA==",
+      "dependencies": {
+        "bit-twiddle": "~0.0.2",
+        "dup": "~0.0.0"
+      }
+    },
     "node_modules/typical": {
       "version": "7.3.0",
       "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz",
@@ -2660,6 +2990,11 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/use-strict": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/use-strict/-/use-strict-1.0.1.tgz",
+      "integrity": "sha512-IeiWvvEXfW5ltKVMkxq6FvNf2LojMKvB2OCeja6+ct24S1XOmQw2dGr2JyndwACWAGJva9B7yPHwAmeA9QCqAQ=="
+    },
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -2693,6 +3028,12 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/wav-encoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/wav-encoder/-/wav-encoder-1.3.0.tgz",
+      "integrity": "sha512-FXJdEu2qDOI+wbVYZpu21CS1vPEg5NaxNskBr4SaULpOJMrLE6xkH8dECa7PiS+ZoeyvP7GllWUAxPN3AvFSEw==",
+      "license": "MIT"
+    },
     "node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",

+ 6 - 0
package.json

@@ -12,6 +12,9 @@
   "license": "MIT",
   "description": "",
   "dependencies": {
+    "@descript/kali": "^0.0.7",
+    "audio-decode": "^2.2.2",
+    "audio-encoder": "^1.0.4",
     "body-parser": "^1.20.3",
     "cnchar": "^3.2.6",
     "express": "^4.21.1",
@@ -19,15 +22,18 @@
     "https": "^1.0.0",
     "https-proxy-agent": "^7.0.6",
     "js-queue": "^2.0.2",
+    "lamejs": "zhuker/lamejs",
     "minimist": "^1.2.8",
     "mysql2": "^3.11.5",
     "node-fetch": "^2.7.0",
     "node-run-cmd": "^1.0.1",
     "nodemailer": "^6.9.16",
     "opencc": "github:BYVoid/OpenCC",
+    "pitch-shift": "^0.0.0",
     "send-seekable": "^1.0.4",
     "sort-array": "^5.0.0",
     "sqlite3": "^5.1.7",
+    "wav-encoder": "^1.3.0",
     "webp-converter": "^2.3.3",
     "webp-converter-browser": "^1.0.4",
     "ws": "^8.18.0"