Speak text with SAPI5 engine
Скрипт для чтения текста, заданного в коммандной строке, в текстовом файле или из буфера обмена (clipboard). Результат может быть сохранён в wav-файл.
Использует встроеннный Windows'ский голосовой движок 5-ой версии (TTS Engine SAPI5).
<?xml version="1.0" encoding="WINDOWS-1251"?> <job id="TypeLibExample"> <?job error="True" debug="True" ?> <runtime> <description>Speak text with SAPI5 engine</description> <named name="engine" helpstring="Speach Engine (name or index)" type="string" required="false" /> <named name="lang" helpstring="Language to use (409 - English, 419 - Russian (default) etc)" type="simple" required="false" /> <named name="time" helpstring="say current time" type="simple" required="false" /> <named name="clipboard" helpstring="say clipboard content" type="simple" required="false" /> <named name="file" helpstring="text file to read" type="string" required="false" /> <named name="out" helpstring="wav file to save results" type="string" required="false" /> <unnamed name="text" helpstring="text phrase to say" many="true" required="false" /> <example> Examples: sapi5.wsf /engine:Katerina /out:file.wav Hello World! sapi5.wsf /engine:"Speech Cube Russian (Nicolai 16Khz)" /time </example> </runtime> <script language="JavaScript"><![CDATA[ if (WScript.Arguments.length == 0) { WScript.Arguments.ShowUsage(); WScript.Quit(); } // // Command line argument parsing // var lang = WScript.Arguments.Named("lang") || 419; // Russian var engine = WScript.Arguments.Named("engine") || "ScanSoft Katerina_Full_22kHz"; var text = new Array(); if (WScript.Arguments.Named.Exists("time")) text.push(Time2String(new Date())); if (WScript.Arguments.Named.Exists("file")) text.push(WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments.Named("file"), 1).ReadAll()); if (WScript.Arguments.Named.Exists("clipboard")) text.push(WScript.CreateObject("htmlfile").parentWindow.clipboardData.getData("text")); for (var i=0; i<WScript.Arguments.Unnamed.Count; i++) text.push(WScript.Arguments.Unnamed(i)); // // Speach engine initiation: // var sv = WScript.CreateObject("SAPI.SpVoice"); sv.WaitUntilDone(-1); // Don't be loud sv.Voice = (new Enumerator(sv.GetVoices("Language="+lang,"Name="+engine))).item(); if (sv.Voice != null) sv.speak(text.join(' '),0); // // Finish // /** * Convert Date to the russian time string. * @param {Date} Date object */ function Time2String(date) { function dig2str (dig, is_female) { if ( dig%10 && dig > 20 ) { return dig2str(10 * Math.floor(dig/10)) + ' ' + dig2str(dig%10, is_female); // } switch (dig) { case 0 : return("ноль"); case 1 : return(is_female? "одна" : "один"); case 2 : return(is_female? "две" : "два"); case 3 : return("три"); case 4 : return("четыре"); case 5 : return("пять"); case 6 : return("шесть"); case 7 : return("семь"); case 8 : return("восемь"); case 9 : return("девять"); case 10 : return("десять"); case 11 : return("одинадцать"); case 12 : return("двенадцать"); case 13 : return("тринадцать"); case 14 : return("четырнадцать"); case 15 : return("пятнадцать"); case 16 : return("шестнадцать"); case 17 : return("семнадцать"); case 18 : return("восемнадцать"); case 19 : return("девятнадцать"); case 20 : return("двадцать"); case 30 : return("тридцать"); case 40 : return("сорок"); case 50 : return("пятьдесят"); case 60 : return("шестьдесят"); default : return("не знаю"); } } var hour = date.getHours(); var mins = date.getMinutes(); var arr = new Array(dig2str(hour)); if (hour > 20) hour %= 10; arr.push((hour==1) ? "час" : (hour==0 || hour>4)? "часов" : "часа" ); if (!mins) { arr.push('ровно'); } else { arr.push(dig2str(mins,true)); if (mins > 20) mins %= 10; arr.push((mins==1) ? "минута" : (mins==0 || mins>4)? "минут" : "минуты" ); } return arr.join(' '); } ]]></script> </job>
Page tags:
javascript
sapi
tts
wsh




















