The way I see it there are two different aspects to this: The amount of command phrases sent to the speech engine, and the amount of commands in your profile.
The latter can be reduced to a single command, if that's easier to maintain for you. The former cannot be reduced without relying on freeform dictation to get the number, which is much less accurate.
What Tkael is proposing is to replace a static list of many different distance/time combinations with a formula that calculates the required time for any given distance on-the-fly instead.
That would mean you can have a single command that does all the work, without having to rely on a long conditional tree to set the pause time.
A basic conditional tree-based command could be something like
Travel [1..400,1000] light seconds
Execute command, 'Set Speed To 0% - Keybinding' (and wait until it completes)
Begin Text Compare : [{CMDSEGMENT:1}] Equals '1000'
Set decimal [~travelTime] value to 2,00000
Set Text [~travelTimeText] to '2 seconds'
Else If Text Compare : [{CMDSEGMENT:1}] Equals '23000'
Set decimal [~travelTime] value to 264.00000
Set Text [~travelTimeText] to '4 minutes'
Else If Text Compare : [{CMDSEGMENT:1}] Equals '400000'
Set decimal [~travelTime] value to 20000,00000
Set Text [~travelTimeText] to '5 hours and 30 minutes'
End Condition
Say, 'Setting speed for {CMDSEGMENT:1} light seconds. This trip will take about {TXT:~travelTimeText}.' (and wait until it completes)
Execute command, 'Set Speed To 100% - Keybinding' (and wait until it completes)
Pause a variable number of seconds [~travelTime]
Say, 'We are almost at our destination, Reducing speed'
Execute command, 'Set Speed To 75% - Keybinding' (and wait until it completes)
Where you'd add an "Else If" block for each distance.
Especially if you can work out a formula, you'd also want to dynamically speak the time; An inline function would probably work best for that(converting the seconds to a TimeSpan and determining whether hours, minutes, or seconds is the correct suffix by checking whether the former two are 0 could work).
EDIT: An inline function that will accomplish the above:
using System;
public class VAInline
{
public void main()
{
TimeSpan travelTime = TimeSpan.FromSeconds(Convert.ToDouble(VA.GetDecimal("~travelTime")));
if (travelTime.Hours != 0)
{
VA.SetText("~travelTimeText", String.Format("{0:%h} hours and {0:%m} minutes", travelTime));
}
else if (travelTime.Minutes != 0)
{
VA.SetText("~travelTimeText", String.Format("{0:%m} minutes", travelTime));
}
else
{
VA.SetText("~travelTimeText", String.Format("{0:%s} seconds", travelTime));
}
}
}
So the command would instead be something like
Execute command, 'Set Speed To 0% - Keybinding' (and wait until it completes)
Begin Text Compare : [{CMDSEGMENT:1}] Equals '1000'
Set decimal [~travelTime] value to 2,00000
Else If Text Compare : [{CMDSEGMENT:1}] Equals '23000'
Set decimal [~travelTime] value to 264.00000
Else If Text Compare : [{CMDSEGMENT:1}] Equals '400000'
Set decimal [~travelTime] value to 20000,00000
End Condition
Inline C# Function: Seconds to human time, wait until execution finishes
Say, 'Setting speed for {CMDSEGMENT:1} light seconds. This trip will take about {TXT:~travelTimeText}.' (and wait until it completes)
Execute command, 'Set Speed To 100% - Keybinding' (and wait until it completes)
Pause a variable number of seconds [~travelTime]
Say, 'We are almost at our destination, Reducing speed'
Execute command, 'Set Speed To 75% - Keybinding' (and wait until it completes)