Contents
[IMPORTANT: PARTIALLY BROKEN AS OF macOS Sonoma (14): many installed voices aren't recognized, and the default voice isn't listed with -l
]
voices
is a macOS CLI for changing the default TTS (text-to-speech) voice and for printing information about and/or speaking text with multiple voices.
voices
complements the standard say
utility by:
say
wrapper that supports text with embedded instructions to change the voice mid-text (e.g.,
[[voice alex]]
), assuming you have Powershell installed, see this comment.Caveats:
As of macOS 10.12 (Sierra), there is no documented programmatic way to change the default voice. Thus, this utility makes use of undocumented system internals, which, unfortunately, means that future compatibility of this feature is uncertain. Feedback welcome.
voices
currently only fully supports voices provided by Apple. Support
for third-party voices such as InfoVox iVox is limited to speaking with them,
and the macOS Services documented below will not work with them.
Additionally, as of macOS 10.15, Siri voices are not supported, due to lack of API support (see this Stack Overflow question).
See the examples below, concise usage information further below, or read the manual.
Additionally, two macOS Services are offered:
Note: If you have Alfred with its Power Pack, consider workflow speak.awf as a superior alternative.
# List all active voices; add -a to list all installed ones.
voices -l
# Print information about the default voice and speak its demo text.
voices -d -k
# Print information about voice 'Alex'.
voices alex
# Make 'Alex' the new default voice, print information about it, and
# speak text that announces the change.
voices -k'The new default voice is Alex.' -d alex
# List languages for which at least one voice is active.
voices -L
# List active French voices.
voices -l fr
# Print information about all active voices and speak
# their respective demo text.
voices -l -k
# Print information about all active Spanish voices and speak their
# respective demo text.
voices -k -l es
# Say "hello", first with voice Alex, then with Jill, suppressing printed
# output.
voices -k"hello" -q alex jill
Supported platforms
Verified to work from OS X 10.8 (Mountain Lion) up to macOS 10.12 (Sierra).
The change-the-default-voice feature makes use of undocumented system internals, so its future compatiblity is uncertain. Do let me know if you find the feature broken in a future macOS version.
Note: Even if you don't use Node.js, its package manager, npm
, works across platforms and is easy to install; try curl -L http://git.io/n-install | bash
With Node.js installed, install the package as follows:
[sudo] npm install voices -g
Note:
sudo
depends on how you installed Node.js / io.js and whether you've changed permissions later; if you get an EACCES
error, try again with sudo
.-g
ensures global installation and is needed to put voices
in your system's $PATH
.voices
.chmod +x voices
.$PATH
, such as /usr/local/bin
.Find concise usage information below; for complete documentation, read the
manual online, or, once installed, run man voices
(voices --man
if installed manually).
$ voices --help
Get or set or speak with the DEFAULT VOICE:
voices [<options>] [-d [<newDefaultVoice>]]
LIST INFORMATION about / speak with voices:
voices [<options>] <voice>...
List / speak with ALL VOICES, optionally FILTERED BY LANGUAGES:
voices [<options>] -l [<lang>...]
LIST LANGUAGES among voices:
voices -L [-a]
MANAGE VOICES in System Preferences:
voices -m
Shared options (synopsis forms 1-3):
-a target all installed voices (default: only active ones)
-k speak demo text with all targeted voices
-k"<text>" speak specified text
-k- speak text provided via stdin
-b output format: print voice names only
-i output format: print voice internals
-q quiet mode: no printed output
Standard options: --help, --man, --version, --home
This service, which uses an embedded copy of voices
, is helpful if you use text-to-speech in two or more languages and want to quickly
switch the default voice between multiple designated voices cyclically, in combination with the built-in speak-selected-text service.
Every time the service is invoked, the next designated voice is made the default voice, and the localized name of the new voice's language is spoken to confirm the change (this is configurable).
You can invoke the service from any application's standard Services
menu, category General
, or assign it a keyboard shortcut via
System Preferences > Keyboard > Shortcuts > Services
.
Switch Default Voice.workflow
in the same folder.Switch Default Voice.workflow
and choose Install
when prompted - this will place the package in ~/Library/Services/
.Done
when prompted and proceed with customization below.Services > Switch Default Voice
.System Preferences > Keyboard > Shortcuts
, category Services
,
scroll to sub-category General
in the list on the right, select Switch Default Voice
, and click just inside the right edge of the list item.~/.SwitchDefaultVoice-rc
in your text editor.This service provides an alternative to switching the default voice: it speaks
selected text in the frontmost application with a fixed alternate voice, which
allows it to be used alongside the built-in speak-selected-text service, which
always uses the default voice (see System Preferences > Dictation & Speech > Text to Speech
).
Typically, you would use this service to speak selected text with a voice that speaks a different language.
You can invoke it from the standard Services
menu, category Text
, whenever text is selected in the frontmost application, or assign it a
keyboard shortcut via System Preferences > Keyboard > Shortcuts > Services
; e.g., ⌥`
(Opt-`) to parallel the default shortcut for
the built-in service, ⌥⎋
(Opt-Esc).
Invoking the service again while text from a previous invocation is still being spoken aborts speaking.
Caveat: This only works if text - any text - is selected in the activate applciation at the time the service is invoked again.
If desired, you can duplicate the service so as to be able to speak with one of multiple alternate voices:
Once installed, duplicate ~/Library/Services/Speak With Specific Voice.workflow
in Finder, give it a meaningful name,
and customize the duplicate as described below.
Speak With Specific Voice.workflow
in the same folder.Speak With Specific Voice.workflow
and choose Install
when prompted - this will place the package in ~/Library/Services/
.Open in Automator
when prompted and proceed with customization below.# ------- BEGIN: CUSTOMIZE
and # ------- END: CUSTOMIZE
.System Preferences > Keyboard > Shortcuts
, category Services
, scroll to sub-category General
in the list on the right, select Speak With Specific Voice.workflow
, and click just inside the right edge of the list item.~/Library/Services/Speak With Specific Voice.workflow
in Automator.
~/Library
, activate Finder, hold down the Option key while selecting the Go
menu, and select Library
; from there, navigate to subfolder Services
and open package Speak With Specific Voice.workflow
.Copyright (c) 2015-2018 Michael Klement mklement0@gmail.com (http://same2u.net), released under the MIT license.
This project gratefully depends on the following open-source components, according to the terms of their respective licenses.
npm dependencies below have optional suffixes denoting the type of dependency; the absence of a suffix denotes a required run-time dependency: (D)
denotes a development-time-only dependency, (O)
an optional dependency, and (P)
a peer dependency.
Versioning complies with semantic versioning (semver).
v0.3.4 (2018-03-21):
v0.3.3 (2018-03-08):
awk
are called, to prevent unexpected behavior stemming from
user-installed versions in /usr/local/bin getting called.v0.3.2 (2017-01-03):
voices -m
now works on macOS Sierra.v0.3.1 (2015-11-03):
v0.3.0 (2015-10-27):
-i
for reporting voice internals now reports
an extra variable BundleID
as the last item, i.e., the voice's bundle ID.v0.2.3 (2015-09-20):
voices
now has a man page (if manually installed, use voices --man
);
voices -h
now just prints concise usage information.v0.2.2 (2015-09-15):
v0.2.1 (2015-07-30):
v0.2.0 (2015-07-29):
voices
now honors custom speaking rates when requested to speak with the -k
optionSwitch Default Voice.workflow
is now configuration file-based and supports more than 2 voices for cyclical switching; default confirmation text spoken on switching is now the localized name of the new voice's language.Speak With Specific Voice.workflow
allows speaking selected text with a fixed alternate voice.v0.1.9 (2015-07-28):
v0.1.8 (2015-07-28):
v0.1.7 (2015-07-28):
voices
' own -k
option does not honor custom speaking rates due to a limitation in the underlying say
utility.v0.1.6 (2015-07-28):
v0.1.5 (2015-07-27):
v0.1.4 (2015-07-27):
v0.1.3 (2015-07-06):
--version
streamlined.v0.1.2 (2015-07-01):
v0.1.1 (2015-06-30):
v0.1.0 (2015-06-29):