← Chrome 153 reference

v153 · dev trial · web api · speech

SpeechRecognition­Result Timestamps (WebSpeech API)

Limited availability

  • Chrome · developer trial 153, behind a flag
  • Edge · not separately reported
  • Firefox · no signal
  • Safari · no signal

Not its own Baseline entry: the host speech-recognition web-feature is Baseline limited (queried 2026-07-29), and these two attributes are a new flag-gated addition on top of it. There is no BCD key for either attribute (the file covers only length, item(), isFinal, verified 2026-07-29); the compat table below is an interim, non-BCD compilation.

Two nullable attributes — audioStartTime and audioEndTime on SpeechRecognitionResult — that report the start and end of the source-audio segment a recognition result was transcribed from, in milliseconds relative to the time origin. They let applications align captions with a media timeline and measure on-device speech-recognition latency so they can fail over to a cloud backend before users notice lag.

Developer trial — API surface may move

The milestone=153 listing files this feature under “In developer trial (Behind a flag)” (verified 2026-07-29; the listing is authoritative). The spec change, WICG/speech-api PR #192, is open and unmerged, so attribute names and semantics can still change in review. There is no origin trial: the runtime flag record for WebSpeechTimestamps is status: experimental with no public: true (so there is no chrome://flags entry) and no origin_trial_feature_name. To test locally:

chrome --enable-blink-features=WebSpeechTimestamps

Feature-detect before relying on the attributes — when the flag is off, they do not exist on the interface at all:

const supported = 'audioStartTime' in SpeechRecognitionResult.prototype;

at a glance

What it isTwo read-only nullable attributes, audioStartTime and audioEndTime, added to SpeechRecognitionResult; each reports a boundary of the audio segment that produced the result, as a DOMHighResTimeStamp in milliseconds relative to the time origin
GranularityPer recognition result (segment-level), not per word. Chromium's speech pipeline carries per-word hypothesis-part offsets internally (TimingInformation in speech_recognition.mojom), but this feature exposes only the two segment bounds on the result object
NullabilityBoth attributes return null when the underlying recognition engine does not provide segment timestamps — by design, so applications can detect unsupported engines rather than read a fabricated value
Privacy clampValues are quantized to 2 ms precision before reaching script (floor to a 2 ms multiple) — implemented in Chromium (FuzzTimestamp) and required by the spec PR's privacy section
Milestone listingChrome 153 — In developer trial (Behind a flag) (listing, verified 2026-07-29; the Intent to Prototype records “Target DevTrial: M153”)
Runtime featureWebSpeechTimestamps (experimental, not public, no origin trial) in runtime_enabled_features.json5; implementation CL 8129198 merged 2026-07-28
WPTNo dedicated tests: the wpt/speech-api directory (27 files, listed 2026-07-29) has no timestamp test and no reference to audioStartTime
ChromeStatus5811907077472256 — SpeechRecognitionResult Timestamps (WebSpeech API) (blink component Blink>Speech; tracking bug crbug.com/528037568)
Source: WICG/speech-api PR #192; speech_recognition_result.idl; chromestatus.com/feature/5811907077472256

why it exists

The Web Speech API has always been a “black box” about timing: a SpeechRecognitionResult tells you what was recognized, but nothing about when in the audio it was recognized. The explainer frames two concrete problems this creates:

Two segment timestamps per result answer both: caption tools get cue bounds, and latency-sensitive apps can compare audioEndTime with the event's delivery time to compute how far behind the engine is running (see measuring latency).

Source: explainer — Problem; Intent to Prototype — Motivation

how it works

  1. The recognition engine (on-device SODA, or a remote service) processes audio and emits results tagged with timing information. In Chromium's speech pipeline the engine reports a TimingInformation struct per result: audio_start_time (“start time in audio time from the start of the SODA session” — the amount of audio input) and audio_end_time (“elapsed processed audio from first frame after preamble”).
  2. Blink constructs each SpeechRecognitionResult with those optional bounds (speech_recognition.cc passes result->audio_start_time / audio_end_time into SpeechRecognitionResult::Create). This applies to interim (provisional) results as well as final ones — the aggregation path in speech_recognition.cc builds both from the same struct, so live-caption use cases get timestamps on interim hypotheses too.
  3. When script reads audioStartTime/audioEndTime, Blink returns null if the engine supplied no value, otherwise the value floored to a 2 ms multiple (FuzzTimestamp in speech_recognition_result.cc) before it crosses the binding layer.
  4. The application reads the bounds on each result event, aligns text to its media timeline, or derives processing latency (below).
Source: speech_recognition.mojom — TimingInformation; speech_recognition.cc; speech_recognition_result.cc

measuring latency

The explainer's flagship pattern: because both the result timestamps and Event.timeStamp are relative to the same time origin, subtracting audioEndTime from the event's timeStamp yields the processing lag between when the audio ended and when the result was delivered:

const processingLatencyMs = event.timeStamp - result.audioEndTime;

An application can watch that value and fail over to a cloud backend when it breaches a threshold (the explainer uses 1500 ms as an example). Two honest caveats: the measure includes binding/IPC delivery time, not pure engine time; and the 2 ms quantization floors both attributes, so latencies below ~2 ms are not resolvable — irrelevant in practice for a failover threshold measured in hundreds of milliseconds.

Source: explainer — Proposed Behavior & Example Usage

syntax

Proposed spec IDL (WICG/speech-api PR #192, open — quoted verbatim):

partial interface SpeechRecognitionResult {
    readonly attribute DOMHighResTimeStamp? audioStartTime;
    readonly attribute DOMHighResTimeStamp? audioEndTime;
};

Shipping Chromium IDL (speech_recognition_result.idl at trunk, 2026-07-29 — quoted verbatim, including the runtime gate):

[
    LegacyNoInterfaceObject
] interface SpeechRecognitionResult {
    readonly attribute unsigned long length;
    getter SpeechRecognitionAlternative item(unsigned long index);
    readonly attribute boolean isFinal;
    [RuntimeEnabled=WebSpeechTimestamps] readonly attribute DOMHighResTimeStamp? audioStartTime;
    [RuntimeEnabled=WebSpeechTimestamps] readonly attribute DOMHighResTimeStamp? audioEndTime;
};

The two attributes are the entire surface: no new methods, no options, no events. SpeechRecognitionAlternative (transcript, confidence) is unchanged — timestamps live on the result, not on each alternative hypothesis.

Source: PR #192 diff; speech_recognition_result.idl; speech_recognition_alternative.idl

reference

examples

Live captioning with latency-based failover (adapted from the explainer):

const recognition = new SpeechRecognition();
recognition.continuous = true;
recognition.interimResults = true;

recognition.onresult = (event) => {
  const result = event.results[event.resultIndex];

  if (result.audioEndTime !== null) {
    // How far behind the audio is the engine?
    const processingLatencyMs = event.timeStamp - result.audioEndTime;

    if (processingLatencyMs > 1500) {
      console.warn(`ASR lag detected (${processingLatencyMs}ms) — failing over to cloud`);
      switchToCloudBackend();
    }
  }
};

recognition.start();

Aligning a caption to a media timeline (the audio source is a <video> element routed into recognition):

recognition.onresult = (event) => {
  for (let i = event.resultIndex; i < event.results.length; i++) {
    const result = event.results[i];
    if (result.isFinal && result.audioStartTime !== null) {
      cues.push({
        start: result.audioStartTime / 1000,  // ms → s for VTTCue
        end:   result.audioEndTime   / 1000,
        text:  result[0].transcript,
      });
    }
  }
};
Live example from the Chrome Platform Showcase (route HEAD-checked 200, 2026-07-29). Sibling concept demos: capability probe and caption timeline. Note the demo needs a speech-recognition engine that supplies segment timestamps plus the runtime flag.Source: chrome-platform-showcase
Source: first example adapted from the explainer; second example is gendn-derived from the documented cue-alignment use case (labelled accordingly)

browser compatibility

Interim table. There is no BCD key for audioStartTime/audioEndTime (the file covers only length, item(), isFinal, verified 2026-07-29) and a webstatus.dev query returns no feature for the attributes. Rows below are compiled from the linked primary sources, not from BCD.

BrowserSupportEvidence
Chrome / Edge (Chromium)Developer trial 153 — behind WebSpeechTimestamps (experimental, not public)milestone=153 listing; flag record; CL 8129198
FirefoxNo signal (and no SpeechRecognitionResult support at all per BCD)ChromeStatus API record vendor views; BCD
SafariNo signal (supports the prefixed host API since 14.1 per BCD, not these attributes)ChromeStatus API record vendor views; BCD

For reference, BCD records the host interface SpeechRecognitionResult as Chrome 33+, Safari 14.1+ (prefixed lineage), Firefox never — the attributes above ship independently of that baseline.

Source: BCD api/SpeechRecognitionResult.json; chromestatus.com/feature/5811907077472256

security and privacy

The quantization in concrete terms:

// Engine reports:   audio_start_time = 1234.5678 ms
// Attribute reads:  result.audioStartTime === 1234   (floored to a 2 ms multiple)
// Engine absent:    result.audioStartTime === null   (no fuzzing applied)
Source: PR #192 privacy clause; explainer — Security and Privacy Considerations; speech_recognition_result.cc

specifications

DocumentStatus
WICG/speech-api PR #192 — Update SpeechRecognitionResult with audio timing attributesOpen, unmerged (fetched 2026-07-29) — adds the two attributes plus the mandatory fuzzing clause; the normative text this page quotes
Explainer — SpeechRecognitionResult timestamps (alanding@google.com, evliu@google.com)Merged into WICG/speech-api 2026-07-14/15; the motivation, usage pattern, and alternatives-considered record. (The Intent to Prototype links the same files on the WebAudio/web-speech-api fork.)
Web Speech API (community report / ED)Host specification; does not yet contain the attributes (0 occurrences of audioStartTime, verified 2026-07-29) — PR #192 must merge first
blink-dev — Intent to Prototype: SpeechRecognitionResult TimestampsPosted 2026-07-16 by Alan Ding; records “Target DevTrial: M153”, tracking bug 528037568; no review replies on the thread at fetch time
Source: repository and thread contents fetched 2026-07-29

see also