{"id":16590099,"url":"https://github.com/codonaft/vlog-toolset","last_synced_at":"2025-08-29T14:32:53.977Z","repository":{"id":138909793,"uuid":"168062257","full_name":"codonaft/vlog-toolset","owner":"codonaft","description":"Recording toolset for vloggers🎙️📹🎬","archived":false,"fork":false,"pushed_at":"2024-11-09T22:09:21.000Z","size":477,"stargazers_count":6,"open_issues_count":0,"forks_count":3,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-02T00:31:55.884Z","etag":null,"topics":["android","audio-analysis","audio-recorder","ffmpeg","jumpcut","synchronization","toolkit","video-editing","video-recording","vlogging"],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codonaft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":null,"patreon":"alopatindev","open_collective":null,"ko_fi":"alopatindev","tidelift":null,"community_bridge":null,"liberapay":"alopatindev","issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":["https://github.com/alopatindev/vlog-toolset#support","https://codonaft.com/support"]}},"created_at":"2019-01-29T00:41:57.000Z","updated_at":"2024-11-24T02:24:48.000Z","dependencies_parsed_at":"2023-12-16T10:26:26.123Z","dependency_job_id":"562d5554-638e-4a57-a4ac-c61fdefd8792","html_url":"https://github.com/codonaft/vlog-toolset","commit_stats":null,"previous_names":["codonaft/vlog-toolset"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codonaft%2Fvlog-toolset","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codonaft%2Fvlog-toolset/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codonaft%2Fvlog-toolset/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codonaft%2Fvlog-toolset/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codonaft","download_url":"https://codeload.github.com/codonaft/vlog-toolset/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238803336,"owners_count":19533294,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","audio-analysis","audio-recorder","ffmpeg","jumpcut","synchronization","toolkit","video-editing","video-recording","vlogging"],"created_at":"2024-10-11T23:10:56.922Z","updated_at":"2025-02-14T07:31:44.674Z","avatar_url":"https://github.com/codonaft.png","language":"Ruby","funding_links":["https://patreon.com/alopatindev","https://ko-fi.com/alopatindev","https://liberapay.com/alopatindev","https://github.com/alopatindev/vlog-toolset#support","https://codonaft.com/support"],"categories":[],"sub_categories":[],"readme":"# vlog-toolset\nVideo and audio recording toolset for vloggers🎙️📹🎬\n\nDesigned to record vlogs with classical jump cuts\nusing camera of Android-based device and microphone of GNU/Linux machine.\nI [use it](https://alopatindev.github.io/2019/02/05/video-recording-with-automatic-jump-cuts-using-open-source-and-coding/) with Pitivi for my [YouTube channel](https://www.youtube.com/@codonaft).\n\nCurrently can keep functioning well even if you experience temporary [USB phone connection failure](https://android.stackexchange.com/questions/193637/how-can-i-adb-pull-a-large-file-when-the-usb-connection-breaks-continuously).\n\nTwo possible pipelines:\n- record with `vlog-record`, apply `vlog-render`\n- record normally, without any additional software, apply `vlog-add` and `vlog-render`\n\n## Installation\n\n### GNU/Linux\n1. Install dependencies\n- ruby (tested with 3.1.4)\n- python3 (tested with 3.11.8)\n- pip (tested with 24)\n- ffmpeg (tested with 6.1.1)\n- sox (tested with 14.4.2)\n- mediainfo (tested with 23.04)\n- [sync-audio-tracks](https://github.com/alopatindev/sync-audio-tracks) (should be in your PATH environment variable)\n- alsa-utils (tested with 1.2.10)\n- xdotool (tested with 3.20211022.1)\n- socat (tested with 1.7.4.4)\n- mpv (tested with 0.37.0)\n- whisper.cpp (tested with `641f2f4`)\n    - build for\n        - [NVIDIA proprietary](https://github.com/ggerganov/whisper.cpp/tree/641f2f42823affb6e5c471b63317deefb0b6e3e9#nvidia-gpu-support) driver\n        - or [other GPUs](https://github.com/ggerganov/whisper.cpp/tree/641f2f42823affb6e5c471b63317deefb0b6e3e9#opencl-gpu-support-via-clblast)\n        - or [CPU](https://github.com/ggerganov/whisper.cpp/tree/641f2f42823affb6e5c471b63317deefb0b6e3e9#blas-cpu-support-via-openblas)\n    - download [model(s)](https://github.com/ggerganov/whisper.cpp/tree/641f2f42823affb6e5c471b63317deefb0b6e3e9#quick-start) (`base` and/or `medium` are recommended)\n- android-tools (tested with 34.0.1, adb version is 1.0.41)\n    - USB Debugging should be [enabled](https://github.com/alopatindev/qdevicemonitor/blob/master/TROUBLESHOOTING.md#android-devices-are-not-recognized)\n\n2. `git clone git@github.com:alopatindev/vlog-toolset.git \u0026\u0026 cd vlog-toolset \u0026\u0026 ./configure`\n\n### Android device\n- Open Camera (from [F-Droid](https://f-droid.org/en/packages/net.sourceforge.opencamera/) or [Google Play](https://play.google.com/store/apps/details?id=net.sourceforge.opencamera)) (tested with 1.51.1)\n\n## vlog-record\n- records video\n    - using camera of Android-based device\n- records audio\n    - using microphone, connected to GNU/Linux machine\n- detects voice (to trim silence)\n    - if you save clip without auto trimming — it will just remove beginning and ending of each clip\n        - which typically contain the button click sound\n- synchronizes audio\n- combines stuff together to produce MP4 video clips\n    - which contain\n        - H.265/HVEC video taken from camera\n        - FLAC audio recorded with GNU/Linux machine\n- plays lastly recorded video clips\n    - with optional mirror effect\n\n```\ncd vlog-toolset\n\n./bin/vlog-record -h\nUsage: vlog-record -p project_dir/ [other options]\n  -p, --project \u003cdir\u003e              Project directory\n  -t, --trim \u003cduration\u003e            Trim duration of beginning and ending of each clip (default: 0.2)\n  -s \u003carecord-args\u003e,               Additional arecord arguments (default: \"--device=default --format=dat\")\n      --sound-settings\n  -A, --android-device \u003cdevice-id\u003e Android device id\n  -o, --opencamera-dir \u003cdir\u003e       Open Camera directory path on Android device (default: \"/storage/emulated/0/DCIM/OpenCamera\")\n  -b \u003ctrue|false\u003e,                 Set lowest brightness to save device power (default: false)\n      --change-brightness\n  -m, --mpv-args \u003cmpv-args\u003e        Additional mpv arguments (default: \"--vf=hflip --volume-max=300 --volume=130 --speed=1.2)\"\n  -P \u003cseconds\u003e,                    Minimum pause between shots for auto trimming (default: 2.0)\n      --pause-between-shots\n  -a, --aggressiveness \u003c0..1\u003e      How aggressively to filter out non-speech (default: 0.4)\n  -d, --debug \u003ctrue|false\u003e         Show debug messages (default: false)\n\n./bin/vlog-record -p ~/video/new-cool-video-project\n...\n----------------------------------------------------------------------\n        R - (RE)START clip recording (loses unsaved clip)\n        S - STOP and SAVE current clip\nShift + S - STOP and SAVE current clip, DON'T use auto silence removal\n        D - STOP and DELETE current clip\n        P - PLAY last saved clip\n        F - FOCUS camera on center\n----------------------------------------------------------------------\nShift + R - (RE)START SILENCE recording attempt\n----------------------------------------------------------------------\n        H - show HELP\n        Q - QUIT\n\n[ ⬜ ] [ 💻 | 💾 466G ] [ 📞 | 🔋100% / 41°C | 💾 18G ]\n```\n\n## vlog-render\n- applies some effects to video clips\n    - speed/tempo change\n    - forced constant frame rate\n        - which is useful for video editors that don't support variable frame rate (like Blender)\n    - video denoiser, mirror, vignette and/or whatever you [specify](https://ffmpeg.org/ffmpeg-filters.html#Video-Filters)\n- renders video clips to a final video\n    - also H.265/HVEC, with hardware acceleration if available\n- plays a video from a given position\n\n```\nUsage: vlog-render -p project_dir/ -w path/to/whisper.cpp/ [other options]\n  -p, --project \u003cdir\u003e              Project directory\n  -P, --preview \u003ctrue|false\u003e       Preview mode. It will also start a video player by a given position (default: true)\n  -n, --tmux-nvim \u003ctrue|false\u003e     Plain text video editing: open render.conf (during preview mode or when render.conf was just generated) in Neovim via Tmux if they are available (default: true)\n  -f, --fps \u003cnum\u003e                  Constant frame rate (default: 30)\n  -S, --speed \u003cnum\u003e                Speed factor (default: 1.2)\n  -V, --video-filters \u003cfilters\u003e    ffmpeg video filters (default: \"hqdn3d,hflip,vignette\")\n  -c, --cleanup \u003ctrue|false\u003e       Remove temporary files, instead of reusing them in future (default: false)\n  -w, --whisper-cpp-dir \u003cdir\u003e      whisper.cpp directory\n  -W, --whisper-cpp-args \u003cdir\u003e     Additional whisper.cpp arguments (default: \"--model models/ggml-base.bin --language auto\")\n  -y, --youtube \u003ctrue|false\u003e       Additionally optimize for YouTube (default: false)\n  -I, --ios \u003ctrue|false\u003e           Additionally optimize for iOS video editors (default: false)\n\n./bin/vlog-render -p ~/video/new-cool-video-project --preview false --whisper-cpp-dir path/to/whisper-cpp-dir\n```\n\n- it also runs voice recognition in a selected language\n- makes more precise clips segmentation\n- produces media output\n    - clips are located in `project_dir/output/`\n    - concatenation of all clips is located at `project_dir/output.mp4`\n- produces a configuration file\n    - the columns in the config are:\n        - clip filename\n        - speed multiplier\n        - start position (in seconds)\n        - end position (in seconds)\n        - recognized text (to figure out which clips can be removed / reordered)\n    - you can edit the config\n        - put `#` in the beginning of line you want to ignore (or just remove the entire line)\n        - change speed of individual clips\n\n```\nvi ~/video/new-cool-video-project/render.conf\n```\n\n## vlog-add\n```\nUsage: vlog-add -p project_dir/ [other options]\nProject directory must contain inputvoice_000001.mp4, inputother_000002.mp4 ... as input files (also optionally inputvoice_000001.wav, inputother_000002.wav ... with highest audio quality)\n  -p, --project \u003cdir\u003e              Project directory\n  -P \u003cseconds\u003e,                    Minimum pause between shots for auto trimming (default: 2.0)\n      --pause-between-shots\n  -a, --aggressiveness \u003c0..1\u003e      How aggressively to filter out non-speech (default: 0.4)\n```\n\n## Known issues/limitations\n- it's just a dumb dirty PoC/prototype, it's **not necessarily gonna work on your hardware**\n    - I use Xiaomi Mi 8\n        - front camera faces at me\n        - microphone and camera are allowed\n- paths with spaces and weird characters are unsupported\n\n## Recommended Open Camera Settings\n- ⋮\n    - Grid - Phi 3x3\n- ⚙️\n    - Video settings…\n        - Video resolution - FullHD 1920x1080 (16:9 2.07 MP)\n        - Video format - **MPEG4 HEVC**\n        - Video frame rate (approx) - 30\n    - Camera API - Camera2 API\n\n## Troubleshooting\n- auto-rotation fails\n    - reboot your phone\n- flickering when recording with artificial lighting\n    - Open Camera - ⚙️ - Processing settings - Anti-banding - Auto (or precisely 50 Hz in my case)\n\n## TODO: Rewrite this prototype in Rust?\n- support other sources (webcams, screencasting)\n    - support multiple sources (cams, mics) at the same time\n- support other operating systems\n- [adb](https://github.com/kpcyrd/forensic-adb/blob/736f7c43d116b6334af3c1d8c4a41f9ae06ff812/src/lib.rs#L754)\n    - `pull` performance comparing `android-tools`? for USB 2 and 3\n\n## Support\nI'm currently investing [all my time](https://codonaft.com/why) in FOSS projects.\n\nIf you found this repo useful and you want to support me, please\n- ⭐ it\n- check ⚡ [here](https://codonaft.com/sponsor)\n\nYour support keeps me going ❤️ (◕‿◕)\n\n## License\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or (at\nyour option) any later version.\n\nThis program comes with ABSOLUTELY NO WARRANTY.\nThis is free software, and you are welcome to redistribute it\nunder certain conditions; read LICENSE.txt for details.\n\nCopyright (C) 2018—∞  Alexander Lopatin \u003calopatindev ät codonaft dot com\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodonaft%2Fvlog-toolset","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodonaft%2Fvlog-toolset","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodonaft%2Fvlog-toolset/lists"}