Python SDK
本文介紹如何使用智能語音交互一句話識別的Python SDK,包括SDK的安裝方法及SDK代碼示例等。
前提條件
在使用SDK前,請先閱讀接口說明,詳情請參見接口說明。
SDK僅支持Python3,暫不支持Python2。
已安裝Python包管理工具setuptools。如果未安裝,請?jiān)诮K端執(zhí)行以下命令安裝。
pip install setuptools
下載安裝
以下命令均需要在SDK根目錄中執(zhí)行。
下載Python SDK。
從Github獲取Python SDK,或直接下載streamInputTts-github-python。
安裝SDK依賴。
進(jìn)入SDK根目錄使用如下命令安裝SDK依賴:
python -m pip install -r requirements.txt
安裝SDK。
依賴安裝完成后使用如下命令安裝SDK:
python -m pip install .
安裝完成后通過以下代碼導(dǎo)入SDK。
# -*- coding: utf-8 -*- import nls
多線程和多并發(fā)
在CPython中,由于存在全局解釋器鎖,同一時刻只有一個線程可以執(zhí)行Python代碼(雖然某些性能導(dǎo)向的庫可能會去除此限制)。如果您想更好地利用多核心計(jì)算機(jī)的計(jì)算資源,推薦您使用multiprocessing或concurrent.futures.ProcessPoolExecutor。 如果您想要同時運(yùn)行多個I/O密集型任務(wù),則多線程仍然是一個合適的模型。
如果單解釋器有太多線程,將會在線程間切換造成更多消耗,有可能會導(dǎo)致SDK出現(xiàn)錯誤。不建議使用超過200線程,推薦使用multiprocessing技術(shù)或者手動使用腳本創(chuàng)建多個解釋器。
關(guān)鍵接口
一句話識別對應(yīng)的類為nls.NlsSpeechRecognizer,其核心方法如下:
1. 初始化(__init__)
參數(shù)說明
參數(shù)
類型
參數(shù)說明
url
String
網(wǎng)關(guān)WebSocket URL地址,默認(rèn)為
wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1
。appkey
String
Appkey,獲取方式請參見管理項(xiàng)目。
token
String
訪問Token,詳情可參見獲取Token概述。
on_start
Function
當(dāng)一句話識別就緒時的回調(diào)參數(shù)。回調(diào)參數(shù)包含以下兩種:
JSON形式的字符串
用戶自定義參數(shù)
其中,用戶自定義參數(shù)為下方callback_args字段中返回的參數(shù)內(nèi)容。
on_result_changed
Function
當(dāng)一句話識別返回中間結(jié)果時的回調(diào)參數(shù)。回調(diào)參數(shù)包含以下兩種:
JSON形式的字符串
用戶自定義參數(shù)
其中,用戶自定義參數(shù)為下方callback_args字段中返回的參數(shù)內(nèi)容。
on_completed
Function
當(dāng)一句話識別返回最終識別結(jié)果時的回調(diào)參數(shù)。回調(diào)參數(shù)包含以下兩種:
JSON形式的字符串
用戶自定義參數(shù)
其中,用戶自定義參數(shù)為下方callback_args字段中返回的參數(shù)內(nèi)容。
on_error
Function
當(dāng)SDK或云端出現(xiàn)錯誤時的回調(diào)參數(shù)。回調(diào)參數(shù)包含以下兩種:
JSON形式的字符串
用戶自定義參數(shù)
其中,用戶自定義參數(shù)為下方callback_args字段中返回的參數(shù)內(nèi)容。
on_close
Function
當(dāng)和云端連接斷開時的回調(diào)參數(shù)。回調(diào)參數(shù)為用戶自定義參數(shù),即用戶自定義參數(shù)為下方callback_args字段中返回的參數(shù)內(nèi)容。
callback_args
List
用戶自定義參數(shù)列表,列表中的內(nèi)容會打包(pack)成List數(shù)據(jù)結(jié)構(gòu)傳遞給各個回調(diào)的最后一個參數(shù)。
返回值:無
2. start
同步開始一句話識別,該方法會阻塞當(dāng)前線程直到一句話識別就緒(on_start回調(diào)返回)。
參數(shù)說明
參數(shù)
類型
參數(shù)說明
aformat
String
要識別音頻格式,支持PCM,OPUS,OPU,默認(rèn)值:PCM。
SDK不會自動將PCM編碼成OPUS或OPU,如果需要使用OPUS或OPU,您可自行編碼實(shí)現(xiàn)。
sample_rate
Integer
識別音頻采樣率,默認(rèn)值:16000 Hz。
ch
Integer
音頻通道數(shù),默認(rèn)值:1,目前僅支持單通道。
enable_intermediate_result
Boolean
是否返回中間結(jié)果,默認(rèn)值:False。
enable_punctuation_prediction
Boolean
是否進(jìn)行識別結(jié)果標(biāo)點(diǎn)預(yù)測,默認(rèn)值:False。
enable_inverse_text_normalization
Boolean
ITN(逆文本inverse text normalization)中文數(shù)字轉(zhuǎn)換阿拉伯?dāng)?shù)字。設(shè)置為True時,中文數(shù)字將轉(zhuǎn)為阿拉伯?dāng)?shù)字輸出,默認(rèn)值:False。
timeout
Integer
阻塞超時,默認(rèn)值:10秒。
ping_interval
Integer
Ping包發(fā)送間隔,默認(rèn)值:8秒。無需間隔可設(shè)置為0或None。
ping_timeout
Integer
設(shè)置ping包超時時間,默認(rèn)為0,即不檢查ping包超時。如果設(shè)置為x>0,則ping包發(fā)出后x秒未收到ping包則報錯超時。單位:秒。
ex
Dict
用戶提供的額外參數(shù),該字典內(nèi)容會以
key:value
形式合并進(jìn)請求的payload段中,具體可參見2.開始識別章節(jié)中的請求數(shù)據(jù)。
返回值:Boolean類型,F(xiàn)alse為失敗,True為成功。
3. stop
停止一句話識別,并同步等待on_completed回調(diào)結(jié)束。
參數(shù)說明
參數(shù)
類型
參數(shù)說明
timeout
Integer
阻塞超時,默認(rèn)值:10秒。
返回值:Boolean類型,F(xiàn)alse為失敗,True為成功。
4. shutdown
強(qiáng)行關(guān)閉當(dāng)前請求,重復(fù)調(diào)用無副作用。
參數(shù)說明:無
返回值:無
5. send_audio
發(fā)送二進(jìn)制音頻數(shù)據(jù),發(fā)送數(shù)據(jù)的格式需要和start中的aformat對應(yīng)。
參數(shù)說明
參數(shù)
類型
參數(shù)說明
pcm_data
Bytes
要發(fā)送的二進(jìn)制音頻數(shù)據(jù),格式需要和上一次調(diào)用時start中的aformat相對應(yīng)。
SDK不會自動將PCM編碼成OPUS或OPU,如果需要使用OPUS或OPU,您可自行編碼實(shí)現(xiàn)。
返回值:Boolean類型,F(xiàn)alse為失敗,True為成功。
代碼示例
本示例中使用的音頻文件為16000 Hz采樣率,PCM格式,您可以使用tests文件夾下的test1.pcm,請?jiān)谥悄苷Z音交互管控臺將Appkey對應(yīng)項(xiàng)目的模型設(shè)置為通用模型,以獲取準(zhǔn)確的識別結(jié)果;如果使用其他音頻,請?jiān)O(shè)置為支持該音頻場景的模型。關(guān)于模型設(shè)置,請參見管理項(xiàng)目。
本示例中使用SDK內(nèi)置的默認(rèn)外網(wǎng)訪問服務(wù)端URL,如果您使用阿里云上海地域的ECS,并需要通過內(nèi)網(wǎng)訪問服務(wù)端URL,請使用如下URL:
URL="ws://nls-gateway-cn-shanghai-internal.aliyuncs.com/ws/v1"
。
import time
import threading
import sys
import nls
URL="wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1"
TOKEN="yourToken" #參考http://bestwisewords.com/document_detail/450255.html獲取token
APPKEY="yourAppkey" #獲取Appkey請前往控制臺:https://nls-portal.console.aliyun.com/applist
#以下代碼會根據(jù)音頻文件內(nèi)容反復(fù)進(jìn)行一句話識別
class TestSr:
def __init__(self, tid, test_file):
self.__th = threading.Thread(target=self.__test_run)
self.__id = tid
self.__test_file = test_file
def loadfile(self, filename):
with open(filename, "rb") as f:
self.__data = f.read()
def start(self):
self.loadfile(self.__test_file)
self.__th.start()
def test_on_start(self, message, *args):
print("test_on_start:{}".format(message))
def test_on_error(self, message, *args):
print("on_error args=>{}".format(args))
def test_on_close(self, *args):
print("on_close: args=>{}".format(args))
def test_on_result_chg(self, message, *args):
print("test_on_chg:{}".format(message))
def test_on_completed(self, message, *args):
print("on_completed:args=>{} message=>{}".format(args, message))
def __test_run(self):
print("thread:{} start..".format(self.__id))
sr = nls.NlsSpeechRecognizer(
url=URL,
token=TOKEN,
appkey=APPKEY,
on_start=self.test_on_start,
on_result_changed=self.test_on_result_chg,
on_completed=self.test_on_completed,
on_error=self.test_on_error,
on_close=self.test_on_close,
callback_args=[self.__id]
)
print("{}: session start".format(self.__id))
r = sr.start(aformat="pcm", ex={"hello":123})
self.__slices = zip(*(iter(self.__data),) * 640)
for i in self.__slices:
sr.send_audio(bytes(i))
time.sleep(0.01)
r = sr.stop()
print("{}: sr stopped:{}".format(self.__id, r))
time.sleep(1)
def multiruntest(num=500):
for i in range(0, num):
name = "thread" + str(i)
t = TestSr(name, "tests/test1.pcm")
t.start()
# 設(shè)置打開日志輸出
nls.enableTrace(False)
multiruntest(1)