Ask Different is a question and answer site for power users of Apple hardware and software. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I use Mac's Text to Speech function a lot. Under Settings > Speech > Text to Speech I also have set a "Key" for quick access.

Since I also want Text to Speech to read German and OS Lion offers Voices for other languages, I would like to have a second shortcut for German.

Does anyone know where I can set this? Or is the only way to constantly change the System Voice before I want a German text to be read? (And then reset the voice to Alex for English texts)


share|improve this question

Kind of old post and maybe you have found a solution already. One way to simplify this is with Automator.

Open Automator, choose Service, Service receives selected text, drag action "Speak Text" to build worklow select Voice (for example: Ryan Speaking) Save

Repeat with different voices.

(The Services List can be edited/cleaned up with Service Scrubber Application and partly under System Preferences > Keyboard > Keyboard Shortcuts > Services)

Edit: Now that you have two or more Voices under the Services Menu, you can go to: System Preferences > Keyboard > Keyboard Shortcuts > Application Shortcuts and create a new Shortcut for each voice.

So far, it works like this on my machine (OS 10.6.8): Default System Voice: Ryan (Infovox) Shortcut Selected in Speech Pref to Control+S. This starts and stops English text.

The German voice I have assigned Control+Y (Yannick voice from Lion OS). Control+Y starts German voice for German selected text; which can be stopped by clicking the main start/stop shortcut twice, here Control+S+S. The reason for twice is because pressing it once starts the English voice over the German voice. That's the best I could come up so far. Make sure the shortcuts don't conflict with other shortcuts. You will notice that the additional shortcut allows you to start several voice threads, talking over each other plus the default system voice, which drives up processor activity, but no problem if one remembers to stop the speaking by double-executing of the shortcut for the default voice.

Not sure if this works system-wide, but works in my browsers, Mail, and the BookReader app I'm using.

Edit 2: I have noticed that when activating a secondary text-to-speech voice via the Automator Service the Automator Runner process drives up processor activity to above 100% with fans speeding up. Not sure if there is a solution to this.

share|improve this answer
Can you add a screenshot of your Automator workflow? With Automator this is usually easier to understand than a textual description – patrix Nov 27 '12 at 4:27

As Mikofox mentioned, you can make an Automator service for speaking text:

There is a bug in 10.8 and 10.7 where the shortcuts for Automator services don't always work until you hover over the services menu from the menu bar.
WorkflowServiceRunner can also use over 100% CPU when speaking text.

I have used FastScripts to assign a shortcut to this script:

try -- if the clipboard is empty, trying to get it results in an error
    set old to the clipboard as record
end try
    tell application "System Events" to keystroke "c" using command down
    delay 0.05
    set input to the clipboard
        set the clipboard to old
    end try
    say input using "Kyoko"
end try

Another option is to just run something like pbpaste | say -v kyoko.

share|improve this answer

Using a custom service with the standard Speak Text action to speak selected text with a specific alternative voice has one major drawback, as detailed in Mikofox's answer:

You cannot easily stop playback the way you can with the built-in TTS service simply by pressing the keyboard shortcut again.

There are two solutions:

Disclosure: I created the prepackaged services and the voices CLI

  • Build a custom service with a Run Shell Script action instead, in which you use the say CLI, which allows implementing a playback toggle (stopping speech if invoked while still speaking from previous invocation)

    • See below for a simple implementation that works, but it won't honor any custom speaking rates (words per minute) that you may have configured for individual voices via System Preferences.
    • A solution that honors the custom speaking rates requires quite a bit more work; you can find a prepackaged service here; or use the direct download link (will stay current)..
  • Alternatively, create a service that switches the default voice on demand, which then allows you to use the built-in TTS service with its playback toggle feature.

    • While OSX offers no programmatic way to change the default voice, you can use a prepackaged service built on the voices CLI:
      Follow the instructions here or use the direct download link (will stay current).

Simple implementation of a service with playback toggle:

As stated, this won't honor custom speaking rates configured for the chosen voice.

  • Create a new service in Automator
  • Leave the defaults (service receives text in any application)
  • Add a Run Shell Script action and paste the following:
 # Specify the voice to speak with.
#  ------- END: CUSTOMIZE

  # If `say` is running, we assume that a previous invocation is still speaking  
  # and speaking should be *stopped*.
  # Caveat: This will only work if either the original app from which speaking was initiated is still
  #         frontmost with text selected, or, coincidentally, a now different frontmost app also has
  #         text selected. Otherwise, this service won't be active.
pgrep -x say && { pkill -x say; exit; }

  # Read the text to speak into a variable.

  # Speak, using the standard `say` CLI.
say -v "$voice" "$txt"
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.