Python SDK 可发送音频,并通过回调获取一句话识别结果。
前提条件
已准备 Python 3 环境。SDK 不支持 Python 2。
已获取项目 Appkey 和访问 Token。Appkey 的获取和模型配置请参见项目管理,Token 的获取请参见获取 Token。
服务协议和音频要求请参见一句话识别接口说明。
下载安装
从GitHub获取源码,或下载NLS Python SDK 压缩包并解压。
-
安装
setuptools。python -m pip install setuptools -
在 SDK 根目录安装依赖和 SDK。
python -m pip install -r requirements.txt python -m pip install . -
在代码中导入 SDK。
import nls
代码示例
示例使用 Python 3.12 和 SDK 包版本 1.1.0,将 SDK 包内 tests/test1.pcm 的音频发送到一句话识别服务。
音频为 16000 Hz、16 位、单声道 PCM。为 Appkey 对应的项目配置通用模型;使用其他音频时,选择与其语种、采样率和场景匹配的模型。配置方法请参见项目管理。
配置环境变量
NLS_APP_KEY和NLS_TOKEN,分别填入项目 Appkey 和访问 Token。这两个变量由示例代码读取。将
AUDIO_FILE设置为test1.pcm的本地路径。
示例通过外网地址访问服务。使用上海地域 ECS 并需要内网访问时,将 URL 改为 ws://nls-gateway-cn-shanghai-internal.aliyuncs.com/ws/v1。
import json
import os
import threading
import time
import nls
APPKEY = os.environ["NLS_APP_KEY"]
TOKEN = os.environ["NLS_TOKEN"]
URL = "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
AUDIO_FILE = "tests/test1.pcm"
ready = threading.Event()
finished = threading.Event()
def on_start(message, *args):
ready.set()
def on_completed(message, *args):
result = json.loads(message)
print("Recognition result:", result["payload"]["result"])
finished.set()
def on_error(message, *args):
print("Recognition failed:", message)
finished.set()
def on_close(*args):
finished.set()
nls.enableTrace(False) # 关闭 SDK 调试日志
with open(AUDIO_FILE, "rb") as audio:
recognizer = nls.NlsSpeechRecognizer(
url=URL,
appkey=APPKEY,
token=TOKEN,
on_start=on_start,
on_completed=on_completed,
on_error=on_error,
on_close=on_close,
)
try:
recognizer.start(aformat="pcm", sample_rate=16000)
if ready.is_set() and not finished.is_set():
while not finished.is_set():
chunk = audio.read(640)
if not chunk:
break
recognizer.send_audio(chunk)
time.sleep(0.02)
if not finished.is_set():
recognizer.stop()
finally:
recognizer.shutdown()
关键接口
一句话识别客户端为 nls.NlsSpeechRecognizer。以下说明对应 SDK 包版本 1.1.0。
初始化(__init__)
创建客户端,设置凭证、网关和回调。
|
参数 |
类型 |
说明 |
|
|
str |
网关 WebSocket 地址。默认值为 |
|
|
str |
项目 Appkey。获取方法请参见项目管理。 |
|
|
str |
访问 Token。获取方法请参见获取 Token。 |
|
|
callable |
收到 |
|
|
callable |
返回中间识别结果时调用。需要在 |
|
|
callable |
正常完成识别、返回最终识别结果时调用。 |
|
|
callable |
收到服务端 |
|
|
callable |
与服务端的连接关闭时调用。 |
|
|
list |
自定义参数列表。列表元素按顺序展开,传给各回调的 |
除 on_close 外,回调的第一个参数为 JSON 格式的消息字符串,其后为展开的 callback_args。on_close 只接收展开的自定义参数。例如,callback_args=["example"] 时,消息回调接收 callback(message, "example"),关闭回调接收 on_close("example")。
客户端参数校验、连接或调用超时等错误还可能通过异常报告,应在调用代码中处理。
start
同步启动识别。正常启动时,阻塞至 on_start 回调返回;服务端拒绝启动时,通过 on_error 报告失败。识别就绪后再发送音频。
|
参数 |
类型 |
说明 |
|
|
str |
音频格式,默认值为 |
|
|
int |
音频采样率,默认值为 16000,单位为 Hz。 |
|
|
int |
声道数。默认值为 1,仅支持单声道。 |
|
|
bool |
是否返回中间识别结果,默认值为 |
|
|
bool |
是否预测识别结果的标点,默认值为 |
|
|
bool |
是否开启逆文本规整(ITN)。设置为 |
|
|
int |
等待启动的超时时间,默认值为 10,单位为秒。 |
|
|
int 或 None |
发送 Ping 的间隔,默认值为 8,单位为秒。设置为 |
|
|
int 或 None |
等待 Pong 的超时时间,单位为秒。默认值为 |
|
|
dict |
额外请求参数,按键值对合并到请求的 |
正常返回值为 None。识别就绪通过 on_start 通知,服务端拒绝启动通过 on_error 报告;等待超时会抛出异常。
send_audio
发送二进制音频。识别须已就绪,数据格式与start 的 aformat 一致。SDK 不进行 PCM 到 OPUS 或 OPU 的自动编码。
|
参数 |
类型 |
说明 |
|
|
bytes |
要发送的非空二进制音频数据,格式与 |
正常返回值为 None。未启动识别或数据为空时,会抛出异常。
stop
结束音频发送,并同步等待会话结束。正常完成时通过 on_completed 返回最终结果;服务端任务失败时通过 on_error 报告错误。
|
参数 |
类型 |
说明 |
|
|
int |
等待会话结束的超时时间,默认值为 10,单位为秒。 |
正常返回值为 None。等待超时会抛出异常。
shutdown
强制关闭已启动的请求,重复调用无副作用。无参数,返回值为 None。
多线程和多并发
在启用全局解释器锁(GIL)的 CPython 环境中,同一时刻只有一个线程执行 Python 代码,部分性能库可以释放 GIL。需要利用多核计算资源时,推荐使用multiprocessing 或concurrent.futures.ProcessPoolExecutor。同时运行多个 I/O 密集型任务时,多线程仍是合适的方式。
单个解释器的线程过多,会增加线程切换开销,也可能导致 SDK 出错。不建议使用超过 200 个线程,推荐使用multiprocessing,或通过脚本创建多个解释器。