Question

Is there a way to use the MS Speech utility from command line? I can do it on a mac, but can't find any reference to it on Windows XP.

Thanks.

Was it helpful?

Solution

I don't think there's a command line tool for it, but someone wrote one:

http://krolik.net/post/Say-exe-a-simple-command-line-text-to-speech-program-for-Windows.aspx

OTHER TIPS

My 2 cents on the topic, command line one-liners:

  • on Win using PowerShell.exe

    PowerShell -Command "Add-Type –AssemblyName System.Speech; (New-Object System.Speech.Synthesis.SpeechSynthesizer).Speak('hello');"
    
  • on Win using mshta.exe

    mshta vbscript:Execute("CreateObject(""SAPI.SpVoice"").Speak(""Hello"")(window.close)")
    
  • on OSX using say

    say "hello"
    
  • Ubuntu Desktop (>=2015) using native spd-say

    spd-say "hello"
    
  • on any other Linux

  • on Raspberry Pi, Win, OSX using Node-Red

    npm i node-red-contrib-sysmessage

There's a nice open source program that does what you're asking for on Windows called Peter's Text to Speech available here: http://jampal.sourceforge.net/ptts.html

It contains a binary called ptts.exe that will speak text from standard input, so you can run it like this:

echo hello there | ptts.exe

Alternatively, you could use the following three line VBS script to get similar basic TTS:

'say.vbs
set s = CreateObject("SAPI.SpVoice")
s.Speak Wscript.Arguments(0), 3
s.WaitUntilDone(1000)

And you could invoke that from the command line like this:

cscript say.vbs "hello there"

If you go the script route, you'll probably want to find some more extensive code examples with a variable timeout and error handling.

Hope it helps.

rem The user decides what to convert here
 :input
 cls
 echo Type in what you want the computer to say and then press the enter key.
 echo.
 set /p text=

 rem Making the temp file
 :num
 set num=%random%
 if exist temp%num%.vbs goto num
 echo ' > "temp%num%.vbs"
 echo set speech = Wscript.CreateObject("SAPI.spVoice") >> "temp%num%.vbs"
 echo speech.speak "%text%" >> "temp%num%.vbs"
 start temp%num%.vbs
 pause
 del temp%num%.vbs
 goto input



pause

If you can't find a command you can always wrap the System.Speech.Synthesis.SpeechSynthesizer from .Net 3.0 (Don't forget to reference "System.Speech")

using System.Speech.Synthesis;

namespace Talk
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var ss = new SpeechSynthesizer())
                foreach (var toSay in args)
                    ss.Speak(toSay);
        }
    }
}

There is a powershell way also:

Create a file called speak.ps1

param([string]$inputText)
Add-Type –AssemblyName System.Speech 
$synth = New-Object System.Speech.Synthesis.SpeechSynthesizer
$synth.Speak($inputText);

Then you can call it

.\speak.ps1 "I'm sorry Dave, I'm afraid I can't do that"

Your best approach is to write a small command line utility that will do it for you. It would not be a lot of work - just read text in and then use the ms tts library.

Another alternative is to use Cepstral. It comes with a nice command line utility and sounds light years better than the ms tts.

There's also Balabolca: http://www.cross-plus-a.com/bconsole.htm It has a command line tool balcon.exe. You can use it like this:

  1. List voices:

    balcon.exe -l
    
  2. Speak file:

    balcon.exe -n "IVONA 2 Jennifer" -f file.txt
    
  3. Speak from the command-line:

    balcon.exe -n "IVONA 2 Jennifer" -t "hello there"
    

More command line options are available. I tried it on Ubuntu with SAPI5 installed in Wine. It works just fine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top