Скрипт гибридного Batch-VBS TTS не работает - PullRequest
0 голосов
/ 02 июня 2018

Я пытался сделать гибридный сценарий Batch-VBS из сценария VBS, который я уже сделал.Это дало бы inputBox, а использовало бы результаты sapi.spvoice.Speak.Я попытался превратить его в пакетный скрипт (ниже), но он не работает, и tts.vbs содержит только sapi.Speak message.


Пакетный сценарий:

@echo off
:start
cls
echo Batch Text-To-Speech
echo By SudDaBuilder
:: echo Fixed by %YourNameHere% ::
set /p msg=What do you want your PC to say? 
set /p vce=Choose a Voice (0 - Male, 1 - Female) 
pause
cls
echo Dim message, sapi, voice > tts.vbs
echo message=%msg% > tts.vbs
echo voice=%vce% > tts.vbs
echo Set sapi=CreateObject("sapi.spvoice") > tts.vbs
echo with sapi > tts.vbs
echo Set .voice = .getvoices.item(voice) > tts.vbs
echo .Volume = 100 > tts.vbs
echo end with > tts.vbs
echo sapi.Speak message > tts.vbs
cscript tts.vbs
cls
pause

:again
cls
set /p retry=Again? (y/n) 
if %retry% == y goto start
goto end

:end
echo See you soon!
ping localhost > nul

Ответы [ 3 ]

0 голосов
/ 02 июня 2018

Просто заключите свое эхо в (кодовый блок), который перенаправлен в файл.
Тогда код будет намного легче прочитать.
Чтобы не завершать блок кода преждевременно,
закрывающие скобки внутринеобходимо экранировать с помощью каретки ^)

( echo Dim message, sapi, voice
  echo message=%msg%
  echo voice=%vce%
  echo Set sapi=CreateObject("sapi.spvoice"^)
  echo with sapi
  echo Set .voice = .getvoices.item(voice^)
  echo .Volume = 100
  echo end with
  echo sapi.Speak message
)  > tts.vbs

Гибрид real состоит из IMO только одного файла.Это также возможно, но требует обработки параметров через аргументы строки cmd.

0 голосов
/ 02 июня 2018

Вы можете встроить код непосредственно в пакетный скрипт без , используя временный файл.Это увеличит скорость скрипта, так как не будет никаких операций ввода-вывода:

<!-- : BATCH
    @echo off
    :start
    cls
    echo Batch Text-To-Speech
    echo By SudDaBuilder
    :: echo Fixed by %YourNameHere% ::
    set /p msg=What do you want your PC to say? 
    set /p vce=Choose a Voice (0 - Male, 1 - Female) 

    pause

    cscript //nologo "%~f0?.wsf" %msg% %vce%

    :again
    cls
    set /p retry=Again? (y/n) 
    if %retry% == y goto start
    goto end

    :end
    echo See you soon!
    ping localhost > nul
    exit /b %errorlevel%



BATCH : --->

<job><script language="VBScript">

Dim message, voice

message=WScript.Arguments.Item(0)
voice=WScript.Arguments.Item(1)

'WScript.Echo(voice & "--" & message) 

set sapi = CreateObject("SAPI.SpVoice") 
with sapi 
 Set .voice = .getvoices.item(voice) 
  '.Volume = 100
end with

sapi.Speak( message)

 </script></job>

Вы даже можете использовать голосовые объекты sp в одной строке:

@echo off

set /p "to_say=enter a text :"

mshta "javascript:code(close((V=(v=new ActiveXObject('SAPI.SpVoice')).GetVoices()).count&&v.Speak('%to_say%')))"
0 голосов
/ 02 июня 2018

`>` должен стать `>>` начиная с двенадцатой строки и далее.

Почему?
Символ > перезаписывает содержимое файла и добавляет конкретное содержимое, поэтому вытолько в конечном итоге получить последнюю строку.Принимая во внимание, что символы >> добавляются в указанной строке в конец содержимого файла.
Вам также необходимо заключить в кавычки переменные msg и vce.


Исправлен скрипт:

@echo off
:start
cls
echo Batch Text-To-Speech
echo By SudDaBuilder
:: echo Fixed by SO Suda ::
set /p msg=What do you want your PC to say? 
set /p vce=Choose a Voice (0 - Male, 1 - Female) 
pause
cls
echo Dim message, sapi, voice > tts.vbs
:: THIS IS THE TWELFTH LINE ::
echo message="%msg%" >> tts.vbs
echo voice="%vce%" >> tts.vbs
echo Set sapi=CreateObject("sapi.spvoice") >> tts.vbs
echo with sapi >> tts.vbs
echo Set .voice = .getvoices.item(voice) >> tts.vbs
echo .Volume = 100 >> tts.vbs
echo end with >> tts.vbs
echo sapi.Speak message >> tts.vbs
cscript //NoLogo tts.vbs
cls
pause

:again
cls
:: ADDED A DELETE FOR THE tts.vbs FILE::
del tts.vbs
set /p retry=Again? (y/n) 
if %retry% == y goto start
goto end

:end
echo See you soon!
ping localhost >> nul
...