Synchronizing data sent over sound beeps with Goertzel Detection, C#
You can't simply skip ahead some amount of time, and won't be able to skip ahead when decoding in real time.

You need to simply decode as the values come in, and switch your output depending on what comes in.  Change states only on input changes.
So, like this:


Feed input signal into the bank of goertzel filters,  the detected tone is the filter output that goes over a defined limit.
When detected tone changes to 12kHz, set message start flag
When detected tone changes to 13khz, send output bit 1
When detected tone changes to 14kHz, send output bit 0
When detected tone changes to 10kHz, end of message.
Repeat from step 1 until end of message.


Working that way, you should stay synchronized and have fewer errors.  You should also be able to shorten the beep lengths, though you may need to work with the length of the Goertzel filters to make it work with shorter beeps.

You will find that you will have to make a compromise between the length of the beeps, the length of the goertzel filter, and the separation between the individual tones in order to get fast, reliable communication.

To get faster communication, you will need shorter filters which in turn require larger separation between the tones to get reliable detection.

What you are doing is called frequency shift keying (FSK,) and has been used to transmit data over audio paths for a long time.

Noise will always be a problem.  There are two ways to fight it, and you might have to use them both.
First, you make your goertzel filters as long as possible, but still short enough to react within your desired bit rate.
Second, most systems encode the data with checksums.  Checksum codes can be used that allow you to recover from bit errors - they don't just say "bad data," they can also say "bad data, bit X should be value Z."  There are of course limits.  The better the checksum and error correction, the more extra information you have to send, so the slower your effective data rate.

A third thing you could do is to lower the data rate and extend the length of the goertzel filters, but you are already running a very low rate.