silly-voice-lab


Namesilly-voice-lab JSON
Version 0.2.2 PyPI version JSON
download
home_pageNone
SummaryDialogues voice generator using ElevenLabs (AI)
upload_time2025-08-12 20:44:49
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords silly-voice-lab voice elevenlabs
VCS
bugtrack_url
requirements pydub pyttsx3 PyYAML requests
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # silly-voice-lab

A simple tool to create voiced dialogues with **ElevenLabs** for your projects.

## How it works

- Choose a working folder
then: `pip install silly_voice_lab`

- run `silly-voice-lab` to know the commands
- run `silly-voice-lab init` to get a starter pack.
- Now that you have a `silly_voice_lab.cfg` file in your working folder, configure it to fit your needs:

**silly_voice_lab.cfg**
```sh
[secrets]
# enter your own ElevenLab api key here if you have one
elevenlabs_api_key=your_own_key

[folders]
input_folder=scenario
output_folder=voices

[app]
debug=1  # 1 is verbose, 0 is less verbose
# converter can be [text | prod | dev]
# text writes .txt files, for debugging or to create subtitles
# dev writes .mp3 files, sounds really bad but usefull for dev
# prod writes .mp3 files, sounds good, requires a valid elevenlabs_api_key, costs you some EL credits.
converter=dev

[dev]
# 'dev' voices, you can try different languages (en, fr...) and different "types" (f1, f2, m3...) find those that exists
# the command info will list the available langues
female_voice_id=en+f3
male_voice_id=en+m3

```

- run the voice processing with `silly-voice-lab run silly_voice_lab.cfg`

## About the scenario files

### Character groups

Directly inside a scenario folder (or whatever you named it), you must have at least one yaml files looking like this:

**group_example.yaml**
```yaml
- group: heroes      # name of the group
  characters:
  - name: John      # name of a character's folder
    voice_id: EkK5I93UQWFDigLMpZcX # the ElevenLab ID of the voice for the 'prod' mode (optionnal)
    gender: m       # voice gender for the 'dev' mode (optionnal)
  - name: Sarah
    voice_id: Z3R5wn05IrDiVCyEkUrK
    gender: f
```
Here is the definition of the group "heroes" provided by the command 'init' (you can have multiple groups in the same file). There is also the definition of John and Sarah.

### Files tree

For each character you must have a folder with the same name as the character (e.g: John in the folder 'John'). In a character's folder, you will add one or more dialogue yaml file (name them as you wish).

Example (get it with the command 'init'):
```
scenario/
    ├── heroes/
    │   ├── John/
    │   │   └── actions.yaml
    │   └── Sarah/
    │       └── actions.yaml
    ├── heroes.yaml
    └── npcs.yaml
```

### Dialogues files

No matter how a dialogue file is named, it must look like that.

**some_dialogues.yaml**
```yaml
- category: "actions" # when precessed, will create a subfolder with that name
  dialogues:
  - title: "it_works" # will be used for the name of the file, here 'it_works.mp3'
    text: "Yes ! it works"  # the actual dialogue line
  - title: "yes"
    text: "Yes !"
- category: "fight"
  dialogues:
  - title: "ouch"
    text: "Ouch !"
```

You can add as much categories and dialogues as long as you respect this structure.


## about the converters
- text: does not create real audio files, just text placeholders, usefull to test
- dev: use a local rough speech-to-text, usefull to prototype a project with real voices (but robot-like as hell !)
- prod: uses elevenlabs api to create the voices, you need a valid ElevenLab api key to do that.

**Important**: aiming to save your precious ElevenLabs credits, the processing of the voices will automatically skeep the already existing files, so, if you want to replace an already existing file, delete it manually before re-processing. If you add new dialogue lines, only the new ones will be processed.


# Suggested workflow with ElevenLabs (tip for broke devs 😉 )

Create 2 different .cfg files (one converter=dev and one converter=prod), each one pointing to a different outpout folder (let's say "voices-prod" and "voices-dev").

Start your project with the dev voices, and as soon as your EL credits are high enough to create new 'prod' voices, process the prod cfg file (remember it will only process the missing mp3 files), and then replace the dev voices in your project by the prod ones.

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "silly-voice-lab",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "silly-voice-lab, voice, elevenlabs",
    "author": null,
    "author_email": "Vincent Fabre <peigne.plume@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/04/bc/f183cd9f17295011b2aab4b0f3b0ee5cf08ca34efc663daac224dbedbd62/silly_voice_lab-0.2.2.tar.gz",
    "platform": null,
    "description": "# silly-voice-lab\n\nA simple tool to create voiced dialogues with **ElevenLabs** for your projects.\n\n## How it works\n\n- Choose a working folder\nthen: `pip install silly_voice_lab`\n\n- run `silly-voice-lab` to know the commands\n- run `silly-voice-lab init` to get a starter pack.\n- Now that you have a `silly_voice_lab.cfg` file in your working folder, configure it to fit your needs:\n\n**silly_voice_lab.cfg**\n```sh\n[secrets]\n# enter your own ElevenLab api key here if you have one\nelevenlabs_api_key=your_own_key\n\n[folders]\ninput_folder=scenario\noutput_folder=voices\n\n[app]\ndebug=1  # 1 is verbose, 0 is less verbose\n# converter can be [text | prod | dev]\n# text writes .txt files, for debugging or to create subtitles\n# dev writes .mp3 files, sounds really bad but usefull for dev\n# prod writes .mp3 files, sounds good, requires a valid elevenlabs_api_key, costs you some EL credits.\nconverter=dev\n\n[dev]\n# 'dev' voices, you can try different languages (en, fr...) and different \"types\" (f1, f2, m3...) find those that exists\n# the command info will list the available langues\nfemale_voice_id=en+f3\nmale_voice_id=en+m3\n\n```\n\n- run the voice processing with `silly-voice-lab run silly_voice_lab.cfg`\n\n## About the scenario files\n\n### Character groups\n\nDirectly inside a scenario folder (or whatever you named it), you must have at least one yaml files looking like this:\n\n**group_example.yaml**\n```yaml\n- group: heroes      # name of the group\n  characters:\n  - name: John      # name of a character's folder\n    voice_id: EkK5I93UQWFDigLMpZcX # the ElevenLab ID of the voice for the 'prod' mode (optionnal)\n    gender: m       # voice gender for the 'dev' mode (optionnal)\n  - name: Sarah\n    voice_id: Z3R5wn05IrDiVCyEkUrK\n    gender: f\n```\nHere is the definition of the group \"heroes\" provided by the command 'init' (you can have multiple groups in the same file). There is also the definition of John and Sarah.\n\n### Files tree\n\nFor each character you must have a folder with the same name as the character (e.g: John in the folder 'John'). In a character's folder, you will add one or more dialogue yaml file (name them as you wish).\n\nExample (get it with the command 'init'):\n```\nscenario/\n    \u251c\u2500\u2500 heroes/\n    \u2502\u00a0\u00a0 \u251c\u2500\u2500 John/\n    \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 actions.yaml\n    \u2502\u00a0\u00a0 \u2514\u2500\u2500 Sarah/\n    \u2502\u00a0\u00a0     \u2514\u2500\u2500 actions.yaml\n    \u251c\u2500\u2500 heroes.yaml\n    \u2514\u2500\u2500 npcs.yaml\n```\n\n### Dialogues files\n\nNo matter how a dialogue file is named, it must look like that.\n\n**some_dialogues.yaml**\n```yaml\n- category: \"actions\" # when precessed, will create a subfolder with that name\n  dialogues:\n  - title: \"it_works\" # will be used for the name of the file, here 'it_works.mp3'\n    text: \"Yes ! it works\"  # the actual dialogue line\n  - title: \"yes\"\n    text: \"Yes !\"\n- category: \"fight\"\n  dialogues:\n  - title: \"ouch\"\n    text: \"Ouch !\"\n```\n\nYou can add as much categories and dialogues as long as you respect this structure.\n\n\n## about the converters\n- text: does not create real audio files, just text placeholders, usefull to test\n- dev: use a local rough speech-to-text, usefull to prototype a project with real voices (but robot-like as hell !)\n- prod: uses elevenlabs api to create the voices, you need a valid ElevenLab api key to do that.\n\n**Important**: aiming to save your precious ElevenLabs credits, the processing of the voices will automatically skeep the already existing files, so, if you want to replace an already existing file, delete it manually before re-processing. If you add new dialogue lines, only the new ones will be processed.\n\n\n# Suggested workflow with ElevenLabs (tip for broke devs \ud83d\ude09 )\n\nCreate 2 different .cfg files (one converter=dev and one converter=prod), each one pointing to a different outpout folder (let's say \"voices-prod\" and \"voices-dev\").\n\nStart your project with the dev voices, and as soon as your EL credits are high enough to create new 'prod' voices, process the prod cfg file (remember it will only process the missing mp3 files), and then replace the dev voices in your project by the prod ones.\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Dialogues voice generator using ElevenLabs (AI)",
    "version": "0.2.2",
    "project_urls": {
        "Homepage": "https://github.com/byoso/ElevenLabs-tools",
        "Repository": "https://github.com/byoso/ElevenLabs-tools"
    },
    "split_keywords": [
        "silly-voice-lab",
        " voice",
        " elevenlabs"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "a210a17892040fb97eb2e7d8a701b8364695924338f52236400d2226c3e37014",
                "md5": "26da2f03d24687db1919629b2f9af0f4",
                "sha256": "687092043f7a2ae2f61d29384080e9f8d2fccec77eca43d6319be957269c0481"
            },
            "downloads": -1,
            "filename": "silly_voice_lab-0.2.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "26da2f03d24687db1919629b2f9af0f4",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 13369,
            "upload_time": "2025-08-12T20:44:48",
            "upload_time_iso_8601": "2025-08-12T20:44:48.686804Z",
            "url": "https://files.pythonhosted.org/packages/a2/10/a17892040fb97eb2e7d8a701b8364695924338f52236400d2226c3e37014/silly_voice_lab-0.2.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "04bcf183cd9f17295011b2aab4b0f3b0ee5cf08ca34efc663daac224dbedbd62",
                "md5": "c689d4e331bf1bcea965135c3432dccd",
                "sha256": "675a44e31ac3895c193161bc6dfdb86f29c2e5618d509e47296d335f2226cd49"
            },
            "downloads": -1,
            "filename": "silly_voice_lab-0.2.2.tar.gz",
            "has_sig": false,
            "md5_digest": "c689d4e331bf1bcea965135c3432dccd",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 11201,
            "upload_time": "2025-08-12T20:44:49",
            "upload_time_iso_8601": "2025-08-12T20:44:49.586259Z",
            "url": "https://files.pythonhosted.org/packages/04/bc/f183cd9f17295011b2aab4b0f3b0ee5cf08ca34efc663daac224dbedbd62/silly_voice_lab-0.2.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-12 20:44:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "byoso",
    "github_project": "ElevenLabs-tools",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "pydub",
            "specs": [
                [
                    "==",
                    "0.25.1"
                ]
            ]
        },
        {
            "name": "pyttsx3",
            "specs": [
                [
                    "==",
                    "2.99"
                ]
            ]
        },
        {
            "name": "PyYAML",
            "specs": [
                [
                    "==",
                    "6.0.2"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    "==",
                    "2.32.4"
                ]
            ]
        }
    ],
    "lcname": "silly-voice-lab"
}
        
Elapsed time: 1.99696s