实时语音识别(Qwen-ASR-Realtime)
实时语音识别(Qwen-ASR-Realtime)Python SDK-API参考
本文档介绍如何使用 DashScope Python SDK 调用实时语音识别(Qwen-ASR-Realtime)模型。
阿里云百炼为华北2(北京)、新加坡地域推出了业务空间专属域名,能够为推理请求提供卓越的性能和更高的稳定性,建议迁移至新域名:
- 华北2(北京)地域:从
dashscope.aliyuncs.com 迁移至 {WorkspaceId}.cn-beijing.maas.aliyuncs.com
- 新加坡地域:从
dashscope-intl.aliyuncs.com 迁移至 {WorkspaceId}.ap-southeast-1.maas.aliyuncs.com
{WorkspaceId}需要替换为真实的Workspace ID。现有域名仍可正常使用。
用户指南:模型介绍、功能特性和完整示例代码请参见实时语音识别
前提条件
- 安装SDK,确保DashScope SDK版本不低于1.25.6。
- 获取与配置 API Key。
- 了解WebSocket API。
请求参数
-
以下参数通过
OmniRealtimeConversation的构造方法设置。
class MyCallback(OmniRealtimeCallback):
"""实时识别回调处理"""
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',
# 以下为华北2(北京)地域的配置,调用时请将"{WorkspaceId}"替换为真实的业务空间ID,各地域的配置不同。
url='wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime',
callback=MyCallback(conversation=None) # 暂时传None,稍后注入
)
# 注入自身到回调
conversation.callback.conversation = conversation
参数 | 类型 | 是否必须 | 说明 |
|---|
model
| str
| 是 | 指定要使用的模型名称。 |
callback
| OmniRealtimeCallback
| 是 | 用于处理服务端事件的回调对象实例。 |
url
| str
| 是 | 语音识别服务地址: 华北2(北京)地域:wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/realtime。调用时请将{WorkspaceId}替换为真实的Workspace ID。 新加坡地域:wss://{WorkspaceId}.ap-southeast-1.maas.aliyuncs.com/api-ws/v1/realtime。调用时请将{WorkspaceId}替换为真实的业务空间ID。
|
-
以下参数通过
OmniRealtimeConversation的update_session方法设置。
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
)
参数 | 类型 | 是否必须 | 说明 |
|---|
output_modalities
| List[MultiModality]
| 是 | 模型输出模态,固定为[MultiModality.TEXT]。 |
enable_turn_detection
| bool
| 否 | 是否开启服务端语音活动检测(VAD)。关闭后,需手动调用commit()方法触发识别。 默认值:True。 取值范围: |
turn_detection_type
| str
| 否 | 服务端VAD类型,固定为 server_vad。 |
turn_detection_threshold
| float
| 否 | VAD检测阈值。推荐将该值设为0.0。 默认值:0.5。 取值范围:[-1, 1]。 较低的阈值会提高 VAD 的灵敏度,可能将背景噪音误判为语音。较高的阈值则降低灵敏度,有助于在嘈杂环境中减少误触发。 |
turn_detection_silence_duration_ms
| int
| 否 | VAD断句检测阈值(ms)。静音持续时长超过该阈值将被认为是语句结束。推荐将该值设为400。 默认值:800。 取值范围:[200, 6000]。 较低的值(如 300ms)可使模型更快响应,但可能导致在自然停顿处发生不合理的断句。较高的值(如 1200ms)可更好地处理长句内的停顿,但会增加整体响应延迟。 |
transcription_params
| TranscriptionParams
| 否 | 语音识别相关配置。 |
-
以下参数通过
TranscriptionParams的构造方法设置。
transcription_params = TranscriptionParams(
language='zh',
sample_rate=16000,
input_audio_format="pcm"
)
参数 | 类型 | 是否必须 | 说明 |
|---|
language
| str
| 否 | 音频源语言。 zh:中文(普通话、四川话、闽南语、吴语) yue:粤语 en:英文 ja:日语 de:德语 ko:韩语 ru:俄语 fr:法语 pt:葡萄牙语 ar:阿拉伯语 it:意大利语 es:西班牙语 hi:印地语 id:印尼语 th:泰语 tr:土耳其语 uk:乌克兰语 vi:越南语 cs:捷克语 da:丹麦语 fil:菲律宾语 fi:芬兰语 is:冰岛语 ms:马来语 no:挪威语 pl:波兰语 sv:瑞典语
|
sample_rate
| int
| 否 | 音频采样率(Hz)。支持16000和8000。 默认值:16000。 设置为 8000 时,服务端会先升采样到16000Hz再进行识别,可能引入微小延迟。建议仅在源音频为8000Hz(如电话线路)时使用。 |
input_audio_format
| str
| 否 | |
关键接口
OmniRealtimeConversation类
OmniRealtimeConversation通过from dashscope.audio.qwen_omni import OmniRealtimeConversation方法引入。
| 方法签名 | 服务端响应事件(通过回调下发) | 说明 |
|---|
def connect(self,) -> None:
| session.created
会话已创建
session.updated
会话配置已更新
| 和服务端创建连接。 |
def update_session(self,
output_modalities: List[MultiModality],
voice: str = None,
input_audio_format: AudioFormat = AudioFormat.PCM_16000HZ_MONO_16BIT,
output_audio_format: AudioFormat = AudioFormat.PCM_24000HZ_MONO_16BIT,
enable_input_audio_transcription: bool = True,
input_audio_transcription_model: str = None,
enable_turn_detection: bool = True,
turn_detection_type: str = 'server_vad',
prefix_padding_ms: int = 300,
turn_detection_threshold: float = 0.2,
turn_detection_silence_duration_ms: int = 800,
turn_detection_param: dict = None,
translation_params: TranslationParams = None,
transcription_params: TranscriptionParams = None,
**kwargs) -> None:
| session.updated
会话配置已更新
| 用于更新会话配置,建议在连接建立后首先调用该方法进行设置。若未调用该方法,系统将使用默认配置。只需关注请求参数中的涉及到的参数。 |
def append_audio(self, audio_b64: str) -> None:
| 无 | 将Base64编码后的音频数据片段追加到云端输入音频缓冲区。
- 请求参数
enable_turn_detection设为True,音频缓冲区用于检测语音,服务端决定何时提交。
- 请求参数
enable_turn_detection设为False,客户端可以选择每个事件中放置多少音频量,最多放置 15 MiB。 例如,从客户端流式处理较小的数据块可以让 VAD 响应更迅速。
|
def commit(self, ) -> None:
| input_audio_buffer.committed
服务端收到提交的音频
| 提交之前通过append添加到云端缓冲区的音视频,如果输入的音频缓冲区为空将产生错误。禁用场景:请求参数enable_turn_detection设为True时。 |
def end_session(self, timeout: int = 20) -> None:
| session.finished
服务端完成语音识别,结束会话
| 通知服务端结束会话,服务端收到会话结束通知后将完成最后的语音识别。调用时机:end_session_async 是 end_session 的异步版本,两者功能完全相同。 |
def close(self, ) -> None:
| 无 | 终止任务,并关闭连接。 |
def get_session_id(self) -> str:
| 无 | 获取当前任务的session_id。 |
def get_last_response_id(self) -> str:
| 无 | 获取最近一次response的response_id。 |
回调接口(OmniRealtimeCallback)
服务端会通过回调的方式,将服务端响应事件和数据返回给客户端。
继承此类并实现相应方法以处理服务端事件。
通过from dashscope.audio.qwen_omni import OmniRealtimeCallback引入。
| 方法签名 | 参数 | 说明 |
|---|
def on_open(self) -> None:
| 无 | WebSocket连接成功建立时触发。 |
def on_event(self, message: dict) -> None:
| message:服务端事件 | 收到服务端事件时触发。 |
def on_close(self, close_status_code, close_msg) -> None:
| close_status_code:状态码close_msg:WebSocket连接关闭时的日志信息 | WebSocket连接关闭时触发。 |