Diffusez des flux audio vers Qwen-ASR-Realtime via WebSocket et obtenez des résultats de transcription en temps réel grâce au SDK Python DashScope.
Pour une vue d'ensemble des modèles pris en charge, des fonctionnalités disponibles et des exemples de code complets, consultez la rubrique Reconnaissance vocale en temps réel.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
- SDK DashScope version 1.25.6 ou ultérieure
- Une clé API
- Une bonne compréhension du flux d'interaction
ImportantAlibaba Cloud Model Studio a publié des domaines spécifiques aux espaces de travail pour les régions Chine (Pékin) et Singapour. Ces nouveaux domaines dédiés offrent des performances supérieures et une stabilité accrue pour les requêtes d'inférence. Nous vous recommandons de migrer vers ces nouveaux domaines :
- Chine (Pékin) : passez de
dashscope.aliyuncs.comà{WorkspaceId}.cn-beijing.maas.aliyuncs.com - Singapour : passez de
dashscope-intl.aliyuncs.comà{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
Remplacez {WorkspaceId} par votre véritable ID d'espace de travail. Les domaines existants restent pleinement opérationnels.
Paramètres de requête
Constructeur OmniRealtimeConversation
Créez une instance OmniRealtimeConversation à l'aide des paramètres suivants.
Cliquez pour afficher l'exemple de code
from dashscope.audio.qwen_omni import OmniRealtimeConversation, OmniRealtimeCallback
class MyCallback(OmniRealtimeCallback):
"""Callback for real-time recognition"""
def __init__(self, conversation):
self.conversation = conversation
self.handlers = {
'session.created': self._handle_session_created,
'conversation.item.input_audio_transcription.completed': self._handle_final_text,
'conversation.item.input_audio_transcription.text': self._handle_stash_text,
'input_audio_buffer.speech_started': lambda r: print('======Speech Start======'),
'input_audio_buffer.speech_stopped': lambda r: print('======Speech Stop======')
}
def on_open(self):
print('Connection opened')
def on_close(self, code, msg):
print(f'Connection closed, code: {code}, msg: {msg}')
def on_event(self, response):
try:
handler = self.handlers.get(response['type'])
if handler:
handler(response)
except Exception as e:
print(f'[Error] {e}')
def _handle_session_created(self, response):
print(f"Start session: {response['session']['id']}")
def _handle_final_text(self, response):
print(f"Final recognized text: {response['transcript']}")
def _handle_stash_text(self, response):
print(f"Got stash result: {response['stash']}")
conversation = OmniRealtimeConversation(
model='qwen3-asr-flash-realtime',
# The following URL is for the Chinese mainland. For regions outside
# the Chinese mainland, use
# wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime instead.
url='wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime',
callback=MyCallback(conversation=None) # Temporarily pass None and inject it later.
)
# Inject self into the callback.
conversation.callback.conversation = conversation
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
model | str | Oui | Modèle à utiliser. |
callback | OmniRealtimeCallback | Oui | Objet de rappel chargé de gérer les événements côté serveur. |
url | str | Oui | Endpoint WebSocket. Chine (Pékin) : wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime Singapour : wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime. Remplacez {WorkspaceId} par votre véritable ID d'espace de travail. |
Configuration de la session
Une fois connecté, appelez update_session pour définir les paramètres de session.
Cliquez pour afficher l'exemple de code
from dashscope.audio.qwen_omni import TranscriptionParams, MultiModality
transcription_params = TranscriptionParams(
language='zh',
sample_rate=16000,
input_audio_format="pcm"
)
conversation.update_session(
output_modalities=[MultiModality.TEXT],
enable_turn_detection=True,
turn_detection_type="server_vad",
turn_detection_threshold=0.0,
turn_detection_silence_duration_ms=400,
enable_input_audio_transcription=True,
transcription_params=transcription_params
)
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
output_modalities | List[MultiModality] | Oui | Modalité de sortie. Valeur fixe : [MultiModality.TEXT]. |
enable_turn_detection | bool | Non | Active la détection d'activité vocale (VAD) côté serveur. Valeur par défaut : True. Si défini sur False, appelez manuellement commit() pour déclencher la reconnaissance. |
turn_detection_type | str | Non | Type de VAD côté serveur. Valeur fixe : server_vad. |
turn_detection_threshold | float | Non | Seuil de sensibilité du VAD. Valeur par défaut : 0.2. Recommandé : 0.0. Plage valide : [-1, 1]. Des valeurs plus basses augmentent la sensibilité (risque de déclenchement sur le bruit ambiant). Des valeurs plus élevées réduisent les faux positifs dans les environnements bruyants. |
turn_detection_silence_duration_ms | int | Non | Durée de silence (ms) marquant la fin d'une phrase. Valeur par défaut : 800. Recommandé : 400. Plage valide : [200, 6000]. Une valeur faible (ex. : 300 ms) accélère la réponse mais peut scinder les pauses naturelles. Une valeur élevée (ex. : 1200 ms) gère mieux les pauses dans les phrases longues, mais augmente la latence. |
transcription_params | TranscriptionParams | Non | Paramètres de reconnaissance vocale. Consultez TranscriptionParams. |
TranscriptionParams
Définissez les paramètres de reconnaissance vocale via le constructeur TranscriptionParams.
Cliquez pour afficher l'exemple de code
transcription_params = TranscriptionParams(
language='zh',
sample_rate=16000,
input_audio_format="pcm"
)
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
language | str | Non | Langue source de l'audio. Valeurs prises en charge : zh (chinois : mandarin, sichuanais, minnan, wu), yue (cantonais), en (anglais), ja (japonais), ko (coréen), de (allemand), fr (français), es (espagnol), pt (portugais), it (italien), ru (russe), ar (arabe), hi (hindi), id (indonésien), th (thaï), tr (turc), uk (ukrainien), vi (vietnamien), cs (tchèque), da (danois), fi (finnois), fil (filipino), is (islandais), ms (malais), no (norvégien), pl (polonais), sv (suédois) |
sample_rate | int | Non | Taux d'échantillonnage audio en Hz. Valeur par défaut : 16000. Valeurs prises en charge : 16000, 8000. Avec 8000, le serveur rééchantillonne à 16 000 Hz avant la reconnaissance, ce qui peut ajouter une légère latence. N'utilisez 8000 que pour un audio source à 8 kHz, comme les enregistrements téléphoniques. |
input_audio_format | str | Non | Format audio. Valeur par défaut : pcm. Formats pris en charge : pcm, opus. |
corpus_text | str | Non | Texte contextuel, vocabulaire d'entités ou autres informations de référence pour le biaisage contextuel. Maximum : 10 000 tokens. Pour plus de détails, consultez Biaisage contextuel. |
Interfaces clés
Classe OmniRealtimeConversation
from dashscope.audio.qwen_omni import OmniRealtimeConversation
| Méthode | Événement de réponse serveur | Description |
|---|---|---|
connect() | session.created, session.updated | Établit une connexion WebSocket avec le serveur. |
update_session(...) | session.updated | Configure la session. À appeler après connect(). Si omis, les valeurs par défaut s'appliquent. Consultez la section Configuration de la session pour les paramètres. |
append_audio(audio_b64: str) | Aucun | Envoie un fragment audio encodé en Base64 au tampon d'entrée du serveur. Lorsque enable_turn_detection=True, le serveur détecte automatiquement les limites de parole et valide les données. Si enable_turn_detection=False, le client contrôle le moment de validation (max. 15 Mio par événement). Des fragments plus petits améliorent la réactivité du VAD. |
commit() | input_audio_buffer.committed | Valide l'audio mis en tampon pour la reconnaissance. Renvoie une erreur si le tampon est vide. Désactivé lorsque enable_turn_detection=True. |
end_session(timeout: int = 20) | session.finished | Termine la session une fois la reconnaissance finale effectuée par le serveur. En mode VAD (par défaut), appelez cette méthode après l'envoi de tout l'audio. En mode manuel, appelez-la après commit(). Variante asynchrone : end_session_async(). |
close() | Aucun | Arrête la tâche et ferme la connexion. |
get_session_id() | Aucun | Renvoie l'ID de la session actuelle. |
get_last_response_id() | Aucun | Renvoie l'ID de la réponse la plus récente. |
Interface OmniRealtimeCallback
Créez une sous-classe de OmniRealtimeCallback et implémentez ses méthodes pour traiter les événements serveur.
from dashscope.audio.qwen_omni import OmniRealtimeCallback
| Méthode | Paramètres | Description |
|---|---|---|
on_open() | Aucun | Appelée lors de l'établissement de la connexion WebSocket. |
on_event(message: dict) | message : un événement serveur | Appelée à la réception d'un événement serveur. |
on_close(close_status_code, close_msg) | close_status_code : code d'état ; close_msg : message de journal | Appelée lors de la fermeture de la connexion WebSocket. |