)]}'
{"id": 5811907077472256, "name": "SpeechRecognitionResult Timestamps (WebSpeech API)", "summary": "The Web Speech API currently does not expose the acoustic timing bounds of recognized speech segments, making it difficult to associate transcribed text with media timelines or generate synchronized subtitle cues. We propose adding speechStartTime and speechEndTime (double, in seconds relative to stream start) attributes on the SpeechRecognitionResult interface.", "markdown_fields": [], "blink_components": ["Blink>Speech"], "star_count": 27, "search_tags": [], "created": {"by": "alanding@chromium.org", "when": "2026-07-13 22:38:10.359785"}, "updated": {"by": "alanding@chromium.org", "when": "2026-11-07 07:39:13.908411"}, "category": "Miscellaneous", "category_int": 2, "feature_notes": null, "web_feature": "speech-recognition", "is_official_web_feature": true, "webdx_usecounter_enum": null, "enterprise_feature_categories": [], "enterprise_product_category": 0, "is_releasenotes_content_reviewed": false, "is_releasenotes_publish_ready": false, "stages": [{"id": 5255845379178496, "created": "2026-07-13 22:38:11.519249", "feature_id": 5811907077472256, "stage_type": 110, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 6381745286021120, "created": "2026-07-13 22:38:11.520494", "feature_id": 5811907077472256, "stage_type": 120, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": "https://groups.google.com/a/chromium.org/g/blink-dev/c/r78IyGSnclg", "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 4974370402467840, "created": "2026-07-13 22:38:11.521612", "feature_id": 5811907077472256, "stage_type": 130, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": 153, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 6100270309310464, "created": "2026-07-13 22:38:11.522759", "feature_id": 5811907077472256, "stage_type": 140, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 5537320355889152, "created": "2026-07-13 22:38:11.523861", "feature_id": 5811907077472256, "stage_type": 150, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": null, "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": null, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}, {"id": 6663220262731776, "created": "2026-07-13 22:38:11.524982", "feature_id": 5811907077472256, "stage_type": 160, "display_name": null, "pm_emails": [], "tl_emails": [], "ux_emails": [], "te_emails": [], "intent_thread_url": "https://groups.google.com/a/chromium.org/g/blink-dev/c/X-mFPzgH6Os/m/CpIovsZsAAAJ", "announcement_url": null, "experiment_goals": null, "experiment_risks": null, "origin_trial_id": null, "origin_trial_feedback_url": null, "ot_action_requested": false, "ot_approval_buganizer_component": null, "ot_approval_buganizer_custom_field_id": null, "ot_approval_criteria_url": null, "ot_approval_group_email": null, "ot_chromium_trial_name": null, "ot_description": null, "ot_display_name": null, "ot_documentation_url": null, "ot_emails": [], "ot_feedback_submission_url": null, "ot_has_third_party_support": false, "ot_is_critical_trial": false, "ot_is_deprecation_trial": false, "ot_owner_email": null, "ot_requester_email": null, "ot_require_approvals": false, "ot_use_counter_bucket_number": null, "ot_webfeature_use_counter": null, "extensions": [], "experiment_extension_reason": null, "ot_stage_id": null, "finch_url": null, "rollout_milestone": null, "rollout_platforms": [], "rollout_details": null, "rollout_impact": 2, "rollout_stage_plan": null, "enterprise_policies": [], "desktop_first": 159, "android_first": null, "ios_first": null, "webview_first": null, "desktop_last": null, "android_last": null, "ios_last": null, "webview_last": null}], "accurate_as_of": "2026-07-13 22:38:10.359647", "creator_email": "alanding@chromium.org", "updater_email": "alanding@chromium.org", "owner_emails": ["alanding@chromium.org"], "editor_emails": ["evliu@chromium.org"], "cc_emails": ["msw@chromium.org", "reillyg@chromium.org"], "spec_mentor_emails": ["reillyg@chromium.org"], "unlisted": false, "deleted": false, "editors": ["evliu@chromium.org"], "cc_recipients": ["msw@chromium.org", "reillyg@chromium.org"], "spec_mentors": ["reillyg@chromium.org"], "creator": "alanding@chromium.org", "feature_type": "New or changed feature", "feature_type_int": 0, "intent_stage": "None", "intent_stage_int": 0, "active_stage_id": 6663220262731776, "bug_url": "https://crbug.com/528037568", "launch_bug_url": null, "new_crbug_url": "https://bugs.chromium.org/p/chromium/issues/entry?components=Blink>Speech&blocking=528037568&cc=alanding@chromium.org", "screenshot_links": [], "first_enterprise_notification_milestone": null, "enterprise_impact": 1, "breaking_change": false, "confidential": false, "shipping_year": 2026, "flag_name": "enable-experimental-web-platform-features", "finch_name": "WebSpeechTimestamps", "non_finch_justification": null, "ongoing_constraints": null, "rollout_plan": 0, "rollout_plan_displayname": "Will ship enabled for all users", "motivation": "The Web Speech API currently does not expose the acoustic start and end timestamps of recognized speech utterances on SpeechRecognitionResult. While SpeechRecognitionEvent.timeStamp conveys when the DOM event occurred, it provides no information about the acoustic boundaries or duration of the speech segment within the source audio stream.\n\nExposing speechStartTime and speechEndTime (in seconds as a double, matching HTMLMediaElement.currentTime, BaseAudioContext.currentTime, and VTTCue) addresses critical media timeline association capabilities that are currently impossible on the web:\n\n1. Automated Subtitling & Caption Tracks: Constructing frame-accurate subtitle cues (VTTCue(start, end, text)) for recorded or streaming audio/video.\n2. Interactive \"Click-to-Seek\" Navigation: Enabling users to click a phrase in a transcript and immediately seek playback to the exact moment it was spoken.\n3. Conferencing & Media Recording Alignment: Synchronizing real-time captions with recorded media tracks or WebRTC playout delay buffers.\n4. Text-Based Media Editing: Accurately cutting, splicing, or rearranging audio and video based on transcript text.", "devtrial_instructions": null, "activation_risks": null, "measurement": null, "availability_expectation": null, "adoption_expectation": null, "adoption_plan": null, "initial_public_proposal_url": "https://github.com/WebAudio/web-speech-api/issues/191 ", "explainer_links": ["https://github.com/WebAudio/web-speech-api/blob/main/explainers/speech-recognition-result-timestamps.md"], "requires_embedder_support": true, "spec_link": "https://github.com/WebAudio/web-speech-api/pull/192", "api_spec": true, "automation_spec": false, "interop_compat_risks": "Low interoperability and compatibility risk. This is a purely additive change introducing two read-only double attributes (speechStartTime and speechEndTime) on SpeechRecognitionResult, along with updating SpeechRecognitionEvent.timeStamp to reflect the end of the recognized speech segment on the session audio timeline. Existing applications using SpeechRecognition continue to work without modification, and developers can feature-detect support via 'speechStartTime' in SpeechRecognitionResult.prototype. The specification update (https://github.com/WebAudio/web-speech-api/pull/192) was shaped by feedback from the W3C Audio Working Group / Community Group (including @padenot at Mozilla) and the W3C TAG (https://github.com/w3ctag/design-reviews/issues/1267).", "all_platforms": false, "all_platforms_descr": "Supported on Windows, Mac, and Linux. Not currently supported on ChromeOS, Android, or Android WebView: on-device Web Speech has not shipped on ChromeOS yet (crbug.com/534893147), Android WebView does not support SpeechRecognition API, and Chrome on Android delegates to the OS SpeechRecognizer service, which does not expose segment-level start and end timestamps. WebSpeechTimestamps will only be enabled on Windows, Mac, and Linux.", "non_oss_deps": null, "anticipated_spec_changes": "None. Following W3C TAG (https://github.com/w3ctag/design-reviews/issues/1267 ) and Audio WG/CG review on PR #192 (https://github.com/WebAudio/web-speech-api/pull/192 ), the attribute names (speechStartTime and speechEndTime), type and units, and SpeechRecognitionEvent.timeStamp behavior have already been updated to match reviewer consensus. No further backward-incompatible spec changes are anticipated.", "security_risks": null, "ergonomics_risks": null, "wpt": false, "wpt_descr": "End-to-end Web Speech API recognition tests cannot currently run in automated Web Platform Tests (WPT) because WPT lacks a WebDriver mock speech recognition backend automation hook (and on-device recognition models are not bundled in standard WPT test runners). The IDL surface is covered by WPT idlharness tests, and the timestamp exposure, 2ms quantization (FuzzTimestamp), and SpeechRecognitionEvent.timeStamp rebasing are covered by Blink unit tests (third_party/blink/renderer/modules/speech/speech_recognition_test.cc, crrev.com/c/8409366 and crrev.com/c/8729884) as well as browser/service unit tests (content/browser/speech/soda_speech_recognition_engine_impl_unittest.cc, content/browser/speech/on_device_speech_recognition_engine_unittest.cc, chrome/services/speech/soda_speech_recognizer_impl_unittest.cc, chrome/services/speech/speech_recognition_recognizer_impl_unittest.cc, and services/on_device_model/on_device_model_service_unittest.cc).", "webview_risks": "None. This feature only adds new read-only attributes to SpeechRecognitionResult and does not deprecate or break existing APIs. Furthermore, the Web Speech API (SpeechRecognition) is not supported on Android WebView.", "devrel_emails": ["devrel-chromestatus-all@google.com"], "debuggability": "No special DevTools support is needed. speechStartTime and speechEndTime are standard read-only IDL attributes exposed on SpeechRecognitionResult instances (and timeStamp on SpeechRecognitionEvent) and can be inspected directly in the DevTools Console, Scope pane, and watch expressions like any other DOM object properties.", "doc_links": [], "sample_links": ["https://alan33d.github.io/web-speech-demos/live_meeting_recording_demo.html", "https://alan33d.github.io/web-speech-demos/webrtc_caption_sync_test.html"], "prefixed": null, "tags": [], "tag_review": "https://github.com/w3ctag/design-reviews/issues/1267", "tag_review_status": "Issues addressed", "tag_review_status_int": 3, "security_review_status": "Pending", "security_review_status_int": 1, "privacy_review_status": "Pending", "privacy_review_status_int": 1, "security_continuity_id": null, "security_launch_issue_id": null, "updated_display": null, "resources": {"samples": ["https://alan33d.github.io/web-speech-demos/live_meeting_recording_demo.html", "https://alan33d.github.io/web-speech-demos/webrtc_caption_sync_test.html"], "docs": []}, "comments": null, "ff_views": 5, "safari_views": 5, "web_dev_views": 2, "browsers": {"chrome": {"bug": "https://crbug.com/528037568", "blink_components": ["Blink>Speech"], "devrel": ["devrel-chromestatus-all@google.com"], "owners": ["alanding@chromium.org"], "origintrial": false, "prefixed": null, "flag": false, "status": {"text": "Proposed", "val": 2, "milestone_str": "Proposed"}, "announced": false, "desktop": 159, "android": null, "webview": null, "ios": null}, "ff": {"view": {"url": "https://github.com/WebAudio/web-speech-api/pull/192", "notes": "Unofficial approval from @padenot (Mozilla) on spec update.", "text": "No signal", "val": 5}}, "safari": {"view": {"url": null, "notes": "", "text": "No signal", "val": 5}}, "webdev": {"view": {"text": "Positive", "val": 2, "url": "https://github.com/WebAudio/web-speech-api/issues/191", "notes": "Requested by internal and external web developers building real-time captioning, media recording alignment, and latency-sensitive conferencing applications (including Google Meet). For example, speechStartTime and speechEndTime are used to generate synchronized VTTCue captions and interactive click-to-seek transcripts and developer specifically needed this feature to properly map results to the timeline to know when the speech that generated the text in the result started and ended for applications such as Subtitling & Closed Captions, Meeting Transcripts, Live WebRTC Video Sync (see crbug.com/551992211#comment3)."}}, "other": {"view": {"text": null, "val": null, "url": null, "notes": null}}}, "standards": {"spec": "https://github.com/WebAudio/web-speech-api/pull/192", "maturity": {"text": "Specification currently under development in a Working Group", "short_text": "Working draft", "val": 4}}, "is_released": false, "is_enterprise_feature": false, "experiment_timeline": null, "ai_test_eval_report": null, "ai_test_eval_run_status": null, "ai_test_eval_status_timestamp": null}