From 3f1f9bf9d0c992de8868a6c5eb02443236e7c0c0 Mon Sep 17 00:00:00 2001 From: Palash Debnath <4178343+debpalash@users.noreply.github.com> Date: Wed, 16 Sep 2026 13:09:32 +0530 Subject: [PATCH] docs: refresh Electron showcase and packaging prep --- .github/workflows/electron-build.yml | 115 ++++++++++++++++++ README.md | 12 +- README_CN.md | 9 +- docs/media/electron/dubbing.png | Bin 161926 -> 158192 bytes docs/media/electron/voice-cloning.png | Bin 101065 -> 108625 bytes docs/media/electron/voice-design.png | Bin 127490 -> 135308 bytes docs/media/electron/voicestudio.gif | Bin 3215648 -> 3600484 bytes .../components/app-shell/sponsor-footer.css | 75 ++++++++++-- .../components/app-shell/support-shortcut.css | 32 +++++ .../components/app-shell/support-shortcut.tsx | 9 +- .../integrations/integrations-page.css | 44 ++++++- .../integrations/integrations-page.tsx | 10 +- .../src/renderer/src/i18n/locales/ar.json | 1 + .../src/renderer/src/i18n/locales/de.json | 1 + .../src/renderer/src/i18n/locales/en.json | 1 + .../src/renderer/src/i18n/locales/es.json | 1 + .../src/renderer/src/i18n/locales/fr.json | 1 + .../src/renderer/src/i18n/locales/hi.json | 1 + .../src/renderer/src/i18n/locales/id.json | 1 + .../src/renderer/src/i18n/locales/it.json | 1 + .../src/renderer/src/i18n/locales/ja.json | 1 + .../src/renderer/src/i18n/locales/ko.json | 1 + .../src/renderer/src/i18n/locales/nl.json | 1 + .../src/renderer/src/i18n/locales/pl.json | 1 + .../src/renderer/src/i18n/locales/pt.json | 1 + .../src/renderer/src/i18n/locales/ru.json | 1 + .../src/renderer/src/i18n/locales/sv.json | 1 + .../src/renderer/src/i18n/locales/th.json | 1 + .../src/renderer/src/i18n/locales/tr.json | 1 + .../src/renderer/src/i18n/locales/uk.json | 1 + .../src/renderer/src/i18n/locales/vi.json | 1 + .../src/renderer/src/i18n/locales/zh-CN.json | 1 + .../src/renderer/src/i18n/locales/zh-TW.json | 1 + 33 files changed, 301 insertions(+), 26 deletions(-) create mode 100644 .github/workflows/electron-build.yml create mode 100644 electron/src/renderer/src/components/app-shell/support-shortcut.css diff --git a/.github/workflows/electron-build.yml b/.github/workflows/electron-build.yml new file mode 100644 index 00000000..9521f543 --- /dev/null +++ b/.github/workflows/electron-build.yml @@ -0,0 +1,115 @@ +name: Electron packaging rehearsal + +# Explicitly artifact-only: no tag, schedule, release, or publishing permission. +on: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: electron-rehearsal-${{ github.ref }} + cancel-in-progress: true + +jobs: + package: + runs-on: ${{ matrix.runner }} + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + include: + - runner: ubuntu-24.04 + platform: linux + arch: x64 + target: x86_64-unknown-linux-gnu + flags: --linux --x64 + - runner: windows-2022 + platform: win32 + arch: x64 + target: x86_64-pc-windows-msvc + flags: --win --x64 + - runner: macos-15 + platform: darwin + arch: arm64 + target: aarch64-apple-darwin + flags: --mac --arm64 + - runner: macos-15-intel + platform: darwin + arch: x64 + target: x86_64-apple-darwin + flags: --mac --x64 + defaults: + run: + shell: bash + env: + VOICESTUDIO_RUST_TARGET: ${{ matrix.target }} + VOICESTUDIO_UPDATE_CHANNEL: electron-preview-${{ matrix.platform }}-${{ matrix.arch }} + CSC_IDENTITY_AUTO_DISCOVERY: 'false' + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: '22' + - uses: oven-sh/setup-bun@v2 + with: + bun-version: '1.4.2' + - uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@v2 + with: + workspaces: native/desktop-bridge -> target + key: electron-${{ matrix.target }} + - uses: astral-sh/setup-uv@v6 + with: + version: '0.12.13' + enable-cache: false + - name: Linux native dependencies + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libasound2-dev libxdo-dev libxtst-dev libx11-dev libxkbcommon-dev libwayland-dev libssl-dev pkg-config xvfb + - name: Bundle pinned uv for the host architecture + run: | + node --input-type=module <<'NODE' + import { execFileSync } from 'node:child_process'; + import { mkdirSync, copyFileSync, chmodSync } from 'node:fs'; + import { join } from 'node:path'; + const expected = process.env.VOICESTUDIO_RUST_TARGET; + const targets = { 'linux-x64': 'x86_64-unknown-linux-gnu', 'win32-x64': 'x86_64-pc-windows-msvc', 'darwin-arm64': 'aarch64-apple-darwin', 'darwin-x64': 'x86_64-apple-darwin' }; + if (targets[`${process.platform}-${process.arch}`] !== expected) throw new Error('Runner architecture does not match package target'); + const source = execFileSync(process.platform === 'win32' ? 'where.exe' : 'which', ['uv'], { encoding: 'utf8' }).trim().split(/\r?\n/)[0]; + const dir = 'frontend/src-tauri/binaries'; + mkdirSync(dir, { recursive: true }); + const destination = join(dir, `uv-${expected}${process.platform === 'win32' ? '.exe' : ''}`); + copyFileSync(source, destination); + if (process.platform !== 'win32') chmodSync(destination, 0o755); + NODE + - name: Install locked dependencies + run: bun install --frozen-lockfile + - name: Validate and build Electron + run: bun run check:electron + - name: Package without publishing + working-directory: electron + run: | + bun x electron-builder --config electron-builder.config.mjs ${{ matrix.flags }} --publish never + node tests/packaging-contract.mjs --artifact + node tests/update-package-contract.mjs --platform ${{ matrix.platform }} --arch ${{ matrix.arch }} + - name: Packaged startup smoke test + working-directory: electron + run: | + if [ "$RUNNER_OS" = Linux ]; then + xvfb-run -a node tests/packaged-smoke.mjs --setup + else + node tests/packaged-smoke.mjs --setup + fi + - name: Save installers and updater metadata for review + uses: actions/upload-artifact@v4 + with: + name: electron-rehearsal-${{ matrix.platform }}-${{ matrix.arch }} + retention-days: 14 + if-no-files-found: error + path: | + electron/release/VoiceStudio-Electron-* + electron/release/electron-*.yml diff --git a/README.md b/README.md index b1ad3a4b..12dbfa0c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@
Your voices. Your stories. Your machine.
+Open source voice cloning and workflow engine. Build local.
Clone voices, dub videos, dictate, and create audiobooks with local AI.
+ Website · Download · Get started · Docs · @@ -19,7 +20,7 @@  -
The new Electron desktop UI, captured from this branch with the bundled demo voice. Release builds may look different.
+Captured from the running Electron preview with the bundled demo voice. Published installers may look different.
## Create with VoiceStudio @@ -39,6 +40,11 @@ Local workflows run on your hardware. Remote services are optional; usage analyt


你的声音,你的故事,在你的电脑上创作。
+开源声音克隆与工作流引擎。在本地构建。
使用本地 AI 克隆声音、翻译配音、语音听写和制作有声书。
下载 · @@ -32,6 +32,11 @@



ts6+?*O0^6OGiW}nJQF!{sxlsKQ5rWzh7z(s}#*Bdb~)3%i}x9
zAi)xXgpF8l;Api=F0umm-D^X_B8}=!<1}tt{p<7nG7?cf4E|Hh4V-`SZzGA19TDT#
zcQV>q`W!i=son~mdE>sC<|7$mz@7{Y3`WGKO7+@(o<4_R7NtL=y5JeUxizl%HWg;$
z$OH4s?LmF@$2F16!@q7p9I^={w^Sd((~*DtJZUj_cV{f`B@t1+mUg;OAIS?OeK8?k
zksx$23A;YV>Km|#|Kv5n{<*_fwTYe1FT|216Jsm38HEM2-3%=>PiKA1p<5kbe
z&;QA3+1uNTy+D&LsrVlOu+_UE*&=86e^Vw=7^we_IXE~s?Ega& c%ySChIGrLsXJD5;bBEef1=({`<&e;BhVe}n6)L~QuXSct>saRY|
zuIS>gXaBLDwJenJhNSf25ytHg=*SKWnN8jHgVLQ_IZbPS+Kt-w-(XOahFzui2g>ky
zCs7FjBW{uafgU^$gA8OQa?p)zw?W_I6$i=mXpV%ztJd3`Iw8U?dv$YZ@#&ABbeZ31
z&wRR0a0o^(F}qIo`csBo_IuBL;*48ZjZ1k3#5yhyi$}kkYX?Q8{sC1^(njI;uq>ZV
z>U)&8hB(rrxze`}Sh>K3V40Q69Zz;bEfT-5z__7iep4#%0lhO&P!POI0i*SX=sna^
z!-CFANT{ %}T}#*bHa8E+GqrlQx9&=$kHgD=V56@VOnU&v
z=A?BWKNe~kfvZJ|i<%iI79g1JVU#xJc@hR*Ys;Ev0HJ}f!_~R-4A-L#X|5uEJ99$Sr;kY0=`Z_&zNRX$;HyIrI~yMzi2kQT|F-L!
z*<=R-rr>V89Pa9jEW=N`ohz$No(sOVDX-5zc=jC)FB*8FEsRtI&uer1gK!ykgGSM0
z;An%E;PUKmAB>wqUmm5?pm-igI|OPL9F)wpi>_0687c%WHcG2&1HyB|IuawB0*e+-
z=j9PSmix1Lriyw;zrLinX=5e`$HWKHbyAE86dLd^PH$y=QQVKQHB4)c!uG?W6)`$T
zN{^Id{Q4Xf63EPvaetdR^dAuS+iv&4+!FvC!1Vkc4P#+(5ylyY*U6c;Nl1oaG=SP=
zD3IhwUB_4NXQ=PMv!6_h9aa8A9{s{a@%P_Z)6!g{R!1&Jc`O>yBio6IY0|^{we@m@
zgP}>cUo{AFsEn{Hb~>-+_fKNQ&h!;jt+RHJp@%HQFpW3d@2=Z3oqW_yy;a@N?O8oK&w+
z!v@B2hs@iet8R6t#qNKs&X;4es~l%Iln&l~t`MP)-g;VhYUjDt-TiJ0;l2~IoMU(P
zB+>G7v)Bj!*RD}KOPdevDoA+o8SJk23YYrZ(vbDu;q#%|k}jB*TJ{Q6pM|Utz(`5o
zIeu3Yur`IH-^sV5y8h}&fHTX|vwTR|KYvDu6^Pvr9bq@`PyI+RVBYq5uJz$WPwcF%
zk5uEmb67Fa(ffe7nrNGQISK)D3Si(8B}yJxH1|6mBqvXow?xKoK)XT2H@%aN)a!D2
zlZ^G$XV_dS)ZJu>E=}RKm)eJdwiCu?
pt;<3G-r+G+M54wNvSx%3R`${5AkQYV)Ze0$l>-8XR#TZUq
zh>Hq%CrQ$&Uuf-*Pu(nWHvSj~mQwmP(CspIdSTVr8Z&h+0LN%srD>_jzI1u9b@{*g
z@L|y(&EIC$g0W%U%ue|e?1?U2{H;zYe+%0;E6Z$x+GaWSc9_lA%&46Ss4mxZWK5{!
z7cvi<+k#ik%$i63qRTbXzxKw$8$jA9+xufkUZYvBpT+f|A)-t*+YBSW;O+f*
zdH@JMFcm3aCG*Y4b(rRveh+l#{^}5RRXHxAP_RYe`Pcz#fOnCct?Mz+KgP7&>t2Ng
z(IP)0ZoDiAvzPeco%s!bVc)!f{>@{rFWHOB{#pWnrizwJ*xTDfAHBQ_pjVjji*(9u
za3NQE+|IowQ0%Z3J1uY$e0912*scK*Mnw7Bs%pWjQ8}-IvS|saRDPfR>UpDe`@mR#
z%*FPyAnujGbyl=|$*0zF@~3NM8IM^@@p67*
zDw1QQHM73`fv9>;+$2lM*G!~0H>xz_dOd3y$isfR4i&KKi#asl=)t2Crmrbn200(7
zj2QVt!CBW^y!MbE3t1Q!TOOCE5Lxp(Mi^8|(B-+HHtzlEse&w+eUVYr7T>v36qzk|
z0sq&}hU+eNOPDAjxr54Bl2MX(1LN+!b%COu@sd|Y8X;w0_{=_R_n=UFu*^WB$^wKT
zXY1CKJH&rTZ4ATr(6WZ1?##C71iAVh`a{2SVbOh91L|973Sy73GL-Iom+6TUyg)**
z7|Kd$?3ZSpj&&8Li?XE95d+~DBQ@0Kf_niOJ25w$1@Zlenk+_XqB9{hWKNU1