├── .gitattributes ├── .github └── workflows │ └── publish.yml ├── .gitignore ├── .vscode ├── extensions.json └── settings.json ├── BUILDING.md ├── COPYING ├── README.md ├── icon.png ├── index.html ├── libs ├── hbb_common │ ├── .gitignore │ ├── Cargo.toml │ ├── build.rs │ ├── examples │ │ ├── config.rs │ │ └── system_message.rs │ ├── protos │ │ ├── message.proto │ │ └── rendezvous.proto │ └── src │ │ ├── bytes_codec.rs │ │ ├── compress.rs │ │ ├── config.rs │ │ ├── fs.rs │ │ ├── keyboard.rs │ │ ├── lib.rs │ │ ├── password_security.rs │ │ ├── platform │ │ ├── linux.rs │ │ ├── macos.rs │ │ ├── mod.rs │ │ └── windows.rs │ │ ├── protos │ │ └── mod.rs │ │ ├── proxy.rs │ │ ├── socket_client.rs │ │ ├── tcp.rs │ │ └── udp.rs ├── prebuilt │ └── windows │ │ ├── avcodec-60.dll │ │ ├── avfilter-9.dll │ │ ├── avformat-60.dll │ │ ├── avutil-58.dll │ │ ├── bz2.dll │ │ ├── ffi-7.dll │ │ ├── gio-2.0-0.dll │ │ ├── glib-2.0-0.dll │ │ ├── gmodule-2.0-0.dll │ │ ├── gobject-2.0-0.dll │ │ ├── gstapp-1.0-0.dll │ │ ├── gstapp.dll │ │ ├── gstaudio-1.0-0.dll │ │ ├── gstaudioconvert.dll │ │ ├── gstaudiomixer.dll │ │ ├── gstaudioparsers.dll │ │ ├── gstaudioresample.dll │ │ ├── gstbase-1.0-0.dll │ │ ├── gstcodecparsers-1.0-0.dll │ │ ├── gstcodecs-1.0-0.dll │ │ ├── gstcoreelements.dll │ │ ├── gstd3d11-1.0-0.dll │ │ ├── gstd3d11.dll │ │ ├── gstdxva-1.0-0.dll │ │ ├── gstid3demux.dll │ │ ├── gstisomp4.dll │ │ ├── gstlibav.dll │ │ ├── gstmatroska.dll │ │ ├── gstogg.dll │ │ ├── gstpbutils-1.0-0.dll │ │ ├── gstplayback.dll │ │ ├── gstpng.dll │ │ ├── gstrawparse.dll │ │ ├── gstreamer-1.0-0.dll │ │ ├── gstriff-1.0-0.dll │ │ ├── gstrtp-1.0-0.dll │ │ ├── gsttag-1.0-0.dll │ │ ├── gsttypefindfunctions.dll │ │ ├── gstvideo-1.0-0.dll │ │ ├── gstvideoconvertscale.dll │ │ ├── gstvideoparsersbad.dll │ │ ├── gstvorbis.dll │ │ ├── gstwavparse.dll │ │ ├── gstx264.dll │ │ ├── intl-8.dll │ │ ├── libFLAC-8.dll │ │ ├── libpng16-16.dll │ │ ├── libvorbis-0.dll │ │ ├── libvorbisenc-2.dll │ │ ├── libvorbisfile-3.dll │ │ ├── libx264-157.dll │ │ ├── msvcp140.dll │ │ ├── ogg-0.dll │ │ ├── orc-0.4-0.dll │ │ ├── pcre2-8-0.dll │ │ ├── swresample-4.dll │ │ ├── vcruntime140.dll │ │ ├── vcruntime140_1.dll │ │ └── z-1.dll └── scrap │ ├── .gitignore │ ├── Cargo.toml │ ├── README.md │ ├── build.rs │ ├── examples │ ├── benchmark.rs │ ├── capture_mag.rs │ ├── ffplay.rs │ ├── list.rs │ ├── record-screen.rs │ └── screenshot.rs │ ├── screenshot0_1.png │ └── src │ ├── android │ ├── ffi.rs │ └── mod.rs │ ├── bindings │ ├── aom_ffi.h │ ├── vpx_ffi.h │ └── yuv_ffi.h │ ├── common │ ├── android.rs │ ├── aom.rs │ ├── codec.rs │ ├── convert.rs │ ├── dxgi.rs │ ├── hwcodec.rs │ ├── linux.rs │ ├── mediacodec.rs │ ├── mod.rs │ ├── quartz.rs │ ├── record.rs │ ├── vpx.rs │ ├── vpxcodec.rs │ ├── vram.rs │ ├── wayland.rs │ └── x11.rs │ ├── dxgi │ ├── gdi.rs │ ├── mag.rs │ └── mod.rs │ ├── lib.rs │ ├── quartz │ ├── capturer.rs │ ├── config.rs │ ├── display.rs │ ├── ffi.rs │ ├── frame.rs │ └── mod.rs │ ├── wayland.rs │ ├── wayland │ ├── README.md │ ├── capturable.rs │ ├── pipewire.rs │ ├── remote_desktop_portal.rs │ ├── request_portal.rs │ └── screencast_portal.rs │ └── x11 │ ├── capturer.rs │ ├── display.rs │ ├── ffi.rs │ ├── iter.rs │ ├── mod.rs │ └── server.rs ├── package-lock.json ├── package.json ├── postcss.config.js ├── record-control.html ├── src-tauri ├── .gitignore ├── Cargo.toml ├── build.rs ├── icons │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── 32x32.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ ├── Square30x30Logo.png │ ├── Square310x310Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── StoreLogo.png │ ├── icon.icns │ ├── icon.ico │ └── icon.png ├── src │ ├── configuration.rs │ ├── main.rs │ ├── recorder.rs │ ├── transcriber.rs │ └── util.rs ├── tauri.conf.json └── tauri.windows.conf.json ├── src ├── App.tsx ├── RecordControl.tsx ├── assets │ ├── github-mark.svg │ ├── logo.png │ └── logo.svg ├── config.json ├── index.tsx ├── lang.json ├── record-control.tsx ├── styles.css └── util.ts ├── tailwind.config.js ├── tsconfig.json ├── tsconfig.node.json ├── vite-env.d.ts └── vite.config.ts /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: "publish" 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | tags: 7 | - 'v*' 8 | 9 | jobs: 10 | build-linux: 11 | name: "Build (Ubuntu latest)" 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version: 22 18 | - uses: friendlyanon/setup-vcpkg@v1 19 | with: { committish: c8696863d371ab7f46e213d8f5ca923c4aef2a00 } 20 | - name: Install dependencies 21 | run: | 22 | sudo apt-get update 23 | sudo apt-get install libasound2-dev libudev-dev nasm libxcb-randr0-dev 24 | $VCPKG_ROOT/vcpkg install libvpx libyuv opus aom 25 | - name: Setup Tauri 26 | run: | 27 | sudo apt-get install -y build-essential libwebkit2gtk-4.0-dev curl wget file libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev 28 | - name: Install GStreamer 29 | uses: blinemedical/setup-gstreamer@v1.4.0 30 | with: 31 | version: "1.24" 32 | arch: "x86_64" 33 | - name: Install NPM dependencies 34 | run: npm install 35 | - name: Cache target 36 | uses: actions/cache@v3 37 | with: 38 | key: ${{ runner.OS }}-rust-cache-${{ hashFiles('**/Cargo.toml') }} 39 | path: | 40 | ~/.cargo/registry 41 | ~/.cargo/git 42 | src-tauri/target 43 | - name: Compile application 44 | run: npm run tauri build 45 | env: 46 | TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} 47 | TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} 48 | - uses: actions/upload-artifact@v4 49 | with: 50 | name: Release (Ubuntu latest) 51 | path: src-tauri/target/release/bundle/ 52 | if-no-files-found: "error" 53 | 54 | build-osx: 55 | # Intentionally disable the macOS build artifact 56 | if: false 57 | name: "Build (macOS latest)" 58 | runs-on: macos-latest 59 | steps: 60 | - uses: actions/checkout@v4 61 | - uses: actions/setup-node@v4 62 | with: 63 | node-version: 22 64 | - uses: friendlyanon/setup-vcpkg@v1 65 | with: { committish: c8696863d371ab7f46e213d8f5ca923c4aef2a00 } 66 | - name: Install dependencies 67 | run: | 68 | brew install nasm 69 | $VCPKG_ROOT/vcpkg install libvpx libyuv opus aom 70 | - name: Install GStreamer 71 | uses: blinemedical/setup-gstreamer@v1.4.0 72 | with: 73 | version: "1.24.5" 74 | - name: Install NPM dependencies 75 | run: npm install 76 | - name: Cache target 77 | uses: actions/cache@v3 78 | with: 79 | key: ${{ runner.OS }}-rust-cache-${{ hashFiles('**/Cargo.toml') }} 80 | path: | 81 | ~/.cargo/registry 82 | ~/.cargo/git 83 | src-tauri/target 84 | - name: Compile application 85 | run: npm run tauri build 86 | env: 87 | TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} 88 | TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} 89 | MACOSX_DEPLOYMENT_TARGET: "14.0" 90 | - uses: actions/upload-artifact@v4 91 | with: 92 | name: Release (macOS latest) 93 | path: src-tauri/target/release/bundle/ 94 | if-no-files-found: "error" 95 | 96 | build-windows: 97 | name: "Build (Windows latest)" 98 | runs-on: windows-latest 99 | steps: 100 | - uses: actions/checkout@v4 101 | - uses: actions/setup-node@v4 102 | with: 103 | node-version: 22 104 | - uses: friendlyanon/setup-vcpkg@v1 105 | with: { committish: c8696863d371ab7f46e213d8f5ca923c4aef2a00 } 106 | - name: Install dependencies 107 | run: | 108 | & "$env:VCPKG_ROOT\vcpkg" install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static 109 | - name: Install GStreamer 110 | uses: blinemedical/setup-gstreamer@v1.4.0 111 | with: 112 | version: "1.24.5" 113 | arch: "x86_64" 114 | - name: Install NPM dependencies 115 | run: npm install 116 | - name: Cache target 117 | uses: actions/cache@v3 118 | with: 119 | key: ${{ runner.OS }}-rust-cache-${{ hashFiles('**/Cargo.toml') }} 120 | path: | 121 | ~/.cargo/registry 122 | ~/.cargo/git 123 | src-tauri/target 124 | - name: Compile application 125 | run: npm run tauri build 126 | env: 127 | TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }} 128 | TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }} 129 | - uses: actions/upload-artifact@v4 130 | with: 131 | name: Release (Windows latest) 132 | path: src-tauri/target/release/bundle/ 133 | if-no-files-found: "error" 134 | 135 | release: 136 | if: startsWith(github.ref, 'refs/tags/') 137 | name: Release 138 | runs-on: ubuntu-latest 139 | needs: [build-linux, build-windows] 140 | steps: 141 | - uses: actions/checkout@v4 142 | - name: Download Linux artifacts 143 | uses: actions/download-artifact@v4 144 | with: 145 | name: Release (Ubuntu latest) 146 | path: /home/runner/artifacts/linux 147 | - name: Download Windows artifacts 148 | uses: actions/download-artifact@v4 149 | with: 150 | name: Release (Windows latest) 151 | path: /home/runner/artifacts/windows 152 | - uses: softprops/action-gh-release@v2 153 | with: 154 | repository: Recordscript/recordscript 155 | token: ${{ secrets.CUSTOM_GITHUB_TOKEN }} 156 | files: | 157 | /home/runner/artifacts/linux/deb/*.deb 158 | /home/runner/artifacts/linux/appimage/*.AppImage 159 | /home/runner/artifacts/windows/msi/*.msi 160 | /home/runner/artifacts/windows/nsis/*.exe 161 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | debug/ 4 | target/ 5 | 6 | # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries 7 | # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html 8 | Cargo.lock 9 | 10 | # These are backup files generated by rustfmt 11 | **/*.rs.bk 12 | 13 | # MSVC Windows builds of rustc generate these, which store debugging information 14 | *.pdb 15 | 16 | node_modules 17 | 18 | dist/ 19 | 20 | vite.config.ts.timestamp* 21 | ignored/ 22 | *.webm 23 | *.mp4 24 | .env 25 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "css.lint.unknownAtRules": "ignore" 3 | } -------------------------------------------------------------------------------- /BUILDING.md: -------------------------------------------------------------------------------- 1 | For more details see [GitHub workflow](.github/workflows/publish.yml) 2 | 3 | # Windows 4 | ## Prerequisites 5 | - Install [Rust](https://rustup.rs/) 6 | - Install [vcpkg](https://learn.microsoft.com/en-us/vcpkg/get_started/get-started) . Make sure you've set VCPKG_ROOT and add the PATH 7 | - Install both [GStreamer 1.24.5 runtime and development](https://gstreamer.freedesktop.org/download/#windows) and add it to PATH. 8 | Make sure you've added [GStreamer bin directory and lib/gstreamer-1.0 and lib/pkgconfig to PATH](https://gstreamer.freedesktop.org/documentation/installing/on-windows.html?gi-language=c) 9 | - Install [NodeJS](https://nodejs.org/en/download/package-manager) with [NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 10 | 11 | ## Building 12 | 1. Go to vcpkg directory and install `libvpx`, `libyuv`, `opus`, and `aom` with triplet `x64-windows-static` 13 | ``` 14 | ./vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static 15 | ``` 16 | 2. Go back to this repository directory and install the NPM dependencies 17 | ``` 18 | npm install 19 | ``` 20 | 3. Then build the app with Tauri 21 | ``` 22 | npm run tauri build 23 | ``` 24 | 25 | # Linux 26 | ## Prerequisites 27 | - Install [Rust](https://rustup.rs/) 28 | - Install [vcpkg](https://learn.microsoft.com/en-us/vcpkg/get_started/overview) 29 | - Install [GStreamer 1.24.5](https://gstreamer.freedesktop.org/download/#linux) both runtime and development 30 | - Install [NodeJS](https://nodejs.org/en/download/package-manager) with [NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 31 | 32 | ## Building 33 | 1. Install dependencies (install equivalent package in your distro) 34 | ``` 35 | sudo apt install libasound2-dev libudev-dev nasm libxcb-randr0-dev 36 | ``` 37 | 2. Go to vcpkg directory and install `libvpx`, `libyuv`, `opus`, and `aom` 38 | ``` 39 | ./vcpkg install libvpx libyuv opus aom 40 | ``` 41 | 3. Go to the repo directory and install the NPM dependencies 42 | ``` 43 | npm install 44 | ``` 45 | 4. Then build the app with Tauri 46 | ``` 47 | npm run tauri build 48 | ``` 49 | 50 | # Mac 51 | 52 | ## Notes 53 | - For mac, you need to pull `mac` branch. The current `main` branch don't support mac build 54 | - There are still issues with the screen recorder. But, the subtitle generator (from audio/video file) works just fine 55 | 56 | ## Prerequisites 57 | - Install [Rust](https://rustup.rs/) 58 | - Install [GStreamer 1.24.5](https://gstreamer.freedesktop.org/download/#linux) both runtime and development 59 | - Install [NodeJS](https://nodejs.org/en/download/package-manager) with [NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) 60 | - Install vcpkg and some libraries 61 | ``` 62 | git clone https://github.com/microsoft/vcpkg 63 | cd vcpkg 64 | git checkout 2023.04.15 65 | ./bootstrap-vcpkg.sh -disableMetrics 66 | ./vcpkg install libvpx libyuv opus aom 67 | export VCPKG_ROOT=~/repos/vcpkg 68 | ``` 69 | change the /repos/vcpkg to your vcpkg repo directory 70 | 71 | ## Building 72 | 1. Go to the repo directory and install the NPM dependencies 73 | ``` 74 | npm install 75 | ``` 76 | 2. Then build the app with Tauri 77 | ``` 78 | npm run tauri build 79 | ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Recordscript 2 | 3 | Generate subtitle either from built-in screen recorder or from your video/audio files. 4 | 5 | Works on Windows and Ubuntu. Built with whisper-rs (Rust binding to whisper.cpp), Tauri & Rust. 6 | 7 | # Features 8 | 9 | 1. Screen Recorder with Subtitle capability 10 | 2. Subtitle Generator from a Video/Audio file with English Translation support 11 | 3. Works fully offline (thanks to Whisper.cpp!) 12 | 4. Cross-platform (thanks to Tauri!) 13 | 14 | # Download 15 | 16 | Microsoft Store: https://apps.microsoft.com/detail/9np4vrbxlm9f?hl=en-us&gl=US 17 | 18 | You can also take a look at our Release page. 19 | For now, there's no Mac build yet since there are still some issues. 20 | 21 | # Build step 22 | 23 | If you want to build the app on your local machine, take a look at `BUILDING.md` 24 | 25 | # Known Issues 26 | 27 | ## Mac 28 | 29 | On Macbook Pro M1, the screen recording's not working properly - does not save the file after stopping the recording. After some digging, it seems it was caused by the audio pipeline of GStreamer getting stuck somehow. 30 | 31 | You can help contribute on resolving this issue by pulling the branch `mac` first and submitting a PR to this repo. 32 | 33 | # Contribution 34 | 35 | We welcome everyone who would like to contribute to this project. 36 | 37 | # License 38 | 39 | We use GNU GPLv3.0 license. Take a look at `COPYING` 40 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Recordscript/recordscript/ddd5f09045f8440d7d9b21373c03e32fad339e5c/icon.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 |