Multilingual post-stream refinement reaches GA on an LLM Speech streaming model, with phrase lists and 61 locales.
In July, real-time transcription went multilingual for the first time. multilingual post-stream refinement entered public preview, so a single live session could recognize multiple languages, including switches mid-conversation, without knowing the language in advance.
Today, multilingual post-stream refinement is generally available in Azure Speech, part of Microsoft Foundry. It also has a new engine. Instead of running a second recognition pass in parallel and waiting for it to finish, multilingual post-stream refinement now runs on an LLM Speech streaming model. The result is refined final transcripts that arrive much sooner.
What’s new
- Generally available: Multilingual real-time transcription, with code-switching and no locale preselection, is ready for production.
- Faster final results: The streaming model removes the wait for a separate second pass. Final results typically arrive in around 100 milliseconds.
- Phrase lists: Bias recognition toward product names, people, and domain terms in multilingual sessions. This was the most requested capability from the preview. Each phrase list can have up to 200 phrases and 3,200 characters.
- 61 multilingual locales: Up from 29 at preview.
- Diarization included: Multilingual transcripts still show who said what.
Why the new architecture matters
Partial and final results do different jobs. Partial results drive live captions and voice-agent turn-taking. Final results feed storage, analytics, search, summarization, and downstream AI.
In preview, multilingual post-stream refinement paired a real-time recognizer with a second, non-streaming recognition pass that refined each final result with broader audio context. That improved accuracy, but applications had to wait for the second pass before the refined final arrived. Multilingual post-stream refinement now runs natively on an LLM Speech streaming model inside the real-time service, so refined finals arrive without that extra wait.
The integration doesn’t change. If you already use multilingual post-stream refinement, you get the new engine with no code changes. This update applies to real-time speech to text through the Speech SDK.
Get started
Enable Post-Stream Refinement with open-range language detection, then add a phrase list if you need it: Multilingual Post-Stream Refinement requires Speech SDK 1.50 or later.
import azure.cognitiveservices.speech as speechsdk
import time
ENABLE_LID = False
done = False
speech_config = speechsdk.SpeechConfig(subscription="YourSpeechKey", endpoint="YourSpeechEndpoint")
# Enable Multichannel processing
speech_config.set_property(speechsdk.PropertyId.Speech_EnableMultiChannelProcessing, "true")
# Optional: identify the language on each channel
auto_detect_config = None
if ENABLE_LID:
speech_config.set_property(speechsdk.PropertyId.SpeechServiceConnection_LanguageIdMode, "Continuous")
auto_detect_config = speechsdk.languageconfig.AutoDetectSourceLanguageConfig(languages=["en-US", "es-MX"])
else:
speech_config.speech_recognition_language = "en-US"
audio_config = speechsdk.AudioConfig(filename="stereo.wav")
speech_recognizer = speechsdk.SpeechRecognizer(
speech_config=speech_config,
auto_detect_source_language_config=auto_detect_config,
audio_config=audio_config,
)
# Print Multichannel results
def recognized_cb(evt: speechsdk.SpeechRecognitionEventArgs) -> None:
if evt.result.reason == speechsdk.ResultReason.RecognizedSpeech:
label = f"channel {evt.result.channel}"
if ENABLE_LID:
label += f" | {speechsdk.AutoDetectSourceLanguageResult(evt.result).language}"
print(f"RECOGNIZED ({label}): {evt.result.text}")
def stop_cb(evt: speechsdk.SessionEventArgs) -> None:
global done
done = True
speech_recognizer.recognized.connect(recognized_cb)
speech_recognizer.session_stopped.connect(stop_cb)
speech_recognizer.canceled.connect(stop_cb)
speech_recognizer.start_continuous_recognition()
try:
while not done:
time.sleep(0.5)
finally:
speech_recognizer.stop_continuous_recognition()
Tip: For the lowest final-result latency in voice-agent scenarios, commit results explicitly when your application detects the end of a turn, instead of relying only on the service’s silence timeout.
What else: more languages for monolingual post-stream refinement
This release also expands monolingual post-stream refinement, for sessions where you know the language up front. It now supports 148 locales, up from 29, which matches fast transcription coverage. Monolingual post-stream refinement keeps its existing design, a second recognition pass that runs in parallel with real-time streaming. For the full list, see Speech to text language support.
Which mode should I use?
|
Your scenario |
Use |
Why |
|
Language unknown up front, or speakers switch languages |
Multilingual post-stream refinement |
low latency final results, open-range detection, code-switching, 61 locales |
|
Known single language, broadest locale coverage |
Monolingual post-stream refinement |
148 locale coverage |
Designed for global, real-time workloads
- Global contact centers, where callers start or continue in different languages.
- Voice agents that must handle code-switching without restarting the session, and recognize product and customer names with phrase lists.
- International meetings, webinars, and live captioning.
- Travel, automotive, media, and consumer apps serving many markets.
Availability
Multilingual post-stream refinement is available in six regions: Central India, East US, North Europe, Southeast Asia, West US, and West US 2. For complete locale and region lists, see Speech to text language support and Supported regions for Azure Speech.
Get started today
-
Read the documentation: Multilingual post-stream refinement
-
Phrase lists: Improve recognition accuracy with phrase list
-
Check locale and region support: Speech to text language support and Supported regions for Azure Speech.
-
Azure Support: File a support request through the Azure portal
-
GitHub: Open issues on the Azure Speech SDK samples repository