Azure Speech SDK WebSocket Connection Fails on One Quest Headset but Works on Another (Same Build, Same Azure Resource)

David Bain (GCE) 0 Reputation points
2026-09-11T10:24:06.55+00:00

Environment

  • Unity application using Azure Speech-to-Text
  • Azure Speech Region: centralus
  • Azure Speech SDK: 1.44.0
  • Platform: Meta Quest (Android 14)
  • Endpoint: wss://centralus.stt.speech.microsoft.com/stt/speech/universal/v2

Problem

We've had a Unity application using Azure Speech-to-Text successfully for several years. Recently, speech recognition stopped working on one headset.

What's confusing is that the same APK, same Azure Speech resource, same Speech key, and same SDK version work perfectly on another headset.

Current Initialization Code

_config = SpeechConfig.FromSubscription(

ServiceCredentials.SpeechToText.serviceKey,

ServiceCredentials.SpeechToText.region);

_recognizer = new SpeechRecognizer(_config);

await _recognizer.StartContinuousRecognitionAsync();

What We've Verified

✅ Azure Speech works in Unity Editor

✅ Same Azure Speech resource

✅ Same subscription key

✅ Same Azure region (centralus)

✅ Same APK

✅ Same Speech SDK version (1.44.0)

✅ Same Quest OS build string reported in logs

✅ Microphone audio is being captured

✅ Network connectivity exists (Photon works)

✅ HTTPS access to Speech endpoint works on both devices

A test request to:
https://centralus.stt.speech.microsoft.com

returns HTTP 404 on both headsets, which suggests:

  • DNS resolution works
  • TLS works
  • The endpoint is reachable

Device Difference

The only notable difference we've identified so far:

  • Working headset: developer-managed device
  • Failing headset: enrolled through Meta Work / enterprise management

Working Headset Log

The working headset successfully opens the websocket

OnWebSocketOpened

Opening websocket completed

Connected, forwarding 9 queued messages

AdapterConnected to

wss://centralus.stt.speech.microsoft.com/stt/speech/universal/v2

Failing Headset Log

The failing headset reaches the websocket open step but then fails:

WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED

Connection failed (no connection to the remote host)

wss://centralus.stt.speech.microsoft.com/stt/speech/universal/v2

Additional log output:

TransportError: connection failed

Internal error: 1

Failed with error:

WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED

The SDK then retries and recreates the recognizer, but continues to fail.

Additional Observations

The failing headset captures microphone audio successfully:

Received audio chunk

size:3200

and begins streaming audio.

The failure appears to occur before a successful Azure Speech websocket session is established.

We are not seeing:

AuthenticationFailure

401

403

Forbidden

which makes me think this is not an Azure authentication issue.

Questions

  1. Has anyone seen WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED from Azure Speech on Android/Quest devices?
  2. Does Azure Speech use any websocket/TLS requirements that differ from a normal HTTPS request?
  3. Are there known issues with Azure Speech SDK 1.44.0 on Android 14 or Quest devices?
  4. Has anyone migrated from the legacy Unity Speech SDK package to the NuGet-based approach and seen similar websocket behavior?
  5. Is there any diagnostic logging available beyond the Speech SDK logs that would help identify exactly why the websocket open operation fails?

Any guidance would be appreciated. At this point the Azure resource itself appears healthy because the same build works correctly on another headset, but I'm trying to determine whether this is:

  • an Azure Speech SDK issue,
  • a websocket/TLS issue,
  • or something specific to the managed Quest environment.
Azure Speech in Foundry Tools

1 answer

Sort by: Newest
  1. AI answer

    2026-09-11T10:24:34.55+00:00

    WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED is documented as a connection failure pattern for the Speech SDK. For the specific CRL-related case, the documented indicators are:

    • running on Linux or Android
    • using SDK version prior to 1.48.2
    • failures that can appear after a period of working connections or when connecting across regions
    • SDK logs that show TLS verification failures such as certificate verify failed
    • Error 44 / X509_V_ERR_DIFFERENT_CRL_SCOPE

    That makes the first concrete action to upgrade from 1.44.0 to 1.48.2 or later and then retest on the failing Quest device. The documented risk of staying on an older SDK is continued connection failures until the SDK is upgraded, CRL checking is disabled, or the CRL cache is cleared.

    For diagnostics, enable Speech SDK logging and inspect the TLS-related lines. The documented log signatures to look for are:

    SPX_TRACE_ERROR: AZ_LOG_ERROR: tlsio_openssl.c:1655 Error 44 was unexpected
    SPX_TRACE_ERROR: AZ_LOG_ERROR: tlsio_openssl.c:691 error:0A000086:SSL routines::certificate verify failed
    SPX_TRACE_ERROR: web_socket.cpp:930 WS open operation failed with result=1(WS_OPEN_ERROR_UNDERLYING_IO_OPEN_FAILED)
    

    If those lines appear on the managed headset and not on the unmanaged headset, that strongly points to a TLS/CRL validation difference on the device rather than a Speech key or region problem.

    On authentication: the documented authentication failures for Speech SDK typically surface as 401, 403, AuthenticationFailure, invalid SpeechConfig, or access denied 0x5. Since those are not appearing in the failing logs, the failure pattern described is more consistent with a lower-level connection problem than with invalid key/region configuration.

    On HTTPS versus WebSocket behavior: the context confirms the Speech SDK uses WebSocket connections, and the failing error is specifically during WebSocket open. A successful HTTPS reachability test does not rule out a WebSocket/TLS problem.

    Given the device difference, the most supported troubleshooting path is:

    1. Upgrade the Speech SDK on Android/Quest from 1.44.0 to 1.48.2 or later.
    2. Enable SDK logging on both headsets and compare TLS-related errors during socket open.
    3. Check whether the failing device shows the documented TLS indicators: certificate verify failed, Error 44, or X509_V_ERR_DIFFERENT_CRL_SCOPE.
    4. If the app is using a Speech container anywhere in testing, make sure it is initialized with host authentication. Using key+region sends traffic to the public Speech service instead of the container.
    5. If the issue persists after upgrade, use the public support channels for Speech SDK issues: Stack Overflow with the azure-speech tag or the Speech SDK GitHub issue tracker.

    For the Unity package migration question, the available context does not document a Unity-specific migration issue causing this behavior.


    References:

    AI-generated content may be incorrect. Read our transparency notes for more information.

    Was this answer helpful?

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.