# Espeak mbrola output module is based on the generic plugin for Speech
# Dispatcher. It means there is no code written explicitly for
# this plugin, all the specifics are handled in this configuration
# and we call a simple command line client to perform the actual
# synthesis. Use this config file with the sd_generic output module.

# Debug turns debugging on or off
# See speechd.conf for information where debugging information is stored
Debug 0

# IMPORTANT: The audio output method relies on an audio playback
# utility (play, aplay, paplay for OSS, ALSA or Pulse)
# being installed. If this is not the case, consider installing it
# or replace the $PLAY_COMMAND string in the GenericExecuteString below
# with play, paplay or similar.
#
# GenericExecuteSynth is the shell command that should be
# executed in order to say some message. This command must
# stop saying the message on SIGKILL, otherwise it's useless.
# You can use the variables $LANGUAGE, $VOICE, $PITCH and $RATE
# which will be substituted for the appropriate value (you
# can modify this value, see other parameters).
# The command can be split into more lines, if necessary, using '\'.
GenericExecuteSynth \
"printf %s \'$DATA\' | espeak-ng -v mb-$VOICE -s $RATE -p $PITCH $PUNCT -q --stdin --pho | mbrola -v $VOLUME -e /usr/local/share/mbrola/$VOICE/$VOICE - -.au | $PLAY_COMMAND"

# Alternatively you can shorten the command like below, which makes it
# work directly with any audio playback utility, but then you won't
# be able to change the volume from the client application:
# GenericExecuteSynth \
# "printf %s \'$DATA\' | espeak-ng -v mb-$VOICE -s $RATE -p $PITCH $PUNCT -stdin"

GenericCmdDependency "espeak-ng"
GenericCmdDependency "mbrola"
GenericSoundIconFolder "/usr/local/share/sounds/sound-icons/"

# The following three items control punctuation levels None, Some, and All.
# Each of these values will be substituted into the $PUNCT variable depending
# on the value passed to speech dispatcher from applications.
# Note that if an empty string is specified, then $PUNCT will be blank 
# which is a default situation for espeak.
 
GenericPunctNone "--punct=\"\""
GenericPunctSome "--punct=\"()[]{};:\""
GenericPunctMost "--punct=\"()[]{};:\""
GenericPunctAll "--punct"

# GenericStripPunctChars is a list (enclosed in doublequotes) of
# all the characters that should be replaced by whitespaces in
# order not to be badly handled by the output module or misinterpreted
# by shell.
# GenericStripPunctChars  ""

# If the language you need to pass in $LANGUAGE is different
# from the standard ISO language code, you can specify
# which string to use instead. If you wish to use
# other than ISO charset for the specified language,
# you can add it's name (as accepted by iconv) as a
# third parameter in doublequotes, or use GenericDefaultCharset
# to specify it

GenericLanguage		  "en" "en-us"

GenericDefaultCharset "utf-8"

# Each voice is available if and only if the following files exist.
# These files must be listed *before* the voices.

VoiceFileDependency "/usr/local/share/mbrola/$VOICE/$VOICE"
VoiceFileDependency "/usr/local/share/espeak-ng-data/voices/mb/mb-$VOICE"

# AddVoice specifies which $VOICE string should be assigned to
# each language and symbolic voice name. All the voices you want
# to use must be specified here. This list will likely not be
# up-to-date, please check eSpeak NG documentation and add the voices
# you want to use.
# All MBROLA voices for which a phoneme translation from espeak-ng to
# MBROLA as of 12 October 2018 are listed, some commented with the
# rationale to not include them by default. You still can ship or use
# the commented voices if you uncomment the corresponding line.
  
# As of Friday 12 October 2018 these mbrola voices aren't yet 
# supported by espeak-ng's phonemes translation to mbrola in git are:
# bz1: Breton Female (25.0Mb)    Jean Pierre Messager
# hb1: Hebrew Male (3.4Mb)    Yoram Meron
# hb2: Hebrew Female (5.6Mb)    Esther Raizen
# hn1: Korean Male (9.9Mb)    Kyongsok Gim
# thus they are not listed below.
# The language code in this list is the ISO 639-1 code.

AddVoice "af" "MALE1" "af1"

AddVoice "ar" "MALE1" "ar1"
AddVoice "ar" "MALE2" "ar2"

AddVoice "zh" "FEMALE1" "cn1"

AddVoice "cs" "FEMALE1" "cz1"
AddVoice "cs" "MALE1" "cz2"

AddVoice "de" "FEMALE1" "de1"
AddVoice "de" "MALE1" "de2"
AddVoice "de" "FEMALE2" "de3"
AddVoice "de" "MALE2" "de4"
AddVoice "de" "FEMALE3" "de5"
AddVoice "de" "MALE1" "de6"
AddVoice "de" "FEMALE3" "de7"
AddVoice "de" "MALE3" "de8"

AddVoice "el" "MALE1" "gr1"
AddVoice "el" "MALE2" "gr2"

AddVoice "en" "FEMALE1" "us1"
AddVoice "en" "MALE1" "en1"
AddVoice "en" "MALE2" "us2"
AddVoice "en" "MALE3" "us3"
AddVoice "en-gb" "MALE1" "en1"
AddVoice "en-us" "FEMALE1" "us1"
AddVoice "en-us" "MALE1" "us2"
AddVoice "en-us" "MALE2" "us3"

AddVoice "es" "MALE1" "es1"
AddVoice "es" "MALE2" "es2"
AddVoice "es" "FEMALE1" "es3"
AddVoice "es" "MALE3" "es4"
AddVoice "es-mx" "MALE1" "mx1"
AddVoice "es-mx" "MALE2" "mx2"
AddVoice "es-ve" "MALE1" "vz1"     

AddVoice "et" "MALE1" "ee1"

AddVoice "fa" "MALE1" "ir1"
AddVoice "fa" "FEMALE1" "ir2"

AddVoice "fr-ca" "MALE1" "ca1"
AddVoice "fr-ca" "MALE2" "ca2"
AddVoice "fr" "MALE1" "fr1"
AddVoice "fr" "FEMALE1" "fr2"
AddVoice "fr" "MALE2" "fr3"
AddVoice "fr" "FEMALE2" "fr4"
AddVoice "fr-be" "MALE1" "fr5"
AddVoice "fr" "MALE3" "fr6"
AddVoice "fr-be" "MALE2" "fr7"

AddVoice "hi" "MALE1" "in1"
AddVoice "hi" "MALE2" "in2"

AddVoice "hu" "MALE1" "hu1"

AddVoice "hr" "MALE1" "cr1"

AddVoice "id" "MALE1" "id1"

AddVoice "is" "MALE1" "ic1"

AddVoice "it" "MALE1" "it1"
AddVoice "it" "FEMALE1" "it2"
AddVoice "it" "MALE2" "it3"
AddVoice "it" "FEMALE2" "it4"

AddVoice "jp" "MALE1" "jp1"
AddVoice "jp" "FEMALE1" "jp2"
AddVoice "jp" "FEMALE2" "jp3"

AddVoice "la" "MALE1" "la1"

AddVoice "lt" "MALE1" "lt1"
AddVoice "lt" "MALE2" "lt2"

Addvoice "ms" "FEMALE1" "ma1"

# nl1 has a very limited set of diphones and is usable only for reading
# numbers. Uncomment the next line if you want it.
# AddVoice "nl" "CHILD-MALE" "nl1"
AddVoice "nl" "MALE1" "nl2"
AddVoice "nl" "FEMALE1" "nl3"

AddVoice "mi" "MALE1" "nz1"

AddVoice "pl" "FEMALE1" "pl1"

AddVoice "pt-br" "MALE1" "br1"
AddVoice "pt-br" "MALE2" "br2"
AddVoice "pt-br" "MALE3" "br3"
AddVoice "pt-br" "FEMALE1" "br4"
AddVoice "pt" "FEMALE1" "pt1"

AddVoice "ro" "MALE1" "ro1"

AddVoice "sv" "MALE1" "sw1"
AddVoice "sv" "FEMALE1" "sw2"

AddVoice "te" "FEMALE1" "tl1"

AddVoice "tr" "MALE1" "tr1"
AddVoice "tr" "FEMALE1" "tr2"

# DefaultVoice specifies which $VOICE string should be used if no voice is
# specified otherwise.

DefaultVoice    "en1"

# These parameters set _rate_, _pitch_, and _volume_ conversion. This is
# part of the core of the definition of this generic output
# module for this concrete synthesizer, it's not intended to
# be modified by common users.
# The resulting rate (or pitch) has the form:
#       (speechd_rate * GenericRateMultiply) + GenericRateAdd
# while speechd_rate is a value between -100 (lowest) and +100 (highest)
# You have to define some meaningful conversion for each synthesizer

# Here's the mapping from SSIP (Speech Dispatcher) to ESpeak (v1.10):
#
#           SSIP Range  SSIP Default    ESpeak/MBROLA Range ESpeak Default
#           ----------- ------------    ------------         --------------
# Rate      -100 to 100     0           80 to 320       160
# Pitch     -100 to 100     0            0 to 99         50
# Volume    -100 to 100     0            0 to 2          --
#
# The SSIP defaults are actually controlled via DefaultRate, DefaultPitch, and
# DefaultVolume in the speechd.conf file.

GenericRateAdd          160
GenericPitchAdd         50
GenericVolumeAdd        1

# (These values are multiplied by 100, because DotConf currently
# doesn't support floats. So you can write 0.85 as 85 and so on.)

GenericRateMultiply     160
GenericPitchMultiply    50
GenericVolumeMultiply   1

# If the client program can't handle floats, you will have to
# use these two options to force integers as the parameters
# 1 means force integers, 0 means do nothing (write floats).

GenericRateForceInteger     1
GenericPitchForceInteger    1
GenericVolumeForceInteger   0

# Note that SSIP rates < -50 are spoken at -50.


# Copyright (C) 2008-2010 Brailcom, o.p.s
# Copyright (C) 2014 Luke Yelavich <themuso@ubuntu.com>
# Copyright (C) 2018-2021, 2025 Samuel Thibault <samuel.thibault@ens-lyon.org>
# Copyright (C) 2018 Didier Spaier <didier@slint.fr>
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.  See the GNU General Public License for more details (file
# COPYING in the root directory).
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
