On the Menu bar, under Tools --> Options... --> checkbox "Speak all text (via SAPI)", you can turn a computer voice on/off. Is there a way to run a script to do this during the game? Would be a cool sound effect...
oh wow, quest can use the Speech-API too?! That's so cool! I don't know much of computer-system/microsoft stuff, but I found code to just access the Speech-API, to get your computer to 'talk', hehe.
(If you understand/know more about the Speech-API, I would love some help in learning more in how to use it and etc!)
I don't think the game itself even knows if that feature is being used or not.
(I tried to figure this out once before, but I didn't try very hard, so, I may be mistaken.)
I'm trying to make speak.js work, but
importScripts don't seem to work correctly because they need to import files from the local drive, which I don't believe is going to happen unless I wrap all this in
JS.eval() or come up with some funky
ASLEvent which allows me to use
I changed the script so
speakWorker equaled the
onmessage() function from the file from which the script was trying to read (speakWorker.js), but that threw an error about
postMessage() being undefined, which is where I am currently stuck.
I added the script from speakWorker.js to speakClient.js, and that didn't seem to effect anything.
One problem (I think):
speakWorker = new Worker('speakWorker.js');
The other problem (I think):
If this could be modified to work, you could just enter
JS.speak('Hello, Quest Forum!') (or whatever else you wanted to 'say').
Dirty tricks + speak.js + Lots of free time = http://textadventures.co.uk/games/view/bwilf7iehecgchbiixexwq/speaking-with-js
It doesn't really turn on SAPI, but it reads whatever I tell it to read in a similar voice.
[REQUIRES AN INTERNET CONNECTION, BUT "WORKS" IN EITHER WEB OR DESKTOP PLAYER.]
Okay... This is extremely dirty.
I made an .html file:
<!DOCTYPE html> <html> <head> <script src="speakClient.js"></script> </head> <body> <div id="audio"></div> <script> speak("Greetings, Adventurer! Welcome to the game! You can enter HELP if you require assistance!"); </script> </body> </html>
I zipped it up along with speakClient.js, speakGenerator.js, and Worker.js, which I downloaded from the link to speak.js in the above post. Then, I submitted that zipped file as a game.
Then, I made this game:
<!--Saved by Quest 5.7.6404.15496--> <asl version="550"> <include ref="English.aslx" /> <include ref="Core.aslx" /> <game name="Speaking with JS"> <gameid>9d039dd2-2842-4221-bb28-0f396a5a37dc</gameid> <version>1.0</version> <firstpublished>2017</firstpublished> </game> <object name="room"> <inherit name="editor_room" /> <description type="script"><![CDATA[ msg ("<iframe id='speakDiv' width='0' height='0' src='http://media.textadventures.co.uk/games/2wHZlJ6i-kWuIdZek09HfA/index.html'></iframe>") JS.eval ("$('#speakDiv').hide();") msg ("You should hear the voice in a few moments. (It won't read the text from the screen. ...but, it might later, after a little work.)") ]]></description> <object name="player"> <inherit name="editor_object" /> <inherit name="editor_player" /> </object> </object> </asl>
Now, I must learn how to modify those JS scripts so all required functions are accessible without importing files. That way, it won't be dependent upon the uploaded HTML 'game'.
I shall return.
You can open up Audacity (which can be found here) and switch Windows WASAPI to
Speakers to record whatever your PC is putting out.
So, I hit "RECORD" on that, then opened my web page. Now, I have the audio file of the text being read by speak.js, which I can include in the game and bypass the extra web page.
I'm still working on getting the JS to work in the game.
I don't believe the problem is insurmountable.
Is this sort of answering the question, or have I gotten too far off track? (It's cool with me either way. I'm just making sure I'm not cluttering up the thread with things which aren't helpful. (Hehehe.))
Are you wanting a computer voice to read exactly what you tell it to read (be it room descriptions or whatever else you decide)? Or are you wanting to actually switch SAPI on and off during play?
Thank you again, KV, for all your experimenting. It's hard for me to reply as I'm just trying to understand what you're doing. I didn't need to actually turn SAPI on/off; I just wanted a computer voice to speak the text that I wanted.
Oh, okay. We're rockin' and rollin', then.
..and it's no problem, really. I like to help (and to learn), so it's all gravy!
I'm trying to understand what I'm doing, too! (Ha-ha! )
speak.js is a thing someone else created, which is available from GitHub
We can include JS files in Quest, just like libraries, but things don't quite work right sometimes.
If the speak.js functions all worked properly, we could just put
JS.speak("Welcome to the game, Adventurer!"), and the SAPI voice would say that.
I couldn't get it to work inside a Quest game, so I opened up Notepad++ and created an .html file (posted above), which includes the .js files required for speak.js (the ones that Quest doesn't like). This HTML page calls
speak('Greetings, Adventurer! Blah, blah, blah...'). When the page loads, the SAPI voice reads the dialog.
I named that HTML file index.html, then I zipped it up with the three required .js files from speak.js.
I uploaded that zipped file to this site as a game. (It's only a web page that 'reads' my dialog in the SAPI voice.)
I created an actual Quest game, with an iframe element, the source of which is the HTML game's URL, which I just got when I submitted that zip file.
I used JS in Quest to hide the iframe element, but the sound still plays.
I opened Audacity and switched the recording device from the system's microphone to the system's speakers.
I pressed RECORD in Audacity and opened up the HTML page, which read the text aloud in the SAPI voice.
I flipped back to Audacity and exported the audio file as an .ogg, named sapi_dialog1.ogg.
Now, I can just play this file instead of using an iframe, and there's no need to link to an external webpage.
I haven't uploaded the version that uses the .ogg. What's online still has the iframe which loads an external page for the sound.
I still plan to make the JS work inside of Quest, so we can just enter
speak("BWAHAHAHAHA! The princess is in another castle!").
What I think the problem is:
Usually typing things out forces me to get a better grasp on what it is I'm doing, but not this time. (Sorry. Hehehe.)
This is a great synopsis of what you just did, and very understandable to a layperson such as myself. Thanks for your efforts. I guess my initial question was if there was an "easy" way to have the computer voice in a game, the answer being "no" (haha).