• Which the release of FS2020 we see an explosition of activity on the forun and of course we are very happy to see this. But having all questions about FS2020 in one forum becomes a bit messy. So therefore we would like to ask you all to use the following guidelines when posting your questions:

    • Tag FS2020 specific questions with the MSFS2020 tag.
    • Questions about making 3D assets can be posted in the 3D asset design forum. Either post them in the subforum of the modelling tool you use or in the general forum if they are general.
    • Questions about aircraft design can be posted in the Aircraft design forum
    • Questions about airport design can be posted in the FS2020 airport design forum. Once airport development tools have been updated for FS2020 you can post tool speciifc questions in the subforums of those tools as well of course.
    • Questions about terrain design can be posted in the FS2020 terrain design forum.
    • Questions about SimConnect can be posted in the SimConnect forum.

    Any other question that is not specific to an aspect of development or tool can be posted in the General chat forum.

    By following these guidelines we make sure that the forums remain easy to read for everybody and also that the right people can find your post to answer it.

interested?

Messages
9
Country
denmark
½nHi. Generally i am seeking some help too a maybe huge project.

Background, i am coming from flight gear, am almost blind so have TTs, or as it is called too text too speech on all my computers, in flight gear we fixed instrumentation with taking the numbers out from different variables when you pressed a key, it could be f, for speed l for vertical speed k for pitch, and j for bank, you get the picture. H for heading.

I realize this may be a bit of a mouthful, but well i know next to nothing about windows so well, here i am. :)

My questions would be i think, can you get the numbers from some of the sim variables and paste them on?

If Perl can run on windows, there might be an solution.

I realize this will be a bit of a project, and rome was not build on one day, as they say, so it is not a matter of having a fixed timeline.

Ideally there are some areas that might be interesting to set speech on, the Atc menu, the gps menu, interaction with Ils Vor, Multiplayerchat. and interactions with that. But keep in mind i have no idea if that can be done.

Another feature would be, being able to line up with an untoward runway, and or follow taxi ways too the right runway.

I will obviously be a part of this, it is not like , i tell you to do this and that and sit back and watch.

I have the same thing with money as Roles-royce have regarding Horswpower, it is not something you remotely discuss, they are there when you need them.

FSX have lots of menus in the plane, it would be nice if we could find a way to interact with them, but again, I'm clueless.

I will explain how we did it in flight gear, and then if you are interested i can send you the files, with the speech thing and xml keys and nas files.

We started out having fixed times on speak outcalls from throttle heading and altitude and pitch, i believe, we fast found out that was not ideal listening to that all of the time. I mean at long streaches you could be having your Ap on where fast interaction with the heading was not needed, at other times when i was flying the Su-27 the speech callouts was many and, fast.

So we found out that we could make it so when i pressed a key, it could be f for speed, it would say a number, fx, 40 and that would be the airspeed the plane was flying with,

when i was checking altitude it would say the altitude, and then the material under the plane at that moment, it would say runway when it detected one.

I hope one of you will take the time to tell me if this is a total waste of time.

have a nice day

Sandi
 
Assigning keystrokes to selected flight data variables and sending them to Windows' text-to-speech engine should be possible, but requires C++ coding and SimConnect knowledge. The latter is used in FSX to communicate with external applications.

ATC instructions are verbalized by default. For interactions vis keystrokes, an external speech-to-text tool may be used.

There also is a "read stuff on screen aloud" tool for the visually impaired in Windows, but I don't know if it works with FSX' menus.

So it is generally possible to adapt FSX to your impairment, but why would you want to risk all the effort in the first place when you have an already working Flight Gear setup?


By the way: Examples from FlightGear are next to useless since both simulators do things quite differently from each other. Just like Linux and Windows.
 
I can probably help with this. As Bjoern points out, for Flight Simulator variables, it is a matter of retrieving data through SimConnect and passing it to the Windows Text-to-Speech engine.
I believe it is possible to capture menu actions - I will have a look at this.
 
Hi, first of all, I'm not sure sending it to windows native speech engine is a good idea, reason, the voice is bad for very fast interactions.

We tried using macs inbuilt speech and i will assure you that we got a very hot mac computer. With flight gear that is, remember i have to press key, listen , and react. For you becuae your brain have not adapted to that kind of fast speech that might take seconds, for me it goes faster. But still you don't want the speak to doodle about:)

Atc is verbal yes, but the default Atc have menus i have to select things out from too get the relevant data to sent too ms, Atc. if i am correct. no?

that could be done by say you are in the menu you press 1 but before you send the 1 press you wanna find out what it do, so you press ctrl 1 and it gets send too the external speech.

I have not checked narrator, i should properly do that :)

Why do i want this? after 10 years it is time to try new things, but there are more that uses fx, more planes, and so on.

In FG we took numbers out from the relevant variables for rpm temp, etc. Of course it goes with out saying that you would have to know what the number meant, but you would know that to start with right? :)

DDawson, you aint the only who will look into sim connect, i will too.

A really dirty hack could be passing it directly into a texfile and have tail send it on to Espeak, I believe i can use that from the cmd prompt. I shall investigate.
 
Hi, it looks to be the correct one you have, yes.

I imagine something like this, set it out in a text file for starters at least. I know speak on mac can natively accept pipes, i would imagine windows can as well?

so the thing i would end up in the cmd prompt would look something like this tail -f -n1 textile >speak and some other parameters.

I said that the inbuilt speech was not a good idea, the reason is , that if you have a lot of noise in the simulator. it Have the potential to become a problem, or so i think.

I usually have the simulator engine sound relative loud why? you can better feel the vibrations through the laptop as the rpm changes.

Duing flight in FSX, can you look at properties changing?

it could be the for radial, or Ils needle.



best

Sandi
 
Here is the list of variables available. You will see that it is quite comprehensive.
https://msdn.microsoft.com/en-us/library/cc526981.aspx
Information can be retrieved as frequently as every FS frame.

If you have a headset that you can connect, we can send audio information to it, rather than to the computer's speakers. This might make it easier to hear over the noise of the engines. Come to think of it, I guess that's why headsets are used in real world aircraft...

I have a suggestion for an input device.
http://gaming.logitech.com/en-ca/product/g13-advanced-gameboard
It gives you 24 programmable keys without sacrificing the availability of the keys on the computer's regular keyboard. You can either map keystrokes or groups of keystrokes to the keys, or you can capture the key presses directly.
If you just want to use the computer's own keyboard, we can of course do that too.

Doug
 
Hi, yes i saw some of the variables earlier today, never guessed that was so many.

Lets see. bank pitch, heading airspeed, altitude. Material under plane, if it can be done. in the other sim it says, "runway" when it is over the runway,

I tried to use a unix tool made for windows today, and it seems that if you use that for trapping the text that should work, have a little trouble finding speak so may end up installing it as a stand alone installation, let me worry about that unless you wanna use that ell file you talked about earlier.

i think for the most operations i hit the different keys 2 maybe 3 times a second, depending on the plane i am flying.

lets leave the headset for a start , we can work that out later if needed. I am trying to think about how we did interact with the radio in flight gear, i do believe i use the telnet connection to inter the frets,

like 111.70 for the ild for ksfo.

Ill mess some more with speak, i know my computer ought to have it,

I am going to show you the variables we use for instrumentation from the flight gear thing , so may we see if we can find something that is the same in Fx.







var speak = {

init : func {

me.UPDATE_INTERVAL = 0.0;

me.SEND_TIME = 0.10;

var festival = props.globals.getNode("/sim/sound/voices/enabled");

if ((festival != nil) and festival.getValue()) {

me.output_node = props.globals.getNode("/sim/messages/copilot");

me.clear_output = 0;

} else {

me.output_node =

props.globals.getNode("/sim/text-to-speech/input", 1);

me.clear_output = 1;

}

me.loopid = 0;

me.last = 0;

me.send_buf = [];

me.reset();

print("Speak .. initialized");

},

say : func(msg) {

if (me.output_node == nil) return;

if (io.stat("/tmp/say-busy") != nil) return;

var t = systime();

if (((t - me.last) > me.SEND_TIME) and (size(me.send_buf) == 0)) {

me.output_node.setValue(msg);

me.last = t;

} else {

append(me.send_buf, msg);

}

},

reset : func {

me.loopid += 1;

me._loop_(me.loopid);

},

update : func {

if (getprop("/sim/audio-cues/heading/enabled")) {

var v = getprop("/instrumentation/nav/heading-needle-deflection");

setprop("/sim/audio-cues/heading/pitch", v < 0 ? 0.1 : 0.5);

setprop("/sim/audio-cues/heading/volume", abs(v));

}

# Check send buffer.

if (me.output_node == nil) return;

var t = systime();

if ((t - me.last) > me.SEND_TIME) {

if (size(me.send_buf) > 0) {

me.output_node.setValue(me.send_buf[0]);

me.send_buf = subvec(me.send_buf, 1);

me.last = t;

} else {

# Nothing new to send. Reset the send property.

if (me.clear_output) me.output_node.setValue("");

}

}

},

_loop_ : func(id) {

id == me.loopid or return;

me.update();

settimer(func { me._loop_(id); }, me.UPDATE_INTERVAL);

}

};

setlistener("/sim/signals/fdm-initialized", func {

speak.init();

});

###############################################################################

## Some readout loops.

var enabled = !getprop("/inaccessible");

var primary = func {

if (enabled) {

speak.say("roll " ~ int(getprop("/orientation/roll-deg")) ~ " " ~

"pitch " ~ int(getprop("/orientation/pitch-deg")) ~ " " ~

"speed " ~ int(getprop("/velocities/airspeed-kt"))

);

}

settimer(primary, 928.0);

}

var secondary = func (i) {

var next = i;

if (enabled) {

if (i==0) {

speak.say("alt " ~ int(getprop("/position/altitude-ft")));

next = 1;

}

if (i==1) {

speak.say("heading " ~

int(getprop("/orientation/heading-magnetic-deg")));

next = 0;

}

if (i==2) {

speak.say( " " ~

int(100*getprop("/controls/engines/engine/throttle")));

next = 0;

}

}

settimer(func { secondary(next); }, 919.0);

}



setlistener("/sim/signals/fdm-initialized", func {

settimer(func {

primary();

secondary(0);

}, 2.0);

props.globals.getNode("/autopilot/settings/heading-bug-deg", 1).

setValue(0);

});

###############################################################################

## Useful readout functions to be called from e.g. keyboard handlers.

## State / Environment

var heading = func {

speak.say(" " ~ int(getprop("/orientation/heading-magnetic-deg")));

}

var gps1 = func {

speak.say("WP: " ~ getprop("/instrumentation/gps/wp/wp[1]/name"));

}

var roll2 = func {

speak.say(" " ~ int(getprop("/orientation/roll-deg")));

}

var rpm = func {

speak.say(" " ~ int(getprop("/sim/motor/rpm")));

}

var stall = func {

speak.say(" " ~ int(getprop("/instrumentation/gps/wp/wp[1]/bearing-mag-deg")));

}

var yar = func {

speak.say(" " ~ int(getprop("/orientation/yaw-rate-degps")));

}

var vertical = func {

speak.say(" " ~ int(getprop("/instrumentation/vertical-speed-indicator/indicated-speed-fpm")));

}

var nav2 = func {

speak.say(" " ~ int(getprop("/instrumentation/nav/heading-needle-deflection")));

}

var pitch2 = func {

speak.say(" " ~ int(getprop("/orientation/pitch-deg")));

}

var speed2 = func {

speak.say(" " ~ int(getprop("/velocities/airspeed-kt")));

}

var map_texture = func(texture) {

var mapped = "";

if (find("taxiway", texture) >= 0) {

mapped = "taxiway";

} elsif (texture == "pc_tiedown") {

mapped = "concrete";

} elsif (texture == "pa_tiedown") {

mapped = "asphalt";

} else {

var prefix = substr(texture, 0, 3);

if (prefix == "pc_" or prefix == "pa_") {

mapped = "runway";

} else {

mapped = texture;

}

}



return mapped;

}

var ground_below = func {

var info = geodinfo(getprop("/position/latitude-deg"),

getprop("/position/longitude-deg"));

var type = "";

if (info[1] != nil) {

type = map_texture(info[1].names[0]);

} else {

type = "ground";

}

speak.say("Alt " ~ int(getprop("/position/altitude-agl-ft")) ~

" " ~

type ~ "."

);

}

var terrain_radar = func {

var texture = getprop("/instrumentation/air-ground-radar/terrain-warning/hit/material");

if (texture == "") {

speak.say("Radar scope clear");

} else {

var range = int(getprop("/instrumentation/air-ground-radar/terrain-warning/hit/range-m"));

speak.say("Radar target " ~ map_texture(texture) ~ ", range " ~ range ~ " meters");

}

}

## Flight controls

var throttle = func {

speak.say("throttle " ~

int(100*getprop("/controls/engines/engine/throttle")));

}

## Aircraft systems

var KAP140_mode = func {

var text = "";

text = text ~ "AP mode: ";

if (getprop("/autopilot/KAP140/annunciators/rol")) {

text = text ~ "ROL";

}

if (getprop("/autopilot/KAP140/annunciators/hdg/state")) {

var b = getprop("/autopilot/settings/heading-bug-deg");

if (typeof(b) == "scalar")

text = text ~ "HDG " ~ int(b);

else

text = text ~ "HDG 0";

}

if (getprop("/autopilot/KAP140/annunciators/vs")) {

text = text ~ " Vertical " ~

int(-58000 *

getprop("/autopilot/KAP140/settings/target-pressure-rate"));

}

speak.say(text);

}

var ILS = func {

if (!getprop("/instrumentation/nav/data-is-valid") or

!getprop("/instrumentation/nav/in-range") or

!getprop("/instrumentation/nav/has-gs")) return;

var text = "ILS:";

text = text ~ " Glide " ~

int(getprop("/instrumentation/nav/gs-needle-deflection"));

text = text ~ " Heading " ~

int(getprop("/instrumentation/nav/heading-needle-deflection"));

if (getprop("/instrumentation/dme/in-range")) {

text = text ~ " DME " ~

int(1*getprop("/instrumentation/dme/indicated-distance-nm"))/1;

}

speak.say(text);

}

var VOR = func {

if (!getprop("/instrumentation/nav/data-is-valid") or

!getprop("/instrumentation/nav/in-range")) return;

var text = "VOR:";

text = text ~ " Heading " ~

int(getprop("/instrumentation/nav/heading-deg"));

if (getprop("/instrumentation/dme/in-range")) {

text = text ~ " DME " ~

int(1*getprop("/instrumentation/dme/indicated-distance-nm"))/1;

}

speak.say(text);

}



forget the first speaks only the keyboard callouts are important, ill go and look at the needle thing,i could swear we used nav 1 but yay.

Sandi

ps forgot something.

-->

<PropertyList>

<input>

<keyboard>

<nasal>

<script>

var chat_pos = 0;

var cq_id = 0;

</script>

</nasal>

<key n="17">

<name>Ctrl-Q</name>

<desc>Repeat chat messages</desc>

<binding>

<command>nasal</command>

<script>

chat_pos += 1;

(func(x) {

settimer(func {

x == cq_id or return;

var msg = split("\n", getprop("/sim/multiplay/chat-history"));

if (chat_pos > size(msg))

chat_pos = size(msg);

setprop("/sim/sound/voices/ai-plane", msg[-chat_pos]);

chat_pos = 0;

}, 1, 1)

})(cq_id += 1)

</script>

</binding>

</key>

<key n="21">

<name>Ctrl-U</name>

<desc>Readout pilotinfo</desc>

<binding>

<command>nasal</command>

<script> pilots.info()</script>

</binding>

</key>

<key n="99">

<name>c</name>

<desc>Readout nearest-pilot</desc>

<binding>

<command>nasal</command>

<script> pilots.next()</script>

</binding>

</key>

<key n="18">

<name>ctrl-r</name>

<desc>Readout altitude-pilot</desc>

<binding>

<command>nasal</command>

<script> pilots.altitude()</script>

</binding>

</key>

<key n="3">

<name>ctrl-c</name>

<desc>Readout bearing-pilot</desc>

<binding>

<command>nasal</command>

<script> pilots.bearing()</script>

</binding>

</key>

<key n="24">

<name>ctrl-x</name>

<desc>Readout stall</desc>

<binding>

<command>nasal</command>

<script>speak.stall()</script>

</binding>

</key>



<key n="100">

<name>d</name>

<desc>Throttle boost</desc>

<binding>

<command>nasal</command>

<script>controls.incThrottle(1)</script>

</binding>

<mod-up>

<binding>

<command>nasal</command>

<script>controls.incThrottle(-1)</script>

</binding>

</mod-up>

</key>

<key n="102">

<name>f</name>

<desc>Readout speed.</desc>

<binding>

<command>nasal</command>

<script>speak.speed2()</script>

</binding>

</key>

<key n="101">

<name>e</name>

<desc>Readout gps.</desc>

<binding>

<command>nasal</command>

<script>speak.gps1()</script>

</binding>

</key>

<key n="104">

<name>h</name>

<desc>Readout heading.</desc>

<binding>

<command>nasal</command>

<script>speak.heading()</script>

</binding>

</key>

<key n="105">

<name>i</name>

<desc>Readout ILS.</desc>

<binding>

<command>nasal</command>

<script>speak.ILS()</script>

</binding>

</key>

<key n="111">

<name>o</name>

<desc>Readout VOR.</desc>

<binding>

<command>nasal</command>

<script>speak.VOR()</script>

</binding>

</key>

<key n="122">

<name>z</name>

<desc>Readout set nearest airport on gps.</desc>

<binding>

<command>nasal</command>

<script>setprop("/instrumentation/gps/wp/wp[1]/get-nearest-airport", "true");</script>

</binding>

</key>

<key n="73">

<name>I</name>

<desc>Toggle ILS tone</desc>

<binding>

<command>property-toggle</command>

<property>/sim/audio-cues/heading/enabled</property>

</binding>

</key>

<key n="106">

<name>j</name>

<desc>Readout roll2.</desc>

<binding>

<command>nasal</command>

<script>speak.roll2()</script>

</binding>

</key>

<key n="107">

<name>k</name>

<desc>Readout pitch2.</desc>

<binding>

<command>nasal</command>

<script>speak.pitch2()</script>

</binding>

</key>

<key n="108">

<name>l</name>

<desc>Readout pitch2.</desc>

<binding>

<command>nasal</command>

<script>speak.vertical()</script>

</binding>

</key>

<key n="114">

<name>r</name>

<desc>Say rpm</desc>

<repeatable type="bool">false</repeatable>

<binding>

<command>nasal</command>

<script>speak.rpm()</script>

</binding>

</key>

<key n="116">

<name>t</name>

<desc>Readout throttle setting.</desc>

<binding>

<command>nasal</command>

<script>speak.throttle()</script>

</binding>

</key>

<key n="117">

<name>u</name>

<desc>Readout ground type below and altitude AGL.</desc>

<binding>

<command>nasal</command>

<script>speak.ground_below()</script>

</binding>

</key>

<key n="120">

<name>x</name>

<desc>Readout nav2.</desc>

<binding>

<command>nasal</command>

<script>speak.nav2()</script>

</binding>

</key>





</keyboard>

</input>

<nasal>

<speak>

<file>Local/speak.nas</file>

</speak>

</nasal>

<sim>

<audio-cues>

<heading>

<enabled type="bool">false</enabled>

</heading>

</audio-cues>

</sim>

</PropertyList>

I just come to think of this, if we don't wanna use speak we can write directly too nvda, which is the screenreader, if you wanna try that let me know.
 
Sorry to butt in but if you use the code /code brackets it will be easier to read and copy.
Just trying to help. :wave:

Code:
var speak = {

init : func {

me.UPDATE_INTERVAL = 0.0;

me.SEND_TIME = 0.10;

var festival =props.globals.getNode("/sim/sound/voices/enabled");

if ((festival != nil) and festival.getValue()) {

me.output_node = props.globals.getNode("/sim/messages/copilot");

me.clear_output = 0;

} else {

me.output_node =

props.globals.getNode("/sim/text-to-speech/input", 1);

me.clear_output = 1;

}

me.loopid = 0;

me.last = 0;

me.send_buf = [];

me.reset();

print("Speak .. initialized");

},

say : func(msg) {

if (me.output_node == nil) return;

if (io.stat("/tmp/say-busy") != nil) return;

var t = systime();

if (((t - me.last) > me.SEND_TIME) and (size(me.send_buf) == 0)) {

me.output_node.setValue(msg);

me.last = t;

} else {

append(me.send_buf, msg);

}

},

reset : func {

me.loopid += 1;

me._loop_(me.loopid);

},

update : func {

if (getprop("/sim/audio-cues/heading/enabled")) {

var v = getprop("/instrumentation/nav/heading-needle-deflection");

setprop("/sim/audio-cues/heading/pitch", v < 0 ? 0.1 : 0.5);

setprop("/sim/audio-cues/heading/volume", abs(v));

}

# Check send buffer.

if (me.output_node == nil) return;

var t = systime();

if ((t - me.last) > me.SEND_TIME) {

if (size(me.send_buf) > 0) {

me.output_node.setValue(me.send_buf[0]);

me.send_buf = subvec(me.send_buf, 1);

me.last = t;

} else {

# Nothing new to send. Reset the send property.

if (me.clear_output) me.output_node.setValue("");

}

}

},

_loop_ : func(id) {

id == me.loopid or return;

me.update();

settimer(func { me._loop_(id); }, me.UPDATE_INTERVAL);

}

};

setlistener("/sim/signals/fdm-initialized", func {

speak.init();

});

###############################################################################

## Some readout loops.

var enabled = !getprop("/inaccessible");

var primary = func {

if (enabled) {

speak.say("roll " ~ int(getprop("/orientation/roll-deg")) ~ " " ~

"pitch " ~ int(getprop("/orientation/pitch-deg")) ~ " " ~

"speed " ~ int(getprop("/velocities/airspeed-kt"))

);

}

settimer(primary, 928.0);

}

var secondary = func (i) {

var next = i;

if (enabled) {

if (i==0) {

speak.say("alt " ~ int(getprop("/position/altitude-ft")));

next = 1;

}

if (i==1) {

speak.say("heading " ~

int(getprop("/orientation/heading-magnetic-deg")));

next = 0;

}

if (i==2) {

speak.say( " " ~

int(100*getprop("/controls/engines/engine/throttle")));

next = 0;

}

}

settimer(func { secondary(next); }, 919.0);

}



setlistener("/sim/signals/fdm-initialized", func {

settimer(func {

primary();

secondary(0);

}, 2.0);

props.globals.getNode("/autopilot/settings/heading-bug-deg", 1).

setValue(0);

});

###############################################################################

## Useful readout functions to be called from e.g. keyboard handlers.

## State / Environment

var heading = func {

speak.say(" " ~ int(getprop("/orientation/heading-magnetic-deg")));

}

var gps1 = func {

speak.say("WP: " ~ getprop("/instrumentation/gps/wp/wp[1]/name"));

}

var roll2 = func {

speak.say(" " ~ int(getprop("/orientation/roll-deg")));

}

var rpm = func {

speak.say(" " ~ int(getprop("/sim/motor/rpm")));

}

var stall = func {

speak.say(" " ~int(getprop("/instrumentation/gps/wp/wp[1]/bearing-mag-deg")));

}

var yar = func {

speak.say(" " ~ int(getprop("/orientation/yaw-rate-degps")));

}

var vertical = func {

speak.say(" " ~ int(getprop("/instrumentation/vertical-speed-indicator/indicated-speed-fpm")));

}

var nav2 = func {

speak.say(" " ~ int(getprop("/instrumentation/nav/heading-needle-deflection")));

}

var pitch2 = func {

speak.say(" " ~ int(getprop("/orientation/pitch-deg")));

}

var speed2 = func {

speak.say(" " ~ int(getprop("/velocities/airspeed-kt")));

}

var map_texture = func(texture) {

var mapped = "";

if (find("taxiway", texture) >= 0) {

mapped = "taxiway";

} elsif (texture == "pc_tiedown") {

mapped = "concrete";

} elsif (texture == "pa_tiedown") {

mapped = "asphalt";

} else {

var prefix = substr(texture, 0, 3);

if (prefix == "pc_" or prefix == "pa_") {

mapped = "runway";

} else {

mapped = texture;

}

}



return mapped;

}

var ground_below = func {

var info = geodinfo(getprop("/position/latitude-deg"),

getprop("/position/longitude-deg"));

var type = "";

if (info[1] != nil) {

type = map_texture(info[1].names[0]);

} else {

type = "ground";

}

speak.say("Alt " ~ int(getprop("/position/altitude-agl-ft")) ~

" " ~

type ~ "."

);

}

var terrain_radar = func {

var texture = getprop("/instrumentation/air-ground-radar/terrain-warning/hit/material");

if (texture == "") {

speak.say("Radar scope clear");

} else {

var range = int(getprop("/instrumentation/air-ground-radar/terrain-warning/hit/range-m"));

speak.say("Radar target " ~ map_texture(texture) ~ ", range " ~ range ~ " meters");

}

}

## Flight controls

var throttle = func {

speak.say("throttle " ~

int(100*getprop("/controls/engines/engine/throttle")));

}

## Aircraft systems

var KAP140_mode = func {

var text = "";

text = text ~ "AP mode: ";

if (getprop("/autopilot/KAP140/annunciators/rol")) {

text = text ~ "ROL";

}

if (getprop("/autopilot/KAP140/annunciators/hdg/state")) {

var b = getprop("/autopilot/settings/heading-bug-deg");

if (typeof(b) == "scalar")

text = text ~ "HDG " ~ int(b);

else

text = text ~ "HDG 0";

}

if (getprop("/autopilot/KAP140/annunciators/vs")) {

text = text ~ " Vertical " ~

int(-58000 *

getprop("/autopilot/KAP140/settings/target-pressure-rate"));

}

speak.say(text);

}

var ILS = func {

if (!getprop("/instrumentation/nav/data-is-valid") or

!getprop("/instrumentation/nav/in-range") or

!getprop("/instrumentation/nav/has-gs")) return;

var text = "ILS:";

text = text ~ " Glide " ~

int(getprop("/instrumentation/nav/gs-needle-deflection"));

text = text ~ " Heading " ~

int(getprop("/instrumentation/nav/heading-needle-deflection"));

if (getprop("/instrumentation/dme/in-range")) {

text = text ~ " DME " ~

int(1*getprop("/instrumentation/dme/indicated-distance-nm"))/1;

}

speak.say(text);

}

var VOR = func {

if (!getprop("/instrumentation/nav/data-is-valid") or

!getprop("/instrumentation/nav/in-range")) return;

var text = "VOR:";

text = text ~ " Heading " ~

int(getprop("/instrumentation/nav/heading-deg"));

if (getprop("/instrumentation/dme/in-range")) {

text = text ~ " DME " ~

int(1*getprop("/instrumentation/dme/indicated-distance-nm"))/1;

}

speak.say(text);

}
 
I now have a working prototype, using the Windows Text-to-Speech API. It is quite generic - it reads the keys to be monitored, along with the corresponding variables and units of measure from a configuration file.
I will have a look at eSpeak and modify the program to make use of it. I also need to add specific case exceptions for a few of the variables. You will see that some have a unit of measure called enum. You will be more interested in the value represented by the returned integer than the actual numeric value itself.
I expect it makes sense to put a few controls relating to the text-to-speech API into the program. I was thinking it would be handy to be able to control the volume of the sounds with keystrokes.
Once I've got something for you to try, I'll send you a private message with a link.

Doug
 
I now have a working prototype, using the Windows Text-to-Speech API. It is quite generic - it reads the keys to be monitored, along with the corresponding variables and units of measure from a configuration file.
I will have a look at eSpeak and modify the program to make use of it. I also need to add specific case exceptions for a few of the variables. You will see that some have a unit of measure called enum. You will be more interested in the value represented by the returned integer than the actual numeric value itself.
I expect it makes sense to put a few controls relating to the text-to-speech API into the program. I was thinking it would be handy to be able to control the volume of the sounds with keystrokes.
Once I've got something for you to try, I'll send you a private message with a link.

Doug




when you say read keys
do you mean it like, f for speed in nots?

oses i can try it on are, xp, and windows 7
 
when you say read keys
do you mean it like, f for speed in nots?
oses i can try it on are, xp, and windows 7

Yes, because the assignments are done with a configuration file, you can assign any key or combination of keys to any variable you wish. In FSX, all of the keys on the keyboard are assigned commands by default, so you will have to do some thinking about which keys you want to keep active for FSX itself and which you want to use for retrieving information through the speech interface. This was why I suggested the Logitech G13. Between FSX key assignments you want to keep, and the ones you want to use for the speech interface, you are most likely going to find yourself short on available key assignments. If you've got a reasonably complete home cockpit setup, this maybe isn't an issue.
 
when you say read keys
do you mean it like, f for speed in nots?

oses i can try it on are, xp, and windows 7
 
okay, well for the planes i will start with it should not be a huge problem.

What i am more in doubt about is, how i will interact with the radio and gps, and see engine temps , and so on.

I don't have a home cockpit yet, but am planning on it as i move up through the planes, starting with the j3, moving too the 172 182, and so on.

the way i plan to do it is assign variables to some of the keys, for the cessna for example.

I guess i am not sure how the engine controls oil pressure temp and so on is being viewed, but if it is an variable, i can assign a key to it and listen to the number as i press it.

Lets take the j3

It doesn't have many engine controls, so that one is easy, i am thinking if i can put a gps on, and interact with it i can use that as a flying aid?

When if i can see it is grass i am flying over i can set the plane down, Msatc might be a challenge, i have not found any good documentation for that yet.

sandi
 
Hi, stupid question maybe, but once you send the link, how do i install the thing ?

best Sandi
 
It is an in-process dll. It runs inside the FSX address space. You/me/we will modify the FSX's dll.xml file so that the dll is loaded when FSX starts.
We could create a separate application to do this, rather than a dll, but that would prevent access to the GPS variables. I keep meaning to write a named pipe server for FSX but never seem to get around to it.
 

okies, so right now as i understand it , it can read the variables, does FSX have a for example telnet connection so you can set the nav radio that way?

I am not exactly sure how to handle DLL files, but I'm sure i can learn, xml files, i know how to open, more or less :)

you said the other day that you had it working wit hthe inbuilt speech that windows uses?

If you have something i can run i vote for trying that , unless if you have other. ideas.



best

Sandi
 
Back
Top