Automate chunking long texts to produce a single audio file from text-to-speech APIs
Project description
tts-joinery
tts-joinery is a Python library and CLI tool to work around length limitations in text-to-speech APIs.
Since currently-popular APIs are limited to 4096 characters, this library will:
- Chunk the input text into sentences using the NLTK Punkt module (for better audio by avoiding segments split in the middle of a word or sentence).
- Run each chunk through the TTS API
- Join together the resulting output to produce a single MP3 file
Currently only the OpenAI API is supported, with the intent to add more in the future.
Installation
pip install tts-joinery
or use pipx
to install as a standalone tool.
Requires ffmpeg for the audio file processing.
Installation may vary depending on your system. On Linux you can use your system package manager. On Mac brew install ffmpeg
should work.
Usage
Command-Line Interface (CLI)
The CLI expects to find an OpenAI API Key in a OPENAI_API_KEY
environment variable, or in a .env file.
Syntax
ttsjoin [OPTIONS] [COMMAND]
Options
Options:
--input-file FILENAME Plaintext file to process into speech, otherwise stdin
--output-file FILENAME MP3 result, otherwise stdout
--model TEXT Slug of the text-to-speech model to be used
--service TEXT API service (currently only supports openai)
--voice TEXT Slug of the voice to be used
--no-cache BOOLEAN Disable caching
--help Show this message and exit.
Commands:
cache [clear, show]
Examples
- Using an input file and specifying an output file:
ttsjoin --input-file input.txt --output-file output.mp3 --model tts-1 --service openai --voice onyx
- Using stdin and stdout with default options:
echo "Your text to be processed" | ttsjoin > output.mp3
- Each chunk of text is cached for performance when running the same text multiple times, this can be disabled:
ttsjoin --input-file input.txt --output-file output.mp3 --no-cache
- Clear cache directory
ttsjoin cache clear
Python Library
You can also use tts-joinery as part of your Python project:
import nltk
from joinery.op import JoinOp
from joinery.api.openai import OpenAIApi
# Only need to download once, handled for you automatically in the CLI
nltk.download('punkt', quiet=True)
tts = JoinOp(
text='This is only a test!',
api=OpenAIApi(
model='tts-1-hd',
voice='onyx',
api_key=OPENAI_API_KEY,
),
)
tts.process_to_file('output.mp3')
Changelog
v1.0.3 (2024-10-05)
- Added cache management commands to cli
- Fixed a bug when running
- Added end-to-end tests
v1.0.2 (2024-10-03)
- Fixed crash when running with caching disabled (#3)
Contributing
Contributions welcome, particularly other TTS APIs, check the issues beforehand and feel free to open a PR. Code is formatted with Black.
Test can be run manually. Suite includes end-to-end tests with live API calls, ensure you have an OPENAI_API_KEY set in .env.test
, and run pytest
. You can install development dependencies with pip install -e .[test]
Contributors
Special thanks to:
- Mayank Vishwakarma (@mayankwebbing)
License
This project is licensed under the MIT License.
Copyright 2024, Adrien Delessert
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file tts_joinery-1.0.3.tar.gz
.
File metadata
- Download URL: tts_joinery-1.0.3.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | de7ba4f285c8676349e122ad7ef85b276d1a0e9ffa82219de4047d254a616a41 |
|
MD5 | 3d27a9b2711f406ff684b0114772bec6 |
|
BLAKE2b-256 | 03e8716ca15aa0d096bb1801279d67d9b729a41d56fc9a4f918d21cc7d33a772 |
File details
Details for the file tts_joinery-1.0.3-py3-none-any.whl
.
File metadata
- Download URL: tts_joinery-1.0.3-py3-none-any.whl
- Upload date:
- Size: 10.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 89bb6703e8b6433bd5e9bd5a12be902d67bf422b32aad7fa1f15c47e787f4f58 |
|
MD5 | 37987da3d687c1f0e2e409f93f0057ab |
|
BLAKE2b-256 | 17b8b18d18b1a55daa9457f25f4f520680c86d3d26cb9041f16f2ed664e01aeb |