From 9b6dc45e90304492853ff4003305980c6a83d34a Mon Sep 17 00:00:00 2001 From: abearxiong Date: Thu, 12 Mar 2026 03:09:45 +0800 Subject: [PATCH] refactor: streamline voice module and remove unused code - Removed the `file` property from the `Speak` type in `speak.ts`. - Simplified exports in `index.ts` by removing unused functions. - Deleted the `relatime.ts` file as it was no longer needed. - Cleaned up `settingStore.ts` by removing Volcengine configuration properties and related methods. - Updated `voiceStore.ts` to use Flowme API for voice management and removed unnecessary methods. - Changed the main export in `page.tsx` to point to the new App component. - Introduced new `asr-api.ts` and `flowme-api.ts` modules for handling API interactions. - Added `ConfirmDeleteModal.tsx` for confirming voice deletions. - Created `resourceStore.ts` for managing resource uploads. --- package.json | 4 +- pnpm-lock.yaml | 193 +++++----- src/modules/asr-api.ts | 55 +++ src/modules/flowme-api.ts | 281 +++++++++++++++ src/pages/muse/voice/index.tsx | 2 + .../muse/voice/modules/ConfirmDeleteModal.tsx | 55 +++ src/pages/muse/voice/modules/SettingModal.tsx | 38 +- src/pages/muse/voice/modules/VadVoice.tsx | 337 +++++------------- .../muse/voice/modules/speak-db/speak.ts | 1 - src/pages/muse/voice/store/index.ts | 2 +- src/pages/muse/voice/store/relatime.ts | 80 ----- src/pages/muse/voice/store/resourceStore.ts | 59 +++ src/pages/muse/voice/store/settingStore.ts | 76 +--- src/pages/muse/voice/store/voiceStore.ts | 328 ++++++----------- src/pages/page.tsx | 4 +- 15 files changed, 776 insertions(+), 739 deletions(-) create mode 100644 src/modules/asr-api.ts create mode 100644 src/modules/flowme-api.ts create mode 100644 src/pages/muse/voice/modules/ConfirmDeleteModal.tsx delete mode 100644 src/pages/muse/voice/store/relatime.ts create mode 100644 src/pages/muse/voice/store/resourceStore.ts diff --git a/package.json b/package.json index 0235f9a..61bd6fc 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "license": "MIT", "dependencies": { "@base-ui/react": "^1.2.0", - "@kevisual/api": "^0.0.62", + "@kevisual/api": "^0.0.63", "@kevisual/context": "^0.0.8", "@kevisual/router": "0.1.1", "@kevisual/video-tools": "^0.0.13", @@ -69,6 +69,6 @@ "tailwindcss": "^4.2.1", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "vite": "v8.0.0-beta.16" + "vite": "v8.0.0-beta.18" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc2776a..9fdcf90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^1.2.0 version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@kevisual/api': - specifier: ^0.0.62 - version: 0.0.62(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) + specifier: ^0.0.63 + version: 0.0.63(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) '@kevisual/context': specifier: ^0.0.8 version: 0.0.8 @@ -113,16 +113,16 @@ importers: version: 0.0.12 '@kevisual/vite-html-plugin': specifier: ^0.0.1 - version: 0.0.1(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) + version: 0.0.1(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) '@tailwindcss/vite': specifier: ^4.2.1 - version: 4.2.1(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) + version: 4.2.1(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) '@tanstack/react-router-devtools': specifier: ^1.166.7 version: 1.166.7(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(@tanstack/router-core@1.166.7)(csstype@3.2.3)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/router-plugin': specifier: ^1.166.7 - version: 1.166.7(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) + version: 1.166.7(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) '@types/node': specifier: ^25.4.0 version: 25.4.0 @@ -134,7 +134,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^5.1.4 - version: 5.1.4(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) + version: 5.1.4(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0)) dotenv: specifier: ^17.3.1 version: 17.3.1 @@ -151,8 +151,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vite: - specifier: v8.0.0-beta.16 - version: 8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) + specifier: v8.0.0-beta.18 + version: 8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) packages: @@ -672,15 +672,12 @@ packages: '@kevisual/ai@0.0.28': resolution: {integrity: sha512-GLwCNXfopDvOj+hEZwEIwOV2/3VGd+TCPgBClaYuAv30KzhgehlCW05HPjBducSg+uPcdKacEzZsecHjo5fMUQ==} - '@kevisual/api@0.0.62': - resolution: {integrity: sha512-GB8Ho2absXoXoZP2GKyuoRqRqjdwtV0JR512DXBaKJR2sIPn1KvuglbBiX+zPjDBBskv/ApvZKOoSwj1OmkrKQ==} + '@kevisual/api@0.0.63': + resolution: {integrity: sha512-juED4uDgHE9t6kfQRoktn6D1+LoA2bUBaoihTotVP1Cx2b14hBLZEbv0f/iNFzKfRwyYCwwTW6hRjjumOaFibQ==} '@kevisual/context@0.0.8': resolution: {integrity: sha512-DTJpyHI34NE76B7g6f+QlIqiCCyqI2qkBMQE736dzeRDGxOjnbe2iQY9W+Rt2PE6kmymM3qyOmSfNovyWyWrkA==} - '@kevisual/js-filter@0.0.5': - resolution: {integrity: sha512-+S+Sf3K/aP6XtZI2s7TgKOr35UuvUvtpJ9YDW30a+mY0/N8gRuzyKhieBzQN7Ykayzz70uoMavBXut2rUlLgzw==} - '@kevisual/js-filter@0.0.6': resolution: {integrity: sha512-FcbOsmS1inhwrfgXMM/XLFTGTHUxBCss32JEMYdEFWQDYCar5rN8cxD1W8FuKDTVRlpA+zBpQ/BE6XT4UaeljA==} @@ -1016,83 +1013,97 @@ packages: '@ricky0123/vad-web@0.0.30': resolution: {integrity: sha512-cJyYrh4YeeUBJcbR9Bic/bFDyB9qBkAepvpuWM3vLxnAi7bC3VHzf51UeNdT+OtY4D7MLAgV8iJMc4z41ZnaWg==} - '@rolldown/binding-android-arm64@1.0.0-rc.6': - resolution: {integrity: sha512-kvjTSWGcrv+BaR2vge57rsKiYdVR8V8CoS0vgKrc570qRBfty4bT+1X0z3j2TaVV+kAYzA0PjeB9+mdZyqUZlg==} + '@rolldown/binding-android-arm64@1.0.0-rc.8': + resolution: {integrity: sha512-5bcmMQDWEfWUq3m79Mcf/kbO6e5Jr6YjKSsA1RnpXR6k73hQ9z1B17+4h93jXpzHvS18p7bQHM1HN/fSd+9zog==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.6': - resolution: {integrity: sha512-+tJhD21KvGNtUrpLXrZQlT+j5HZKiEwR2qtcZb3vNOUpvoT9QjEykr75ZW/Kr0W89gose/HVXU6351uVZD8Qvw==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.8': + resolution: {integrity: sha512-dcHPd5N4g9w2iiPRJmAvO0fsIWzF2JPr9oSuTjxLL56qu+oML5aMbBMNwWbk58Mt3pc7vYs9CCScwLxdXPdRsg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.6': - resolution: {integrity: sha512-DKNhjMk38FAWaHwUt1dFR3rA/qRAvn2NUvSG2UGvxvlMxSmN/qqww/j4ABAbXhNRXtGQNmrAINMXRuwHl16ZHg==} + '@rolldown/binding-darwin-x64@1.0.0-rc.8': + resolution: {integrity: sha512-mw0VzDvoj8AuR761QwpdCFN0sc/jspuc7eRYJetpLWd+XyansUrH3C7IgNw6swBOgQT9zBHNKsVCjzpfGJlhUA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-rc.6': - resolution: {integrity: sha512-8TThsRkCPAnfyMBShxrGdtoOE6h36QepqRQI97iFaQSCRbHFWHcDHppcojZnzXoruuhPnjMEygzaykvPVJsMRg==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.8': + resolution: {integrity: sha512-xNrRa6mQ9NmMIJBdJtPMPG8Mso0OhM526pDzc/EKnRrIrrkHD1E0Z6tONZRmUeJElfsQ6h44lQQCcDilSNIvSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.6': - resolution: {integrity: sha512-ZfmFoOwPUZCWtGOVC9/qbQzfc0249FrRUOzV2XabSMUV60Crp211OWLQN1zmQAsRIVWRcEwhJ46Z1mXGo/L/nQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.8': + resolution: {integrity: sha512-WgCKoO6O/rRUwimWfEJDeztwJJmuuX0N2bYLLRxmXDTtCwjToTOqk7Pashl/QpQn3H/jHjx0b5yCMbcTVYVpNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.6': - resolution: {integrity: sha512-ZsGzbNETxPodGlLTYHaCSGVhNN/rvkMDCJYHdT7PZr5jFJRmBfmDi2awhF64Dt2vxrJqY6VeeYSgOzEbHRsb7Q==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-tOHgTOQa8G4Z3ULj4G3NYOGGJEsqPHR91dT72u63OtVsZ7B6wFJKOx+ZKv+pvwzxWz92/I2ycaqi2/Ll4l+rlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': - resolution: {integrity: sha512-elPpdevtCdUOqziemR86C4CSCr/5sUxalzDrf/CJdMT+kZt2C556as++qHikNOz0vuFf52h+GJNXZM08eWgGPQ==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.8': + resolution: {integrity: sha512-oRbxcgDujCi2Yp1GTxoUFsIFlZsuPHU4OV4AzNc3/6aUmR4lfm9FK0uwQu82PJsuUwnF2jFdop3Ep5c1uK7Uxg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': - resolution: {integrity: sha512-IBwXsf56o3xhzAyaZxdM1CX8UFiBEUFCjiVUgny67Q8vPIqkjzJj0YKhd3TbBHanuxThgBa59f6Pgutg2OGk5A==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-oaLRyUHw8kQE5M89RqrDJZ10GdmGJcMeCo8tvaE4ukOofqgjV84AbqBSH6tTPjeT2BHv+xlKj678GBuIb47lKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-1hjSKFrod5MwBBdLOOA0zpUuSfSDkYIY+QqcMcIU1WOtswZtZdUkcFcZza9b2HcAb0bnpmmyo0LZcaxLb2ov1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.8': + resolution: {integrity: sha512-a1+F0aV4Wy9tT3o+cHl3XhOy6aFV+B8Ll+/JFj98oGkb6lGk3BNgrxd+80RwYRVd23oLGvj3LwluKYzlv1PEuw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': - resolution: {integrity: sha512-vOk7G8V9Zm+8a6PL6JTpCea61q491oYlGtO6CvnsbhNLlKdf0bbCPytFzGQhYmCKZDKkEbmnkcIprTEGCURnwg==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.8': + resolution: {integrity: sha512-bGyXCFU11seFrf7z8PcHSwGEiFVkZ9vs+auLacVOQrVsI8PFHJzzJROF3P6b0ODDmXr0m6Tj5FlDhcXVk0Jp8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': - resolution: {integrity: sha512-ASjEDI4MRv7XCQb2JVaBzfEYO98JKCGrAgoW6M03fJzH/ilCnC43Mb3ptB9q/lzsaahoJyIBoAGKAYEjUvpyvQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.8': + resolution: {integrity: sha512-n8d+L2bKgf9G3+AM0bhHFWdlz9vYKNim39ujRTieukdRek0RAo2TfG2uEnV9spa4r4oHUfL9IjcY3M9SlqN1gw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-rc.6': - resolution: {integrity: sha512-mYa1+h2l6Zc0LvmwUh0oXKKYihnw/1WC73vTqw+IgtfEtv47A+rWzzcWwVDkW73+UDr0d/Ie/HRXoaOY22pQDw==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.8': + resolution: {integrity: sha512-4R4iJDIk7BrJdteAbEAICXPoA7vZoY/M0OBfcRlQxzQvUYMcEp2GbC/C8UOgQJhu2TjGTpX1H8vVO1xHWcRqQA==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.6': - resolution: {integrity: sha512-e2ABskbNH3MRUBMjgxaMjYIw11DSwjLJxBII3UgpF6WClGLIh8A20kamc+FKH5vIaFVnYQInmcLYSUVpqMPLow==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.8': + resolution: {integrity: sha512-3lwnklba9qQOpFnQ7EW+A1m4bZTWXZE4jtehsZ0YOl2ivW1FQqp5gY7X2DLuKITggesyuLwcmqS11fA7NtrmrA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.6': - resolution: {integrity: sha512-dJVc3ifhaRXxIEh1xowLohzFrlQXkJ66LepHm+CmSprTWgVrPa8Fx3OL57xwIqDEH9hufcKkDX2v65rS3NZyRA==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.8': + resolution: {integrity: sha512-VGjCx9Ha1P/r3tXGDZyG0Fcq7Q0Afnk64aaKzr1m40vbn1FL8R3W0V1ELDvPgzLXaaqK/9PnsqSaLWXfn6JtGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1100,8 +1111,8 @@ packages: '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - '@rolldown/pluginutils@1.0.0-rc.6': - resolution: {integrity: sha512-Y0+JT8Mi1mmW08K6HieG315XNRu4L0rkfCpA364HtytjgiqYnMYRdFPcxRl+BQQqNXzecL2S9nii+RUpO93XIA==} + '@rolldown/pluginutils@1.0.0-rc.8': + resolution: {integrity: sha512-wzJwL82/arVfeSP3BLr1oTy40XddjtEdrdgtJ4lLRBu06mP3q/8HGM6K0JRlQuTA3XB0pNJx2so/nmpY4xyOew==} '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1940,8 +1951,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rolldown@1.0.0-rc.6: - resolution: {integrity: sha512-B8vFPV1ADyegoYfhg+E7RAucYKv0xdVlwYYsIJgfPNeiSxZGWNxts9RqhyGzC11ULK/VaeXyKezGCwpMiH8Ktw==} + rolldown@1.0.0-rc.8: + resolution: {integrity: sha512-RGOL7mz/aoQpy/y+/XS9iePBfeNRDUdozrhCEJxdpJyimW8v6yp4c30q6OviUU5AnUJVLRL9GP//HUs6N3ALrQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2097,8 +2108,8 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - vite@8.0.0-beta.16: - resolution: {integrity: sha512-c0t7hYkxsjws89HH+BUFh/sL3BpPNhNsL9CJrTpMxBmwKQBRSa5OJ5w4o9O0bQVI/H/vx7UpUUIevvXa37NS/Q==} + vite@8.0.0-beta.18: + resolution: {integrity: sha512-azgNbWdsO/WBqHQxwSCy+zd+Fq+37Fix2hn64cQuiUvaaGGSUac7f8RGQhI1aQl9OKbfWblrCFLWs+tln06c2A==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -2601,10 +2612,10 @@ snapshots: ai: 6.0.116(zod@4.3.6) zod: 4.3.6 - '@kevisual/api@0.0.62(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': + '@kevisual/api@0.0.63(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: '@kevisual/context': 0.0.8 - '@kevisual/js-filter': 0.0.5 + '@kevisual/js-filter': 0.0.6 '@kevisual/load': 0.0.6 '@paralleldrive/cuid2': 3.3.0 es-toolkit: 1.45.1 @@ -2624,8 +2635,6 @@ snapshots: '@kevisual/context@0.0.8': {} - '@kevisual/js-filter@0.0.5': {} - '@kevisual/js-filter@0.0.6': {} '@kevisual/kv-login@0.1.17': {} @@ -2680,9 +2689,9 @@ snapshots: '@kevisual/video@0.0.2': {} - '@kevisual/vite-html-plugin@0.0.1(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': + '@kevisual/vite-html-plugin@0.0.1(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': dependencies: - vite: 8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) '@napi-rs/wasm-runtime@1.1.1': dependencies: @@ -2983,50 +2992,56 @@ snapshots: dependencies: onnxruntime-web: 1.24.3 - '@rolldown/binding-android-arm64@1.0.0-rc.6': + '@rolldown/binding-android-arm64@1.0.0-rc.8': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.6': + '@rolldown/binding-darwin-arm64@1.0.0-rc.8': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.6': + '@rolldown/binding-darwin-x64@1.0.0-rc.8': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.6': + '@rolldown/binding-freebsd-x64@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.6': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.6': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.6': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.6': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.6': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.6': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.8': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-rc.6': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.8': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-rc.8': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-rc.8': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.6': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.8': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.6': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.8': optional: true '@rolldown/pluginutils@1.0.0-rc.3': {} - '@rolldown/pluginutils@1.0.0-rc.6': {} + '@rolldown/pluginutils@1.0.0-rc.8': {} '@standard-schema/spec@1.1.0': {} @@ -3097,12 +3112,12 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 - '@tailwindcss/vite@4.2.1(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': + '@tailwindcss/vite@4.2.1(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': dependencies: '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 tailwindcss: 4.2.1 - vite: 8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) '@tanstack/history@1.161.4': {} @@ -3174,7 +3189,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.166.7(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': + '@tanstack/router-plugin@1.166.7(@tanstack/react-router@1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -3191,7 +3206,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.166.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - vite: 8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -3253,7 +3268,7 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitejs/plugin-react@5.1.4(vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': + '@vitejs/plugin-react@5.1.4(vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -3261,7 +3276,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) + vite: 8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0) transitivePeerDependencies: - supports-color @@ -3826,24 +3841,26 @@ snapshots: resolve-pkg-maps@1.0.0: {} - rolldown@1.0.0-rc.6: + rolldown@1.0.0-rc.8: dependencies: '@oxc-project/types': 0.115.0 - '@rolldown/pluginutils': 1.0.0-rc.6 + '@rolldown/pluginutils': 1.0.0-rc.8 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.6 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.6 - '@rolldown/binding-darwin-x64': 1.0.0-rc.6 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.6 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.6 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.6 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.6 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.6 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.6 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.6 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.6 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.6 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.6 + '@rolldown/binding-android-arm64': 1.0.0-rc.8 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.8 + '@rolldown/binding-darwin-x64': 1.0.0-rc.8 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.8 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.8 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.8 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.8 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.8 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.8 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.8 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.8 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.8 scheduler@0.27.0: {} @@ -3978,13 +3995,13 @@ snapshots: uuid@8.3.2: {} - vite@8.0.0-beta.16(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0): + vite@8.0.0-beta.18(@types/node@25.4.0)(esbuild@0.27.3)(jiti@2.6.1)(tsx@4.21.0): dependencies: '@oxc-project/runtime': 0.115.0 lightningcss: 1.31.1 picomatch: 4.0.3 postcss: 8.5.6 - rolldown: 1.0.0-rc.6 + rolldown: 1.0.0-rc.8 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 25.4.0 diff --git a/src/modules/asr-api.ts b/src/modules/asr-api.ts new file mode 100644 index 0000000..5a8d195 --- /dev/null +++ b/src/modules/asr-api.ts @@ -0,0 +1,55 @@ +import { createQueryApi } from '@kevisual/query/api'; +import { query } from '@/modules/query.ts'; +const api = { + "asr": { + /** + * 语音转文字,将base64的音频数据转换为文字, 参数: base64Data 为base64编码的音频数据 + * + * @param data - Request parameters + * @param data.base64Data - {string (minLength: 1)} base64编码的音频数据 + */ + "text": { + "path": "asr", + "key": "text", + "description": "语音转文字,将base64的音频数据转换为文字, 参数: base64Data 为base64编码的音频数据", + "metadata": { + "args": { + "base64Data": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "minLength": 1, + "description": "base64编码的音频数据" + } + }, + "url": "/api/router", + "source": "query-proxy-api" + } + }, + /** + * 语音转文字,将音频链接的音频数据转换为文字, 参数: url 为音频链接 + * + * @param data - Request parameters + * @param data.url - {string (minLength: 1)} 音频链接 + */ + "link": { + "path": "asr", + "key": "link", + "description": "语音转文字,将音频链接的音频数据转换为文字, 参数: url 为音频链接", + "metadata": { + "args": { + "url": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "minLength": 1, + "description": "音频链接" + } + }, + "url": "/api/router", + "source": "query-proxy-api" + } + } + } +} as const; +const queryApi = createQueryApi({ api, query }); + +export { queryApi }; diff --git a/src/modules/flowme-api.ts b/src/modules/flowme-api.ts new file mode 100644 index 0000000..15952f6 --- /dev/null +++ b/src/modules/flowme-api.ts @@ -0,0 +1,281 @@ +import { createQueryApi } from '@kevisual/query/api'; +import { query } from '@/modules/query.ts'; +const api = { + "flowme": { + /** + * 获取 flowme 列表 + * + * @param data - Request parameters + * @param data.page - {number} 页码, 默认为 1 + * @param data.pageSize - {number} 每页数量, 默认为 100 + * @param data.search - {string} 搜索关键词 + * @param data.channelId - {string} 频道ID + * @param data.type - {string} 类型 + * @param data.sort - {"ASC" | "DESC"} 排序方式,ASC 或 DESC,默认为 DESC + * @param data.timeRange - {object} 时间范围过滤 + */ + "list": { + "path": "flowme", + "key": "list", + "description": "获取 flowme 列表", + "metadata": { + "args": { + "page": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "number", + "description": "页码, 默认为 1", + "optional": true + }, + "pageSize": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "number", + "description": "每页数量, 默认为 100", + "optional": true + }, + "search": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "description": "搜索关键词", + "optional": true + }, + "channelId": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "description": "频道ID", + "optional": true + }, + "type": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "description": "类型", + "optional": true + }, + "sort": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "description": "排序方式,ASC 或 DESC,默认为 DESC", + "optional": true + }, + "timeRange": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "from": { + "type": "string", + "description": "开始时间,ISO 格式" + }, + "to": { + "type": "string", + "description": "结束时间,ISO 格式" + } + }, + "additionalProperties": false, + "description": "时间范围过滤", + "optional": true + } + }, + "url": "/api/router", + "source": "query-proxy-api" + } + }, + /** + * 创建一个 flowme + * + * @param data - Request parameters + * @param data.data - {object} + */ + "create": { + "path": "flowme", + "key": "create", + "description": "创建一个 flowme", + "metadata": { + "args": { + "data": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "标题" + }, + "description": { + "type": "string", + "description": "描述" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "标签" + }, + "link": { + "type": "string", + "description": "链接" + }, + "data": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {}, + "description": "数据" + }, + "channelId": { + "type": "string", + "description": "频道ID" + }, + "type": { + "type": "string", + "description": "类型" + }, + "source": { + "type": "string", + "description": "来源" + }, + "importance": { + "type": "number", + "description": "重要性等级" + }, + "isArchived": { + "type": "boolean", + "description": "是否归档" + } + }, + "additionalProperties": false + } + }, + "url": "/api/router", + "source": "query-proxy-api" + } + }, + /** + * 更新一个 flowme + * + * @param data - Request parameters + * @param data.data - {object} + */ + "update": { + "path": "flowme", + "key": "update", + "description": "更新一个 flowme", + "metadata": { + "args": { + "data": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID" + }, + "title": { + "type": "string", + "description": "标题" + }, + "description": { + "type": "string", + "description": "描述" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "description": "标签" + }, + "link": { + "type": "string", + "description": "链接" + }, + "data": { + "type": "object", + "propertyNames": { + "type": "string" + }, + "additionalProperties": {}, + "description": "数据" + }, + "channelId": { + "type": "string", + "description": "频道ID" + }, + "type": { + "type": "string", + "description": "类型" + }, + "source": { + "type": "string", + "description": "来源" + }, + "importance": { + "type": "number", + "description": "重要性等级" + }, + "isArchived": { + "type": "boolean", + "description": "是否归档" + } + }, + "required": [ + "id" + ], + "additionalProperties": false + } + }, + "url": "/api/router", + "source": "query-proxy-api" + } + }, + /** + * 删除 flowme + * + * @param data - Request parameters + * @param data.data - {object} + */ + "delete": { + "path": "flowme", + "key": "delete", + "description": "删除 flowme ", + "metadata": { + "args": { + "data": { + "$schema": "https://json-schema.org/draft/2020-12/schema", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID" + } + }, + "required": [ + "id" + ], + "additionalProperties": false + } + }, + "url": "/api/router", + "source": "query-proxy-api" + } + }, + /** + * 获取单个 flowme, 参数: data.id 必填 + */ + "get": { + "path": "flowme", + "key": "get", + "description": "获取单个 flowme, 参数: data.id 必填", + "metadata": { + "url": "/api/router", + "source": "query-proxy-api" + } + } + } +} as const; +const queryApi = createQueryApi({ api, query }); + +export { queryApi }; diff --git a/src/pages/muse/voice/index.tsx b/src/pages/muse/voice/index.tsx index 73a033d..be7600f 100644 --- a/src/pages/muse/voice/index.tsx +++ b/src/pages/muse/voice/index.tsx @@ -1,8 +1,10 @@ import { VadVoice } from './modules/VadVoice'; +import { ConfirmDeleteModal } from './modules/ConfirmDeleteModal'; export const App = () => { return
+
} \ No newline at end of file diff --git a/src/pages/muse/voice/modules/ConfirmDeleteModal.tsx b/src/pages/muse/voice/modules/ConfirmDeleteModal.tsx new file mode 100644 index 0000000..bdf9b38 --- /dev/null +++ b/src/pages/muse/voice/modules/ConfirmDeleteModal.tsx @@ -0,0 +1,55 @@ +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, + DialogDescription, + DialogFooter, +} from "@/components/ui/dialog"; +import { Button } from "@/components/ui/button"; +import { useVoiceStore } from "../store/voiceStore"; +import { toast } from "sonner"; + +export const ConfirmDeleteModal = () => { + const { deleteConfirm, closeDeleteConfirm } = useVoiceStore(); + + const handleDelete = async () => { + if (!deleteConfirm.voice) return; + + try { + const { deleteVoice } = useVoiceStore.getState(); + await deleteVoice(deleteConfirm.voice); + console.log("语音记录删除成功"); + toast.success("删除成功"); + closeDeleteConfirm(); + } catch (error) { + console.error("删除语音记录失败:", error); + toast.error("删除失败: " + (error instanceof Error ? error.message : "未知错误")); + } + }; + + const speak = deleteConfirm.voice?.data?.speak; + + return ( + !open && closeDeleteConfirm()}> + + + 确认删除 + + {speak?.text + ? `此语音包含文字内容:"${speak.text}"。删除后将无法恢复,确定要删除吗?` + : "确定要删除这条语音记录吗?删除后将无法恢复。"} + + + + + + + + + ); +}; diff --git a/src/pages/muse/voice/modules/SettingModal.tsx b/src/pages/muse/voice/modules/SettingModal.tsx index d07aeee..c74737e 100644 --- a/src/pages/muse/voice/modules/SettingModal.tsx +++ b/src/pages/muse/voice/modules/SettingModal.tsx @@ -7,21 +7,16 @@ import { DialogTitle, } from "../../../../components/ui/dialog"; import { useSettingStore } from '../store/settingStore'; -import { PasswordInput } from '../../components/PasswordInput'; -import { X, RotateCcw } from 'lucide-react'; +import { X } from 'lucide-react'; export const SettingModal: React.FC = () => { const { isOpen, autoRecognize, listen, - volcengineAucAppId, - volcengineAucToken, closeModal, setAutoRecognize, setListen, - setVolcengineAucAppId, - setVolcengineAucToken, resetToDefault, } = useSettingStore(); @@ -58,7 +53,7 @@ export const SettingModal: React.FC = () => {
{/* 语音识别设置 */}
- +
@@ -104,36 +99,7 @@ export const SettingModal: React.FC = () => {
- - {/* 火山引擎配置 */} -
-

火山引擎配置

- -
-
- - setVolcengineAucAppId(e.target.value)} - placeholder="请输入火山引擎 App ID" - className="w-full px-3 py-2 border border-gray-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" - /> -
- -
- - -
-
-
-
); } -export const ShowVoicePlayer = ({ data }: { data: Speak[] }) => { +const ShowVoicePlayerItem = ({ item }: { item: FlowmeSpeak }) => { + const speak = item.data.speak || {}; + return
  • +
    +
    +
    + +
    +
    +
    +
    +
    + {speak ? new Date(speak.timestamp).toLocaleTimeString() : ''} +
    +
    + #{speak?.no} +
    +
    +
    +
    { + e.stopPropagation(); + useVoiceStore.getState().openDeleteConfirm(item); + }} + className="w-5 h-5 hover:bg-red-100 rounded flex items-center justify-center text-red-500 transition-colors cursor-pointer" + title="删除" + > + + + +
    +
    +
    + {speak.text && ( +
    { + e.stopPropagation(); + if (!speak.text) return; + try { + await navigator.clipboard.writeText(speak.text); + toast.success('文字已复制到剪贴板'); + } catch (error) { + console.error('复制失败:', error); + toast.error('复制失败,请手动选择文字复制'); + } + }} + > + 📝 {speak.text} +
    + )} +
    +
    +
    +
  • +} +export const ShowVoicePlayer = ({ data }: { data: FlowmeSpeak[] }) => { useEffect(() => { const bottomElement = document.getElementById('voice-list-bottom'); if (bottomElement) { @@ -231,124 +226,8 @@ export const ShowVoicePlayer = ({ data }: { data: Speak[] }) => { } }, [data]); return (