Звуковые эффекты в сценариях
Ковыряю такую вещь, нигде толком не описанную
разве что вот здесь единственное более-менее внятное объяснение [URL="http://www.railunion.net/forum53/topic10420.html"]http://www.railunion.net/forum53/topic10420.html[/URL] в сценарии можно воспроизводить аудиозапись, привязав к определенному событию (например проезд маркера) в Stevens Pass таким образом сделаны говорящие детекторы неисправностей поезда, осуществляющие контроль нагрева букс, и контроль верхнего и нижнего габарита ПС (аналог наших ПОНАБ и УКСПС) при проезде устройства, оно передает на локомотив синтезированную голосовую запись о наличии/отсутствии дефектов у прошедшего подвижного состава, а также количество осей в составе. это позволяет делать сценарии более жизненными и интерактивными (теоретически, возможна и выдача голосовой информации о неисправностях ) странность в том что в TS2014 это напрямую не реализовано, а разработчики сделали это весьма корявым способом - через расширение погодных эффектов (WeatherExtension). таким же образом , как воспроизводятся звуки грома, дождя и тд в сценариях с меняющейся погодой. Чтобы активировать эту возможность , придется немного попотеть. Чтобы понять как это работает, я расковырял несколько сценариев из воркшопа, где задействована эта фишка. 1) вставить в скрипт сценария активацию событий смены погоды пример скрипта: [PHP] function OnEvent ( event ) -- Instruction triggers --------------------------- -- Timed triggers --------------------------- if event == "MP1735" then SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1735" ) return TRUE end if event == "MP1740" then SysCall ( "WeatherController:SetCurrentWeatherEventChain", "DetMP1740" ) return TRUE end return FALSE end [/PHP] вкратце что здесь делается. MP1735, MP1740 - это имена событий привязанные к маркерам пути в сценарии (названы по номеру пикета/километражу, название может быть любым ). эти имена нужно прописать в свойство TriggerEventSuccess у путевого маркера, при проезде которого будет срабатывать событие. код вышеуказанного скрипта по имени события вызывает эффект погоды из файла расширения WeatherExtension далее, чтобы добавить расширение погоды к сценарию, нужно вручную отредактировать файл ScenarioProperties.xml изначально там было вот что: никакого расширения не задано [PHP] <WeatherExtensionBlueprint> <iBlueprintLibrary-cAbsoluteBlueprintID> <BlueprintSetID> <iBlueprintLibrary-cBlueprintSetID> <Provider d:type="cDeltaString"></Provider> <Product d:type="cDeltaString"></Product> </iBlueprintLibrary-cBlueprintSetID> </BlueprintSetID> <BlueprintID d:type="cDeltaString"></BlueprintID> </iBlueprintLibrary-cAbsoluteBlueprintID> </WeatherExtensionBlueprint> [/PHP] мы там прописываем ссылку на наш собственный файл расширения погоды как-то так собственно Tour.xml это и есть файл расширения погодных эффектов находится он в папке Assets в подкаталоге принадлежащей конкретному маршруту. audio это относительный путь внутри ассетов маршрута. в данном случае это путь папка_игры\Assets\GNTX\Stevens Pass\audio путь папки маршрута в явном виде не задается а определяется через имя провайдера и продукта. [PHP] <WeatherExtensionBlueprint> <iBlueprintLibrary-cAbsoluteBlueprintID> <BlueprintSetID> <iBlueprintLibrary-cBlueprintSetID> <Provider d:type="cDeltaString">GNTX</Provider> <Product d:type="cDeltaString">StevensPass</Product> </iBlueprintLibrary-cBlueprintSetID> </BlueprintSetID> <BlueprintID d:type="cDeltaString">audio\Tour.xml</BlueprintID> </iBlueprintLibrary-cAbsoluteBlueprintID> </WeatherExtensionBlueprint> [/PHP] сам файл расширения погоды имеет довольно загадочную и недокументированную структуру. я его просто скопипастил из существующего, и перезаписал нужные мне строчки для активации аудиовоспроизводящих маркеров там есть такие записи [PHP] <cTriggeredWeatherEventChain d:id="7896"> <Name d:type="cDeltaString">DetMP1776</Name> <BlendOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</BlendOutTime> <LoopMode d:type="cDeltaString">eStop</LoopMode> <TimedWeatherEvent> <cWeatherTypeEvent d:id="7901"> <WeatherType d:type="ref">7145</WeatherType> <Duration d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Duration> </cWeatherTypeEvent> </TimedWeatherEvent> <LocationEvent> <cLocationWeatherEvent d:id="7905"> <Name d:type="cDeltaString">MP1776</Name> <Delay d:type="sFloat32" d:alt_encoding="000000A09999B93F" d:precision="string">0.1</Delay> <AudioControllerName d:type="cDeltaString">Det1776</AudioControllerName> <InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude> <InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude> <TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude> <TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude> <FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain> <HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset> <AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting> <AdditiveLightingColour> <cHcColour> <Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red> <Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green> <Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue> <Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha> </cHcColour> </AdditiveLightingColour> <Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration> <TextureID d:type="cDeltaString"></TextureID> <BottomLeftUV> <cRVector2> <X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X> <Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y> </cRVector2> </BottomLeftUV> <TopRightUV> <cRVector2> <X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X> <Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y> </cRVector2> </TopRightUV> <Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale> <FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime> <FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime> </cLocationWeatherEvent> <cLocationWeatherEvent d:id="7932"> <Name d:type="cDeltaString">Axle24</Name> <Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay> <AudioControllerName d:type="cDeltaString">24X</AudioControllerName> <InitialLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLongitude> <InitialLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</InitialLatitude> <TargetLongitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLongitude> <TargetLatitude d:type="sFloat64" d:alt_encoding="0000000000000000" d:precision="string">0</TargetLatitude> <FollowTerrain d:type="cDeltaString">eTrue</FollowTerrain> <HeightOffset d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</HeightOffset> <AdditiveLighting d:type="cDeltaString">eFalse</AdditiveLighting> <AdditiveLightingColour> <cHcColour> <Red d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Red> <Green d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Green> <Blue d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Blue> <Alpha d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Alpha> </cHcColour> </AdditiveLightingColour> <Duration d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Duration> <TextureID d:type="cDeltaString"></TextureID> <BottomLeftUV> <cRVector2> <X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X> <Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y> </cRVector2> </BottomLeftUV> <TopRightUV> <cRVector2> <X d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</X> <Y d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</Y> </cRVector2> </TopRightUV> <Scale d:type="sFloat32" d:alt_encoding="000000000000F03F" d:precision="string">1</Scale> <FadeInTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeInTime> <FadeOutTime d:type="sFloat32" d:alt_encoding="0000000000000000" d:precision="string">0</FadeOutTime> </cLocationWeatherEvent> </LocationEvent> </cTriggeredWeatherEventChain> [/PHP] нас собственно интересует это : [PHP]<Name d:type="cDeltaString">DetMP1776</Name>[/PHP] вот это ссылка на эффект погоды, вызываемый из скрипта через [PHP]"WeatherController:SetCurrentWeatherEventChain", "DetMP1735"[/PHP] то есть при проезде маркера с именем MP1735 будет проигрываться звуковой эффект под именем DetMP1735. далее, про синтезированную речь со счетом осей поезда. для этого внутри данного XML блока есть строчка Axle(число осей) и ниже еще раз это же число в виде 24X. [PHP] <Name d:type="cDeltaString">Axle24</Name> <Delay d:type="sFloat32" d:alt_encoding="000000604755D53F" d:precision="string">0.33333</Delay> <AudioControllerName d:type="cDeltaString">24X</AudioControllerName> [/PHP] подозреваю что возможности этого аудиоконтроллера намного больше, и он может синтезировать голосом не только число осей, но и другую информацию. к сожалению это нигде не задокументировано. |
зы я ошибся никакая речь там не синтезируется
там заранее записаны цифры для определенных длин состава - 24х, 36х, 190х соответственно если хочется подогнать под свой случай, нужно использовать ближайшее число |
Вообще мысль, по поводу синтеза речи, очень интересна. Даже есть программы-говорилки, там водишь текст и программа озвучивает его, вроде в Винде это реализовано стандартно. Я как-то ставил такую говорилку и на сайте Мелкософта скачивал звуковые библиотеки, ну там под разные голоса (мужские - женские), и под разные языки. Правда читают они без интонации , да и ударения не туда делают - но всё-равно приемлемо для слуха.
Да, такую "фишку" не плохо бы иметь для редактора сценариев. Ввёл к примеру текст в редакторе, а потом во время сценария, тебе вместо текстового сообщения на экран, вдруг голосом, какое-то распоряжение диспетчера.[img]http://arcanumclub.ru/smiles/smile166.gif[/img] |
теоретически это возможно если написать какой-то модуль расширения игры (в виде DLL) , в который скрипт будет подсовывать параметр в виде текстовой строки
я не знаю, допускает ли движок расширения бинарными программными модулями? в lua скрипт синтез речи не запихнешь, но библиотеки для C/C++ с подобными алгоритмами есть |
Мне кажется, что все-таки лучше будет в стороннем софте нормальных wav-ов насинтезировать и вставить в роут или сцену в виде маркеров.
|
Не-е, конечно на синтезировать можно, но тут теряется гибкость, так как, если потребуется неожиданно изменить сообщение, то опять потребуется синтезировать. Я имел ввиду, чтоб только ввёл нужный, произвольный текст в свойство правила, ну там где вводится текст выводимого сообщения, нажал скажем иконку "звук" (которой нет:D) и вовремя прохождения сценария, тебе вместо вывода текста - будет голосовое сообщение, приятным женским голосом (слегка побритым и немного выпившим баритоном);)
Можно и маркеры специальные добавить или использовать те, что есть. |
Текущее время: 13:12. Часовой пояс GMT +4. |
Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
© 2001-2019, Администраторы и разработчики Клуба Trainsim