# speak-ng - A multi-lingual software speech synthesizer.

## SYNOPSIS

__speak-ng__ [<options>] [<&lt;words&gt;>]

## DESCRIPTION

__speak-ng__ is a software speech synthesizer for English, and some other
languages.

## OPTIONS

  * `-h`, `--help`:
    Show summary of options.

  * `--version`:
    Prints the espeak library version and the location of the espeak voice
    data.

  * `-f <text file>`:
    Text file to speak.

  * `--stdin`:
    Read text input from stdin instead of a file.

If neither -f nor --stdin are provided, &lt;words&gt; are spoken, or if no
words are provided then text is spoken from stdin a line at a time.

  * `-q`:
    Quiet, don't produce any speech (may be useful with -x).

  * `-a <integer>`:
    Amplitude, 0 to 200, default is 100.

  * `-g <integer>`:
    Word gap. Pause between words, units of 10ms at the default speed.

  * `-k <integer>`:
    Indicate capital letters with: 1=sound, 2=the word "capitals", higher
    values = a pitch increase (try -k20).

  * `-l <integer>`:
    Line length. If not zero (which is the default), consider lines less than
    this length as end-of-clause.

  * `-p <integer>`:
    Pitch adjustment, 0 to 99, default is 50.

  * `-s <integer>`:
    Speed in words per minute, default is 160.

  * `-v <voice name>`:
    Use voice file of this name from espeak-ng-data/voices. A variant can be
    specified using <voice>+<variant>, such as af+m3.

  * `-w <wave file name>`:
    Write output to this WAV file, rather than speaking it directly.

  * `--split=<minutes>`:
    Used with `-w` to split the audio output into &lt;minutes&gt; recorded
    chunks.

  * `-b`:
    Input text encoding, 1=UTF8, 2=8 bit, 4=16 bit.

  * `-m`:
    Indicates that the text contains SSML (Speech Synthesis Markup Language)
    tags or other XML tags. Those SSML tags which are supported are
    interpreted. Other tags, including HTML, are ignored, except that some HTML
    tags such as &lt;hr&gt; &lt;h2&gt; and &lt;li&gt; ensure a break in the
    speech.

  * `-x`:
    Write phoneme mnemonics to stdout.

  * `-X`:
    Write phonemes mnemonics and translation trace to stdout. If rules files
    have been built with --compile=debug, line numbers will also be displayed.

  * `-z`:
    No final sentence pause at the end of the text.

  * `--stdout`:
    Write speech output to stdout.

  * `--compile=voicename`:
    Compile the pronunciation rules and dictionary in the current directory.
    =&lt;voicename&lt; is optional and specifies which language is compiled.

  * `--compile-debug=voicename`:
    Compile the pronunciation rules and dictionary in the current directory as
    above, but include line numbers, that get shown when -X is used.

  * `--ipa`:
    Write phonemes to stdout using International Phonetic Alphabet. --ipa=1 Use
    ties, --ipa=2 Use ZWJ, --ipa=3 Separate with _.

  * `--tie=<character>`:
    The character to use to join multi-letter phonemes in -x and --ipa output.

  * `--path=<path>`:
    Specifies the directory containing the espeak-ng-data directory.

  * `--pho`:
    Write mbrola phoneme data (.pho) to stdout or to the file in --phonout.

  * `--phonout=<filename>`:
    Write output from -x -X commands and mbrola phoneme data to this file.

  * `--punct="<characters>"`:
    Speak the names of punctuation characters during speaking. If
    =&lt;characters&gt; is omitted, all punctuation is spoken.

  * `--sep=<character>`:
    The character to separate phonemes from the -x and --ipa output.

  * `--voices[=<language code>]`:
    Lists the available voices. If =&lt;language code&gt; is present then only
    those voices which are suitable for that language are listed.

  * `--voices=<directory>`:
    Lists the voices in the specified subdirectory.

## EXAMPLES

  * `speak-ng "This is a test"`:
    Speak the sentence "This is a test" using the default English voice.

  * `speak-ng -f hello.txt`:
    Speak the contents of hello.txt using the default English voice.

  * `cat hello.txt | speak-ng`:
    Speak the contents of hello.txt using the default English voice.

  * `speak-ng -x hello`:
    Speak the word "hello" using the default English voice, and print the
    phonemes that were spoken.

  * `speak-ng -ven-us "[[h@'loU]]"`:
    Speak the phonemes "h@'loU" using the American English voice.

  * `speak-ng --voices`:
    List all voices supported by eSpeak.

  * `speak-ng --voices=en`:
    List all voices that speak English (`en`).

  * `speak-ng --voices=mb`:
    List all voices using the MBROLA voice synthesizer.

## AUTHOR

eSpeak NG is maintained by Reece H. Dunn <msclrhd@gmail.com>. It is based on
eSpeak by Jonathan Duddington <jonsd@jsd.clara.co.uk>.

This manual page is based on the eSpeak page written by Luke Yelavich
<themuso@ubuntu.com> for the Ubuntu project.
