From c6e218fdae674ae54554b7b8f113dcb00a1ad78c Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Thu, 31 Mar 2022 16:50:28 -0400 Subject: [PATCH] More README goodness --- README.md | 7 +- mimic3-http/README.md | 2 + mimic3-http/img/server_screenshot.jpg | Bin 0 -> 51128 bytes mimic3-tts/README.md | 149 +++++++++++++++++++++++++- 4 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 mimic3-http/img/server_screenshot.jpg diff --git a/README.md b/README.md index a9aa12b..981c74b 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,8 @@ See `mimic3-download --help` for more options. Start a web server with `mimic3-server` and visit `http://localhost:59125` to view the web UI. +![screenshot of web interface](mimic3-http/img/server_screenshot.jpg) + The following endpoints are available: * `/api/tts` @@ -178,12 +180,13 @@ mimic3-client --voice 'en_UK/apope_low' 'My hovercraft is full of eels.' > hover ## MaryTTS Compatibility Use the Mimic 3 web server as a drop-in replacement for [MaryTTS](http://mary.dfki.de/), for example with [Home Assistant](https://www.home-assistant.io/integrations/marytts/). -Make sure to use a compatible [voice key](#voice-keys). + +Make sure to use a compatible [voice key](#voice-keys) like `en_UK/apope_low`. ## SSML -A [subset of SSML](mimic3-tts/#SSML) is supported. +A [subset of SSML](mimic3-tts/#SSML) (Speech Synthesis Markup Language) is supported. For example: diff --git a/mimic3-http/README.md b/mimic3-http/README.md index d6799a5..d7ed89e 100644 --- a/mimic3-http/README.md +++ b/mimic3-http/README.md @@ -4,6 +4,8 @@ A small HTTP web server for the [Mimic 3](https://github.com/MycroftAI/mimic3) t [Available voices](https://github.com/MycroftAI/mimic3-voices) +![screenshot of web interface](img/server_screenshot.jpg) + ## Installation diff --git a/mimic3-http/img/server_screenshot.jpg b/mimic3-http/img/server_screenshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..08fea48fc8c61482bc0ce2af02ceedc730d56053 GIT binary patch literal 51128 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 "" > output.wav +``` + +where `` is a [voice key](https://github.com/MycroftAI/mimic3/#voice-keys) like `en_UK/apope_low`. +`` may contain multiple sentences, which will be combined in the final output WAV file. These can also be [split into separate WAV files](#multiple-wav-output). + + +#### SSML Synthesis + +```sh +mimic3 --ssml --voice "" > output.wav +``` + +where `` is valid [SSML](https://www.w3.org/TR/speech-synthesis11/). Not all SSML features are supported, see [the documentation](#ssml) for details. + +If your SSML contains `` tags, add `--mark-file ` to the command-line and use `--interactive` mode. As the marks are encountered, their names will be written on separate lines to the file: + +```sh +mimic3 --ssml --interactive --mark-file - 'Test 1. Test 2.' +``` + + +#### Long Texts + +If your text is very long, and you would like to listen to it as its being synthesized, use `--interactive` mode: + +```sh +mimic3 --interactive < long.txt +``` + +Each input line will be synthesized and played (see `--play-program`). By default, 5 sentences will be kept in an output queue, only blocking synthesis when the queue is full. You can adjust this value with `--result-queue-size`. + +If your long text is fixed-width with blank lines separating paragraphs like those from [Project Gutenberg](https://www.gutenberg.org/), use the `--process-on-blank-line` option so that sentences will not be broken at line boundaries. For example, you can listen to "Alice in Wonderland" like this: + +```sh +curl --output - 'https://www.gutenberg.org/files/11/11-0.txt' | \ + mimic3 --interactive --process-on-blank-line +``` + + +#### Multiple WAV Output + +With `--output-dir` set to a directory, Larynx will output a separate WAV file for each sentence: + +```sh +mimic3 'Test 1. Test 2.' --output-dir /path/to/wavs +``` + +By default, each WAV file will be named using the (slightly modified) text of the sentence. You can have WAV files named using a timestamp instead with `--output-naming time`. For full control of the output naming, the `--csv` command-line flag indicates that each sentence is of the form `id|text` where `id` will be the name of the WAV file. + +```sh +cat << EOF | +s01|The birch canoe slid on the smooth planks. +s02|Glue the sheet to the dark blue background. +s03|It's easy to tell the depth of a well. +s04|These days a chicken leg is a rare dish. +s05|Rice is often served in round bowls. +s06|The juice of lemons makes fine punch. +s07|The box was thrown beside the parked truck. +s08|The hogs were fed chopped corn and garbage. +s09|Four hours of steady work faced us. +s10|Large size in stockings is hard to sell. +EOF + mimic3 --csv --output-dir /path/to/wavs +``` + +You can adjust the delimiter with `--csv-delimiter `. + +Additionally, you can use the `--csv-voice` option to specify a different voice or speaker for each line: + +```sh +cat << EOF | +s01|#awb|The birch canoe slid on the smooth planks. +s02|#rms|Glue the sheet to the dark blue background. +s03|#slt|It's easy to tell the depth of a well. +s04|#ksp|These days a chicken leg is a rare dish. +s05|#clb|Rice is often served in round bowls. +s06|#aew|The juice of lemons makes fine punch. +s07|#bdl|The box was thrown beside the parked truck. +s08|#lnh|The hogs were fed chopped corn and garbage. +s09|#jmk|Four hours of steady work faced us. +s10|en_UK/apope_low|Large size in stockings is hard to sell. +EOF + mimic3 --voice 'en_US/cmu-arctic_low' --csv-voice --output-dir /path/to/wavs +``` + +The second contain can contain a `#` or an entirely different voice! + + +#### Interactive Mode + +With `--interactive`, Mimic 3 will switch into interactive mode. After entering a sentence, it will be played with `--play-program`. + +```sh +mimic3 --interactive +Reading text from stdin... +Hello world! +``` + +Use `CTRL+D` or `CTRL+C` to exit. + + +#### Noise and Length Settings + +Synthesis has the following additional parameters: + +* `--noise-scale` and `--noise-w` + * Determine the speaker volatility during synthesis + * 0-1, default is 0.667 and 0.8 respectively +* `--length-scale` - makes the voice speaker slower (> 1) or faster (< 1) + +Individual voices have default settings for these parameters in their `config.json` files (under `inference`). + + +#### List Voices + +```sh +mimic3 --voices +``` + + ### mimic3-download +Mimic 3 automatically downloads voices when they're first used, but you can manually download them too with `mimic3-download`. + +For example: + +``` sh +mimic3-download 'en_US/*' +``` + +will download all U.S. English voices to `${HOME}/.local/share/mimic3` (technically `${XDG_DATA_HOME}/mimic3`). + +See `mimic3-download --help` for more options. + ## SSML -A subset of [SSML](https://www.w3.org/TR/speech-synthesis11/) is supported: +A subset of [SSML](https://www.w3.org/TR/speech-synthesis11/) (Speech Synthesis Markup Language) is supported: * `` - wrap around SSML text * `lang` - set language for document @@ -35,6 +171,15 @@ A subset of [SSML](https://www.w3.org/TR/speech-synthesis11/) is supported: * `` - Pause for given amount of time * time - seconds ("123s") or milliseconds ("123ms") * `` - substitute `alias` for inner text +* `` - supply phonemes for inner text + * See `phonemes.txt` in voice directory for available phonemes + * Phonemes may need to be separated by whitespace + +SSML `` support varies between voice types: + +* [gruut](https://github.com/rhasspy/gruut/#ssml) +* [eSpeak-ng](http://espeak.sourceforge.net/ssml.html) +* Character-based voices do not currently support `` ## Architecture @@ -48,6 +193,8 @@ Our implementation is heavily based on [Jaehyeon Kim's PyTorch model](https://gi Voices that use [gruut](https://github.com/rhasspy/gruut/) for phonemization. +gruut phonemizes words according to a lexicon, with a pre-trained grapheme-to-phoneme model used to guess unknown word pronunciations. + ### eSpeak Phoneme-based Voices