Far-Field Speech Recognition

Short answer. Far-field recognition fails for two reasons that need different fixes. Distance costs level: sound drops 6 dB every time the distance doubles, so moving a microphone from 0.3 m to 4 m loses 22.5 dB of SNR. Reverberation smears time: reflections arrive after the direct sound and overlap the next phoneme. Level loss can be partly recovered with gain. The smearing cannot, because it is a change to the signal rather than to its volume.

How to do it

The level problem is arithmetic

Sound spreads as a sphere, so intensity falls with the square of distance. Doubling the distance divides the power by four, which is 6 dB. That is the whole inverse-square law, and it is why a microphone at 4 m in a quiet room works with roughly the same SNR as a microphone at 0.3 m in a room 22 dB noisier.

The consequence for data collection is that near-field and far-field recordings are not interchangeable and cannot be converted into each other. Amplifying a far-field recording raises speech and noise together; it does not add the SNR that distance removed.

The reverberation problem is not arithmetic

Every reflection off a wall, a ceiling or a table arrives later than the direct sound, so each phoneme is still arriving while the next one starts. In a room with a 0.8 s reverberation time, a 0.10 s burst of speech stays within 30 dB of its peak for about 0.30 s — three times its own length.

That is why dereverberation is harder than denoising. Noise is a separate signal you can estimate and subtract. Reverberation is the signal you want, convolved with the room, and separating the two requires a model of the room.

The metrics that describe it

C50 is the ratio of energy arriving in the first 50 ms to energy arriving after it, in decibels. A high C50 means the direct sound dominates and the room is not smearing much. In the run below, C50 falls from 16.6 dB to 6.4 dB as RT60 goes from 0.2 s to 1.2 s, while the direct-to-reverberant ratio only moves from 3.7 dB to 1.4 dB. Both describe the room, and C50 is the more sensitive of the two.

RT60 is the time for sound to decay 60 dB after the source stops. It describes the room. C50 and the direct-to-reverberant ratio describe what the microphone actually heard, which is what the model has to work with.

What to specify when buying far-field data

Distance range, room type, and RT60 if it was measured. Array or single microphone, and the array geometry if there is one. Whether talkers were seated or moving. Whether other people were in the room and whether their speech was transcribed.

  • "Far-field" alone is not a specification. A 2 m recording in a treated meeting room and a 2 m recording in a tiled kitchen are different products with different model implications.
  • Distance is the cheapest metadata to record and the one most often missing.
  • Overlapping background speech has to be labeled as transcribed or not, or the transcript will look wrong when it is not.

Code

Compute the inverse-square level loss with distance, then build synthetic room impulse responses at four reverberation times and measure C50 and burst smearing from each.

import numpy as np

SR = 16000
REF_DIST = 0.3
REF_SNR = 30.0

print("inverse-square level loss and the SNR it leaves behind")
print(f"{'distance':>10}{'loss':>10}{'SNR left':>11}")
for d in (0.3, 0.6, 1.0, 2.0, 4.0):
    loss = 20 * np.log10(d / REF_DIST)
    print(f"{d:>9.1f}m{loss:>9.1f}dB{REF_SNR - loss:>10.1f}dB")


def rir(rt60, sr=SR, seed=0):
    """Direct path, four early reflections, then a diffuse tail that grows with rt60."""
    r = np.random.default_rng(seed)
    n = int(rt60 * sr)
    h = np.zeros(n)
    h[0] = 1.0
    for delay_ms, gain in ((8, 0.45), (15, -0.30), (24, 0.22), (37, -0.15)):
        h[int(delay_ms / 1000 * sr)] += gain
    tail = r.standard_normal(n) * np.exp(-6.91 * np.arange(n) / (rt60 * sr))
    tail[:int(0.04 * sr)] = 0.0
    return h + tail * np.sqrt(0.30 * rt60 / (tail ** 2).sum())


def c50_db(h, sr=SR, ms=50):
    k = int(ms / 1000 * sr)
    e = h ** 2
    return 10 * np.log10(e[:k].sum() / (e[k:].sum() + 1e-12))


print(f"\n{'RT60':>7}{'direct-to-reverb':>19}{'C50':>9}")
for rt60 in (0.2, 0.4, 0.8, 1.2):
    h = rir(rt60, seed=int(rt60 * 100))
    dr = 10 * np.log10(h[0] ** 2 / ((h ** 2).sum() - h[0] ** 2))
    print(f"{rt60:>6.1f}s{dr:>17.1f}dB{c50_db(h):>8.1f}dB")

burst = np.hanning(int(0.10 * SR))
print("\na 0.10 s burst, measured as the time its energy stays within 30 dB of the peak:")
for rt60 in (0.1, 0.4, 0.8, 1.2):
    env = np.sqrt(np.convolve(np.convolve(burst, rir(rt60, seed=int(rt60 * 100))) ** 2,
                              np.ones(160) / 160, mode='same'))
    above = np.flatnonzero(20 * np.log10(env / env.max() + 1e-12) > -30)
    print(f"  RT60 {rt60:>3.1f}s  ->  {(above[-1] - above[0]) / SR:.2f} s")
  • numpy only. The impulse responses are synthetic, so the RT60 values are what the model was built to have rather than measurements of a real room.
  • Distance: 0.3 m to 4 m is 22.5 dB of loss, which takes a 30 dB SNR down to 7.5 dB before any noise is added.
  • The last block is the point. A 0.10 s burst stays within 30 dB of its peak for 0.13 s in a 0.1 s room and 0.48 s in a 1.2 s room. A tenth of a second of sound smears across nearly half a second, and no amount of gain undoes that.

Where this goes wrong

Treating far-field as a gain problem

Normalizing a far-field recording to the level of a near-field one makes the two look similar in a waveform viewer and leaves them completely different to a model. The model sees a signal whose phonemes overlap, and that overlap is the part gain cannot touch. Level is recoverable; the reverb tail is not.

Measuring SNR with the wrong noise segment

In a far-field recording, room tone during a pause and the noise under speech are different numbers, and a far-field corpus is usually specified with the second. Using the pause as the noise reference overstates the noise and understates the SNR.

Collecting far-field audio without room metadata

A far-field dataset without distance, room type and RT60 cannot be stratified, and you will not be able to tell whether a failure is distance, reverberation or noise. Metadata is cheap at collection time and impossible to add later, because the room is gone by the time anyone asks.

Assuming a microphone array removes the problem

Beamforming improves the direct-to-reverberant ratio but does not eliminate reverberation, and the improvement depends on the talker being where the beam points. A model trained on beamformed audio fails on a single-microphone device.

Mixing near-field and far-field without labels

A pooled corpus that is 70% near-field trains a model that performs well on average and poorly on the condition you care about. Keep the conditions labeled and report metrics per condition.

When to buy the data instead of building the pipeline

Buy when the room is the product. Real far-field data requires recording in real rooms at measured distances with metadata that only exists if someone wrote it down at the time. Buy when you need babble from other talkers, because overlapping background speech is expensive to stage and expensive to annotate. Build it yourself when you can control the environment — a treated room with a fixed array and cooperative speakers is a recording session, not a sourcing problem. Ask for RT60 and distance per file, not per batch.

How buying training data works →

More technical reference

All technical reference →

Need data for Far-Field Speech Recognition?

Tell us the language, the hours, and what the data needs to look like. You will get a real number and a real timeline — not a range. If we cannot source it well, we will tell you that instead.

  • Pilot batch before the full run, so problems surface early.
  • Consent documentation delivered with the data.
  • No medical or clinical data. No recorded telephone calls.

We reply within two business days. Your details are used only to answer this request. See our privacy policy.

Contact

Talk to a human

Send a specification and we will come back with a real number and timeline.

Submit a sourcing request

Or email hello@linguacorpus.com