{"providers":[{"key":"assemblyai","name":"AssemblyAI","mode":"batch_only","candidate_limit":null,"languages":"~17 (automatic language detection)","notes":"Automatic Language Detection runs on the async/pre-recorded API; the real-time streaming model is English-centric, so live auto-switch is not available.","docs":"https://www.assemblyai.com/docs/models/speech-recognition","portal_recipe":null,"portal_status":"no_recipe","portal_note":"The portal's PROVIDER_IMPL_SEED has no AssemblyAI row, so the standard client cannot call it. Measuring this vendor means getting a recipe added to the portal.","streaming_auto_detect":false,"portal_callable":false,"measurable":false},{"key":"aws_transcribe","name":"AWS Transcribe","mode":"at_start","candidate_limit":5,"languages":"streaming ID across a chosen language set","notes":"Streaming IdentifyLanguage picks the language for the stream from your candidate list near the start; IdentifyMultipleLanguages (true multi-language) is batch-only.","docs":"https://docs.aws.amazon.com/transcribe/latest/dg/lang-id-stream.html","portal_recipe":null,"portal_status":"no_recipe","portal_note":"No AWS row in the portal's recipe table — the portal's own notes list AWS among the vendors it carries no row for. SigV4 request signing is also something no current recipe shape expresses, so this is a portal change, not a key.","streaming_auto_detect":true,"portal_callable":false,"measurable":false},{"key":"azure","name":"Azure AI Speech","mode":"continuous","candidate_limit":10,"languages":"continuous LID over up to 10 candidate locales (real-time)","notes":"Continuous Language Identification detects and switches language between sentences throughout the audio (not within one); up to 10 candidate locales for continuous LID, 4 for at-start, one locale per base language.","docs":"https://learn.microsoft.com/azure/ai-services/speech-service/language-identification","portal_recipe":"Microsoft Azure Speech to Text","portal_status":"forced","portal_note":"Both of the recipe's endpoints carry `?language={lang}` and Azure requires it, so the driver substitutes default_lang ('en-US') when the caller names no language — a plain call is TOLD the language. But since portal v2.54.0 the recipe also carries a REALTIME block (universal/v2, USP framing), which is the surface continuous LID lives on — so src/lid.py's overlay can now attach, drop that query parameter and ask the detector properly. This vendor is measurable with language identification ON, and only then.","streaming_auto_detect":true,"portal_callable":true,"measurable":false},{"key":"cartesia_ink_whisper","name":"Cartesia Ink-Whisper","mode":"unverified","candidate_limit":null,"languages":"unread","notes":"Added from the portal's recipe table. Its live language-detection behaviour has NOT been read off Cartesia's documentation yet, so no mode is claimed here.","docs":"https://docs.cartesia.ai/api-reference/stt/transcribe","portal_recipe":"Cartesia Ink-Whisper","portal_status":"unset_ok","portal_note":"`language` is an ordinary multipart field, dropped by the driver when the caller passes none, so the request goes out with no language stated.","streaming_auto_detect":false,"portal_callable":true,"measurable":true},{"key":"deepgram","name":"Deepgram","mode":"continuous","candidate_limit":null,"languages":"multilingual code-switching (Nova, language=multi)","notes":"Nova multilingual mode (language=multi) detects and code-switches between languages within a single live stream.","docs":"https://developers.deepgram.com/docs/language-detection","portal_recipe":"Deepgram Nova-3","portal_status":"forced","portal_note":"Deepgram takes its options as QUERY parameters because the body is the audio, and the recipe pins `?model=nova-3&smart_format=true` with no language parameter at all — so the call lands on Deepgram's English default. The very feature this POC wants is one query parameter away (`language=multi`) on the portal's recipe.","streaming_auto_detect":true,"portal_callable":true,"measurable":false},{"key":"elevenlabs_scribe","name":"ElevenLabs Scribe","mode":"unverified","candidate_limit":null,"languages":"unread","notes":"Added from the portal's recipe table. Its live language-detection behaviour has NOT been read off the ElevenLabs documentation yet, so no mode is claimed here.","docs":"https://elevenlabs.io/docs/api-reference/speech-to-text","portal_recipe":"ElevenLabs Scribe","portal_status":"unset_ok","portal_note":"`language_code` is an ordinary multipart field, dropped by the driver when the caller passes none.","streaming_auto_detect":false,"portal_callable":true,"measurable":true},{"key":"fish_audio","name":"Fish Audio ASR","mode":"unverified","candidate_limit":null,"languages":"unread","notes":"Added from the portal's recipe table. Its live language-detection behaviour has NOT been read off the Fish Audio documentation yet, so no mode is claimed here.","docs":"https://docs.fish.audio/api-reference/endpoint/openapi-v1/asr","portal_recipe":"Fish Audio ASR","portal_status":"unset_ok","portal_note":"`language` is an ordinary body field (the body is msgpack, which the driver encodes), dropped when the caller passes no language.","streaming_auto_detect":false,"portal_callable":true,"measurable":true},{"key":"gladia","name":"Gladia","mode":"continuous","candidate_limit":null,"languages":"Whisper-based, real-time code-switching","notes":"Real-time endpoint supports dynamic language switching (code-switching) with language detection enabled.","docs":"https://docs.gladia.io/chapters/live-stt/features","portal_recipe":null,"portal_status":"no_recipe","portal_note":"No Gladia row in the portal's recipe table — the portal's own notes list Gladia among the vendors it carries no row for. This is the most costly gap of the three: Gladia is one of only three vendors here documented as switching language mid-stream.","streaming_auto_detect":true,"portal_callable":false,"measurable":false},{"key":"google","name":"Google Cloud Speech-to-Text","mode":"at_start","candidate_limit":null,"languages":"chirp_3, languageCodes=[auto] (Speech-to-Text v2)","notes":"Speech-to-Text v2 with chirp_3 decides the dominant language of a request on its own (languageCodes: [\"auto\"]) and reports it as languageCode on each result — one language per request, so a stream locks rather than switches. v2 streams over gRPC only, which the portal does not speak, so this vendor is measured window by window over synchronous Recognize.","docs":"https://cloud.google.com/speech-to-text/v2/docs/chirp_3-model","portal_recipe":"Google Cloud Speech-to-Text","portal_status":"unset_ok","portal_note":"Since portal v2.63.0 the recipe calls v2 with `languageCodes: [\"auto\"]` by default, so a call that names no language asks the model to decide. Needs the project's service-account key file uploaded on the row (v2 takes no API key), and is served from the eu multi-region unless GOOGLE_SPEECH_LOCATION says otherwise.","streaming_auto_detect":true,"portal_callable":true,"measurable":true},{"key":"mistral_voxtral","name":"Mistral Voxtral Transcribe","mode":"unverified","candidate_limit":null,"languages":"unread","notes":"Added from the portal's recipe table. Its live language-detection behaviour has NOT been read off the Mistral documentation yet, so no mode is claimed here.","docs":"https://docs.mistral.ai/capabilities/audio/","portal_recipe":"Mistral Voxtral Transcribe","portal_status":"unset_ok","portal_note":"`language` is an ordinary multipart field, dropped by the driver when the caller passes none.","streaming_auto_detect":false,"portal_callable":true,"measurable":true},{"key":"openai_whisper","name":"OpenAI Whisper","mode":"batch_only","candidate_limit":null,"languages":"~99 (auto-detect from the first window)","notes":"Whisper auto-detects language from the opening ~30s window and keeps it; classic Whisper is a batch model, so 'streaming' is chunked and it does not code-switch.","docs":"https://platform.openai.com/docs/guides/speech-to-text","portal_recipe":"OpenAI Transcribe","portal_status":"unset_ok","portal_note":"`language` is an ordinary multipart field, dropped by the driver when the caller passes none. NOTE the portal's recipe calls `gpt-4o-transcribe`, not classic `whisper-1` — a different model from the one this row's mode was read off, so a measured result here is about gpt-4o-transcribe.","streaming_auto_detect":false,"portal_callable":true,"measurable":true},{"key":"soniox","name":"Soniox Speech-to-Text","mode":"continuous","candidate_limit":null,"languages":"automatic, per token; `language_hints` bias without restricting","notes":"Realtime `stt-rt-v5` identifies language automatically and reports it on each token when asked. `language_hints` are a bias, not a restriction — the vendor's own docs are explicit — so a candidate list is an ask rather than an answer handed over. Still a CLAIM: this POC exists to measure it.","docs":"https://soniox.com/docs/stt/concepts/language-hints","portal_recipe":"Soniox Speech-to-Text","portal_status":"forced","portal_note":"An upload-submit-poll-fetch flow whose submit step sends `language_hints[]: {lang}`, which the driver resolves to default_lang ('en') when the caller names no language — so a BATCH call is hinted the answer. The realtime block names no language, which is why a streaming run is honest and the batch fallback is still refused.","streaming_auto_detect":true,"portal_callable":true,"measurable":false},{"key":"speechmatics","name":"Speechmatics","mode":"continuous","candidate_limit":null,"languages":"Melia 1 multilingual (language=multi): 55+ languages, per word, realtime (private preview) and batch; Ursa language=auto, batch, one language per file","notes":"Melia 1 detects and switches automatically, labelling every word, on the realtime API as a PRIVATE PREVIEW (wss://preview.rt.speechmatics.com/v2; the key needs preview access; the session takes exactly language=multi, model=melia-1 and enable_partials=true) and in batch. The ordinary realtime session has no identification at all (speechmatics-rt 1.1.1 has no field for it; its answer to code-switching is a fixed bilingual pack such as es_en). language=auto identifies one predominant language per file and needs about 60 s of speech. Finals run 3-6 s behind the speaker and partials about 2 s ahead of their finals, by the vendor's own account. Still a CLAIM: this POC exists to measure it.","docs":"https://docs.speechmatics.com/private/melia-1-realtime","portal_recipe":"Speechmatics","portal_status":"forced","portal_note":"Both legs of the recipe state a language: the batch job config hard-codes `{\"language\":\"{lang}\"}` and the plain realtime session sends `{lang}` with an operating_point, each resolved to default_lang ('en') when the caller names none. The overlay in src/lid.py replaces the session with Melia 1's preview (portal v2.64.0 carries the same as `detect.stream`), and the portal's `detect` block (v2.63.0) asks the batch job on Melia 1 — so a run streams to the preview and falls back to that job.","streaming_auto_detect":true,"portal_callable":true,"measurable":false}],"capability":{"total":13,"streaming_auto_detect":7,"by_mode":{"continuous":5,"at_start":2,"batch_only":2,"none":0,"unverified":4},"portal_callable":10,"measurable":6,"by_portal_status":{"unset_ok":6,"forced":4,"no_recipe":3}},"linked":["Deepgram Nova-3","Soniox Speech-to-Text","Speechmatics","Microsoft Azure Speech to Text"],"targets":[{"provider":"deepgram","portal_name":"Deepgram Nova-3","provider_name":"Deepgram","mode":"continuous","docs":"https://developers.deepgram.com/docs/language-detection","reads_language":false,"streamable":true,"can_identify":true,"detects_via":"stream","identify":true,"method":"stream"},{"provider":"soniox","portal_name":"Soniox Speech-to-Text","provider_name":"Soniox Speech-to-Text","mode":"continuous","docs":"https://soniox.com/docs/stt/concepts/language-hints","reads_language":false,"streamable":true,"can_identify":true,"detects_via":"stream","identify":false,"method":"stream"},{"provider":"speechmatics","portal_name":"Speechmatics","provider_name":"Speechmatics","mode":"continuous","docs":"https://docs.speechmatics.com/private/melia-1-realtime","reads_language":false,"streamable":true,"can_identify":true,"detects_via":"stream","identify":true,"method":"stream"},{"provider":"azure","portal_name":"Microsoft Azure Speech to Text","provider_name":"Azure AI Speech","mode":"continuous","docs":"https://learn.microsoft.com/azure/ai-services/speech-service/language-identification","reads_language":true,"streamable":true,"can_identify":true,"detects_via":"stream","identify":true,"method":"stream"}],"lid_overlays":[{"recipe":"Microsoft Azure Speech to Text","candidate_limit":10,"note":"Azure's continuous LID takes up to 10 candidate locales and lives on the universal/v2 endpoint, which the portal's recipe has carried since its v2.54.0. What the portal's recipe deliberately does not carry is `lidEnabled=true` and the languageId context: its job is to transcribe, and asking the detector is this POC's question. Delete this overlay if the portal ever ships that block itself."},{"recipe":"Deepgram Nova-3","candidate_limit":null,"note":"Query parameters only: `language=multi` asks for code-switching, and `encoding=linear16&sample_rate=16000` tells Deepgram the paced session sends headerless PCM — without them every transcript comes back empty. The language is read per WORD (`words[].language`), which is where a live result carries it. Delete this overlay once the portal's Deepgram recipe carries all of it on its realtime endpoint."},{"recipe":"Speechmatics","candidate_limit":null,"note":"Melia 1's realtime preview: the session is REPLACED, not merged — wss://preview.rt.speechmatics.com/v2 and a transcription_config of exactly language=multi, model=melia-1, enable_partials=true, because the plain session's operating_point fails the handshake there. The language is read per WORD (results[].alternatives[0].language), on partials too; punctuation items are glued onto the word before. The portal's own recipe carries the same session as detect.stream since its v2.64.0 for its managed client; delete this overlay once the portal's client drives a paced session with it."},{"recipe":"Soniox Speech-to-Text","candidate_limit":null,"note":"Soniox detects language without being asked; what it does not do without being asked is SAY which one, and this POC scores the language the vendor named. Delete this overlay once the portal's Soniox recipe carries enable_language_identification on its realtime block."}],"refused":[],"support":[{"provider":"assemblyai","provider_name":"AssemblyAI","mode":"batch_only","docs":"https://www.assemblyai.com/docs/models/speech-recognition","live":false,"reach":"no_recipe","tested":false,"summary":"auto-detect only on pre-recorded audio, not live","reach_summary":"the portal has no recipe for this vendor, so nothing here can call it at all","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"aws_transcribe","provider_name":"AWS Transcribe","mode":"at_start","docs":"https://docs.aws.amazon.com/transcribe/latest/dg/lang-id-stream.html","live":true,"reach":"no_recipe","tested":false,"summary":"detects once at the start, then holds that language","reach_summary":"the portal has no recipe for this vendor, so nothing here can call it at all","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"azure","provider_name":"Azure AI Speech","mode":"continuous","docs":"https://learn.microsoft.com/azure/ai-services/speech-service/language-identification","live":true,"reach":"ready_lid","tested":true,"summary":"detects and keeps switching mid-stream","reach_summary":"linked and measured with its detector switched on — the recipe as delivered states a language, and this POC carries the configuration that takes that back out, so it is applied for this vendor whether or not the run asked for it","method":"stream","can_identify":true,"has_overlay":true,"blocked":"","blocked_reason":"","since":""},{"provider":"cartesia_ink_whisper","provider_name":"Cartesia Ink-Whisper","mode":"unverified","docs":"https://docs.cartesia.ai/api-reference/stt/transcribe","live":false,"reach":"unlinked","tested":false,"summary":"nobody has read this vendor's live-detection docs yet","reach_summary":"the portal carries a recipe, but it is not linked to this POC — link it on the Providers tab to include it","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"deepgram","provider_name":"Deepgram","mode":"continuous","docs":"https://developers.deepgram.com/docs/language-detection","live":true,"reach":"ready_lid","tested":true,"summary":"detects and keeps switching mid-stream","reach_summary":"linked and measured with its detector switched on — the recipe as delivered states a language, and this POC carries the configuration that takes that back out, so it is applied for this vendor whether or not the run asked for it","method":"stream","can_identify":true,"has_overlay":true,"blocked":"","blocked_reason":"","since":""},{"provider":"elevenlabs_scribe","provider_name":"ElevenLabs Scribe","mode":"unverified","docs":"https://elevenlabs.io/docs/api-reference/speech-to-text","live":false,"reach":"unlinked","tested":false,"summary":"nobody has read this vendor's live-detection docs yet","reach_summary":"the portal carries a recipe, but it is not linked to this POC — link it on the Providers tab to include it","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"fish_audio","provider_name":"Fish Audio ASR","mode":"unverified","docs":"https://docs.fish.audio/api-reference/endpoint/openapi-v1/asr","live":false,"reach":"unlinked","tested":false,"summary":"nobody has read this vendor's live-detection docs yet","reach_summary":"the portal carries a recipe, but it is not linked to this POC — link it on the Providers tab to include it","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"gladia","provider_name":"Gladia","mode":"continuous","docs":"https://docs.gladia.io/chapters/live-stt/features","live":true,"reach":"no_recipe","tested":false,"summary":"detects and keeps switching mid-stream","reach_summary":"the portal has no recipe for this vendor, so nothing here can call it at all","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"google","provider_name":"Google Cloud Speech-to-Text","mode":"at_start","docs":"https://cloud.google.com/speech-to-text/v2/docs/chirp_3-model","live":true,"reach":"unlinked","tested":false,"summary":"detects once at the start, then holds that language","reach_summary":"the portal carries a recipe, but it is not linked to this POC — link it on the Providers tab to include it","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"mistral_voxtral","provider_name":"Mistral Voxtral Transcribe","mode":"unverified","docs":"https://docs.mistral.ai/capabilities/audio/","live":false,"reach":"unlinked","tested":false,"summary":"nobody has read this vendor's live-detection docs yet","reach_summary":"the portal carries a recipe, but it is not linked to this POC — link it on the Providers tab to include it","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"openai_whisper","provider_name":"OpenAI Whisper","mode":"batch_only","docs":"https://platform.openai.com/docs/guides/speech-to-text","live":false,"reach":"unlinked","tested":false,"summary":"auto-detect only on pre-recorded audio, not live","reach_summary":"the portal carries a recipe, but it is not linked to this POC — link it on the Providers tab to include it","method":"","can_identify":false,"has_overlay":false,"blocked":"","blocked_reason":"","since":""},{"provider":"soniox","provider_name":"Soniox Speech-to-Text","mode":"continuous","docs":"https://soniox.com/docs/stt/concepts/language-hints","live":true,"reach":"ready","tested":true,"summary":"detects and keeps switching mid-stream","reach_summary":"linked to this POC and callable without naming the language","method":"stream","can_identify":true,"has_overlay":true,"blocked":"","blocked_reason":"","since":""},{"provider":"speechmatics","provider_name":"Speechmatics","mode":"continuous","docs":"https://docs.speechmatics.com/private/melia-1-realtime","live":true,"reach":"ready_lid","tested":true,"summary":"detects and keeps switching mid-stream","reach_summary":"linked and measured with its detector switched on — the recipe as delivered states a language, and this POC carries the configuration that takes that back out, so it is applied for this vendor whether or not the run asked for it","method":"stream","can_identify":true,"has_overlay":true,"blocked":"","blocked_reason":"","since":""}]}