{"id":16653342,"url":"https://github.com/mattmoony/figaro","last_synced_at":"2025-04-04T13:13:38.403Z","repository":{"id":37109620,"uuid":"267714028","full_name":"MattMoony/figaro","owner":"MattMoony","description":"Real-time voice-changer for voice-chat, etc. Will support many different voice-filters and features in the future. 🎵","archived":false,"fork":false,"pushed_at":"2023-07-02T14:39:47.000Z","size":15724,"stargazers_count":690,"open_issues_count":41,"forks_count":67,"subscribers_count":16,"default_branch":"master","last_synced_at":"2023-11-12T15:59:15.351Z","etag":null,"topics":["audio","cli","discord","figaro","microphone","pyaudio","python","roadmap","sound","sound-effects","soundboard","teamspeak","virtual","voice","voice-changer","voice-chat","voice-filters"],"latest_commit_sha":null,"homepage":"","language":"Python","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/MattMoony.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-05-28T22:55:49.000Z","updated_at":"2023-11-12T15:59:30.842Z","dependencies_parsed_at":"2023-11-12T15:59:22.885Z","dependency_job_id":"eaefdf1f-7cdd-4b5e-b680-a5990ad199d8","html_url":"https://github.com/MattMoony/figaro","commit_stats":null,"previous_names":["symphonly/figaro"],"tags_count":3,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MattMoony%2Ffigaro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MattMoony%2Ffigaro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MattMoony%2Ffigaro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MattMoony%2Ffigaro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MattMoony","download_url":"https://codeload.github.com/MattMoony/figaro/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247182420,"owners_count":20897381,"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":["audio","cli","discord","figaro","microphone","pyaudio","python","roadmap","sound","sound-effects","soundboard","teamspeak","virtual","voice","voice-changer","voice-chat","voice-filters"],"created_at":"2024-10-12T09:43:53.582Z","updated_at":"2025-04-04T13:13:38.374Z","avatar_url":"https://github.com/MattMoony.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"Figaro\" src=\"media/figaro.png\" width=\"125\" height=\"125\" /\u003e\n\u003c/p\u003e\n\u003ch1 align=\"center\"\u003eFigaro\u003c/h1\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"GitHub\" src=\"https://img.shields.io/github/license/MattMoony/figaro?style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitHub top language\" src=\"https://img.shields.io/github/languages/top/MattMoony/figaro?style=for-the-badge\"\u003e\n  \u003cimg alt=\"GitHub Repo stars\" src=\"https://img.shields.io/github/stars/MattMoony/figaro?style=for-the-badge\u0026color=cecece\"\u003e\n\u003c/p\u003e\n\n---\n\n## About\n\nReal-time open-source voice modification program \u0026 sound board. Can be useful for many things, especially when used in combination with virtual sound i/o devices.\n\n![figaro collage](media/figaro-collage.png)\n\n![figaro demo](media/figaro-demo.gif)\n\n## Table of Contents\n\n- [About](#about)\n- [Table of Contents](#table-of-contents)\n- [Setup](#setup)\n  - [Development](#development)\n    - [Linux](#linux)\n    - [Mac](#mac)\n    - [Windows](#windows)\n    - [Manual Setup](#manual-setup)\n  - [Advanced setup](#advanced-setup)\n- [Usage](#usage)\n  - [CLI](#cli)\n  - [GUI](#gui)\n  - [Figaro-Script](#figaro-script)\n    - [General Syntax](#general-syntax)\n    - [Defining a Hotkey](#defining-a-hotkey)\n    - [Comments](#comments)\n    - [Builtins](#builtins)\n      - [Pause](#pause)\n- [Roadmap](#roadmap)\n- [References](#references)\n\n## Setup\n\nIf you're just looking to use *Figaro* and not work on it, then there's no reason to set up the development environment like described below, simply download the appropriate release for your platform from the [releases](https://github.com/MattMoony/figaro/releases) page and you're good to go!\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/MattMoony/figaro/releases/download/v0.3-alpha/Figaro.Setup.0.3.0-alpha.exe\"\u003e\u003cimg src=\"media/download-windows.png\" height=\"75px\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/MattMoony/figaro/releases/download/v0.3-alpha/figaro-gui-0.3.0-alpha.tar.gz\"\u003e\u003cimg src=\"media/download-linux.png\" height=\"75px\" /\u003e\u003c/a\u003e\n\u003c/div\u003e\n\n### Development\n\nIf you're on `Linux`, `Windows` or `Mac`, then setting up should be easy! Simply run the appropriate setup script and it will guide you through the whole process.\n\n#### Linux\n\nMake `./setup.sh` executable ... (or run it with an appropriate interpreter) ...\n\n```bash\nchmod 755 ./setup.sh\n```\n\n... execute it: `./setup.sh` ... and have fun with `python figaro.py`!\n\n#### Mac\n\nThe same as the [Linux Setup](#linux), just use `./setup-mac.sh` instead of `./setup.sh`.\n\n#### Windows\n\nFirst, in order to allow the setup _powershell_ script to run, you need to execute the following command in an administrator powershell:\n\n```ps\nSet-ExecutionPolicy RemoteSigned\n```\n\n... afterwards, executing `.\\setup.ps1` will guide you through the whole setup process! You can now execute `python figaro.py`.\n\n#### Manual Setup\n\nFirst of all, for `Figaro` to be able to work with audio files other than `wav`, you need to download and install `ffmpeg` (see [References](#References) for the link to the official download page).\n\n- **Linux**: `pip install -r requirements-unix.txt`\n- **Mac**: `pip install -r requirements-unix.txt`\n- **Windows**: `pip install -r requirements-windows.txt`\n\n... if you're on **Windows** and you get an error when installing `PyAudio` try downloading a PIP wheel suitable for your Python version from the link provided in [References](#References).\n\nIf everything works out, you're good to go!\n\n### Advanced setup\n\nThe following steps will explain how to use this program with the commonly used voice-chat application `Discord` on Windows:\n\n1. Download and install a virtual audio input device (if you don't know any specific one, try the one mentioned in [References](#References)).\n2. When selecting an output device at the startup of `Figaro`, choose the virtual input device you just installed (e.g.: `CABLE Input`).\n3. In Discord, go to `User Settings \u003e Voice \u0026 Video \u003e Input Device` and select the virtual input device from the dropdown (e.g.: `CABLE Output`).\n4. There you go, your friends should only be able to hear your filtered voice now.\n\n## Usage\n\n### CLI\n\nCLI-Usage is explained [here](docs/cli.md).\n\n### GUI\n\nGUI-Usage is explained [here](docs/gui.md).\n\n### Figaro-Script\n\nYou can now also use figaro script (.fig) for defining hotkeys and their behaviour. Whether you want a sound effect to be played, or an attribute to be shown, it can all be bound to a certain keypress.\n\n#### General Syntax\n\nFigaro-Script was heavily inspired by [AutoHotkey](https://www.autohotkey.com/), so, if you are capable of defining hotkeys and their functionality with ahk-script, think of this as a very, very simplified version of that.\n\nBut, if you aren't aware of ahk, let me introduce you to the basic syntax very quickly:\n\nYour script, the .fig file, consists of multiple hotkey-definition blocks which tell Figaro which key combinations should result in what behaviour. Apart from that, you can also have comments, to make your script more readable and easier to understand for a future you.\n\n#### Defining a Hotkey\n\nIn order to define which keys make up your hotkey, you just need to write all of them in one line and end it with `::`. After this first line, you write all your commands and end the definition block with `return`. This could look something like the following:\n\n```text\n...\n\nq::\nstart sound tmp/asdf.mp3 2\nreturn\n\n...\n```\n\n... this hotkey would be triggered every time the `q` is pressed.\n\nCertain control keys need alternative symbols (this is equalivalent to ahk-script):\n\n* `alt` is represented by `!`\n* `ctrl` is represented by `^`\n* `shift` is represented by `+`\n\n... keep in mind that the definition of hotkeys is usually case insensitive, which means in order to, for example, only trigger the hotkey on an uppercase `Q`, you would need to use `+q::` as your definition.\n\n#### Comments\n\nThis is fairly easy to explain. If you have ever used a popular programming language such as C, C++, Java, etc. you already know how to use comments. The only thing to bear in mind is that so far, I have only implemented `single-line` comments.\n\nFor people who have never used such a programming language before, this is the correct syntax for comments in Figaro-Script:\n\n```text\n...\n\n// triggered by pressing `lower-case q`\n// will play the mp3 file \"tmp/asdf.mp3\" at 200% of the original volume ...\nq::\nstart sound tmp/asdf.mp3 2\nreturn\n\n...\n```\n\n#### Builtins\n\nDespite the CLI commands, certain builtin functions are also available to you (at the moment there aren't many, but I will at more should the need to do so arise):\n\n##### Pause\n\nYou can use this command in order play a sound effect, or do anything else for that matter, after waiting for a given amount of `milliseconds`. E.g.:\n\n```text\n...\nstart sound tmp/1.mp3\npause 3000\nstart sound tmp/2.mp3\n...\n```\n\n... this would play the sound effect `tmp/1.mp3`, wait for `3 seconds` and then play the next sound effect `tmp/2.mp3`.\n\n_More docs coming soon! Disclaimer: Some of the commands described above might still be removed or altered..._\n\n## Roadmap\n\nJust a small preview of what is about to come. It's very likely that this roadmap will continue to grow in the future, as I get more ideas or if somebody wants to contribute.\n\n* [x] [CLI](#cli)\n  * [x] I/O device selection\n  * [x] Live status (live audio graph in console)\n  * [x] Filter control\n  * [x] Sound effects (soundboard-like abilities)\n* [ ] [GUI](#gui)\n  * [x] I/O device selection\n  * [x] Live sound wave graph\n  * [x] Filter control\n  * [ ] Soundboard\n    * [x] Functionality\n    * [ ] Advanced features\n* [x] Filters\n  * [x] Volume\n  * [x] Pitch-Shift\n  * [x] \"Trippy\"-Filter\n  * [x] Echo\n  * [x] Noise\n  * [x] Crackle\n  * [x] Randomized\n* [ ] [Figaro-Script](#figaro-script)\n  * [x] Using CLI commands\n  * [x] Hotkeys\n  * [ ] Advanced builtins\n* [ ] Security\n  * [x] Remote Authentication\n  * [x] Encrypted sockets\n  * [ ] Fine-grained settings\n\n## References\n\n* Windows Virtual Sound I/O ... [vb-audio](https://www.vb-audio.com/Cable/)\n* PyAudio Windows Wheel ... [uci](https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio)\n* FFmpeg download ... [ffmpeg.org](https://ffmpeg.org/download.html)\n* JWT minimum secret length ... [RFC 7518](https://tools.ietf.org/html/rfc7518#section-3.2)\n* JWT recommended secret length ... [Auth0](https://auth0.com/blog/brute-forcing-hs256-is-possible-the-importance-of-using-strong-keys-to-sign-jwts/)\n\n---\n\n... MattMoony (June 2021)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattmoony%2Ffigaro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattmoony%2Ffigaro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattmoony%2Ffigaro/lists"}