diff --git a/README.md b/README.md index 7aaf2b5..af62279 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,54 @@ The WebUI supports muliple languages and voices. First, follow the installation python app.py ``` -### English with Multi Accents +### CLI + +You may use the MeloTTS CLI to interact with MeloTTS. The CLI may be invoked using either `melotts` or `melo`. Here are some examples: + +**Read English text:** + +```bash +melo "Text to read" output.wav +``` + +**Specify a language:** + +```bash +melo "Text to read" output.wav --language EN +``` + +**Specify a speaker:** + +```bash +melo "Text to read" output.wav --language EN --speaker EN-US +melo "Text to read" output.wav --language EN --speaker EN-AU +``` + +The available speakers are: `EN-Default`, `EN-US`, `EN-BR`, `EN-INDIA` `EN-AU`. + +**Specify a speed:** + +```bash +melo "Text to read" output.wav --language EN --speaker EN-US --speed 1.5 +melo "Text to read" output.wav --speed 1.5 +``` + +**Use a different language:** + +```bash +melo "语音合成领域近年来发展迅速" zh.wav -l ZH +``` + +The full API documentation may be found using: + +```bash +melo --help +``` + +### Python API + +#### English with Multi Accents + ```python from melo.api import TTS @@ -103,7 +150,8 @@ output_path = 'es.wav' model.tts_to_file(text, speaker_ids['ES'], output_path, speed=speed) ``` -### French +#### French + ```python from melo.api import TTS @@ -119,7 +167,8 @@ output_path = 'fr.wav' model.tts_to_file(text, speaker_ids['FR'], output_path, speed=speed) ``` -### Chinese +#### Chinese + ```python from melo.api import TTS @@ -135,7 +184,8 @@ output_path = 'zh.wav' model.tts_to_file(text, speaker_ids['ZH'], output_path, speed=speed) ``` -### Japanese +#### Japanese + ```python from melo.api import TTS @@ -151,7 +201,8 @@ output_path = 'jp.wav' model.tts_to_file(text, speaker_ids['JP'], output_path, speed=speed) ``` -### Korean +#### Korean + ```python from melo.api import TTS @@ -168,7 +219,9 @@ model.tts_to_file(text, speaker_ids['KR'], output_path, speed=speed) ``` ## License + This library is under MIT License, which means it is free for both commercial and non-commercial use. -## Acknowledgement +## Acknowledgements + This implementation is based on several excellent projects, [TTS](https://github.com/coqui-ai/TTS), [VITS](https://github.com/jaywalnut310/vits), [VITS2](https://github.com/daniilrobnikov/vits2) and [Bert-VITS2](https://github.com/fishaudio/Bert-VITS2). We appreciate their awesome work! diff --git a/melo/main.py b/melo/main.py new file mode 100644 index 0000000..265e088 --- /dev/null +++ b/melo/main.py @@ -0,0 +1,28 @@ +import click +import warnings + +@click.command +@click.argument('text') +@click.argument('output_path') +@click.option('--language', '-l', default='EN', help='Language, defaults to English', type=click.Choice(['EN', 'ES', 'FR', 'ZH', 'JP', 'KR'], case_sensitive=False)) +@click.option('--speaker', '-spk', default='EN-Default', help='Speaker ID, only for English, leave empty for default, ignored if not English. If English, defaults to "EN-Default"', type=click.Choice(['EN-Default', 'EN-US', 'EN-BR', 'EN-INDIA', 'EN-AU'])) +@click.option('--speed', '-s', default=1.0, help='Speed, defaults to 1.0', type=float) +@click.option('--device', '-d', default='auto', help='Device, defaults to auto') +def main(text, output_path, language, speaker, speed, device): + language = language.upper() + if language == '': language = 'EN' + if speaker == '': speaker = None + if (not language == 'EN') and speaker: + warnings.warn('You specified a speaker but the language is English.') + from melo.api import TTS + model = TTS(language=language, device=device) + speaker_ids = model.hps.data.spk2id + if language == 'EN': + if not speaker: speaker = 'EN-Default' + spkr = speaker_ids[speaker] + else: + spkr = speaker_ids[list(speaker_ids.keys())[0]] + model.tts_to_file(text, spkr, output_path, speed=speed) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/setup.py b/setup.py index af5ce20..ad67a65 100644 --- a/setup.py +++ b/setup.py @@ -28,4 +28,10 @@ setup( package_data={ '': ['*.txt', 'cmudict_*'], }, + entry_points={ + "console_scripts": [ + "melotts = melo.main:main", + "melo = melo.main:main", + ], + }, )