科大讯飞新版语音唤醒Python调用
背景:
科大讯飞旧版语音唤醒付费基础包是8000元、新版基础包是2500元。目前项目这边不需要太多装机量,只是需要利用唤醒能力,所以选择便宜的方案接入新版唤醒。其次新版唤醒的唤醒词是可以随时变更的,旧版的唤醒词和SDK绑定,更换唤醒词就需要重新下载SDK替换并重新打包。相比下新版唤醒更具“性价比”。但是网上只能找到旧版唤醒的代码。只能自己尝试实现python调用。
购买:
1、打开语音唤醒(新版)_语音唤醒接入-讯飞开放平台
2、选择免费使用并立即购买(有效期30天)

下载SDK:
1、购买后打开控制台-讯飞开放平台
2、点击下载Windows SDK
下载后解压,目录接口如下:
①将libs下64位(或者32位)的AEE_lib.dll复制到我们自己的项目kws/new/libs/下
②将libs下64位(或者32位)的ef7d69542_v1014_aee.dll复制到我们自己的项目根目录下
③将bin/resource/ivw70下的所有文件复制到我们自己项目的kws/new/resource/下并将xbxb.txt重名名位keyword.txt
我们自己项目的目录结构如下(只需关注我圈起来的部分):
修改配置:
同样在控制台控制台-讯飞开放平台获取自己的认证信息,并将代码中的appId、apiKey、apiSecret替换即可
如果上面的动态链接库(DLL)以及资源文件没有按照我的目录放置的话,只需要修该代码中响应的配置即可
# =======定义初始化参数=========
param = AIKIT_InitParam()
# 离线授权类型(0或1),0-->(默认)设备级授权(DEVICE)和 1-->应用级授权(APP)
param.authType = c_int(0)
# 应用ID
param.appID = b"自己的APPID"
# 离线引擎托管平台创建应用后,生成的唯一应用标识
param.apiKey = b"自己的APIKEY"
# 离线引擎托管平台创建应用后,生成的唯一应用秘钥
param.apiSecret = b"自己的APISECRET"
# SDK工作目录,默认授权缓存、读取能力资源、写SDK日志在此路径下
work_dir = get_resource_path("kws/work_dir").encode('utf-8')
param.workDir = work_dir
# 指定资源读取路径,不设置默认从workDir读取
res_dir = get_resource_path("kws/new/resource").encode('utf-8')
param.resDir = res_dir
# =======设置授权时间间隔=========
ret = dll.AIKIT_SetAuthCheckInterval(600)
if ret != 0:
logger.error(f"AIKIT_SetAuthCheckInterval failed: {ret}\n")
return
logger.info(f"AIKIT_SetAuthCheckInterval: {ret}\n")
# =======SDK初始化=========
ret = dll.AIKIT_Init(byref(param))
if (ret != 0):
logger.error(f"AIKIT_Init failed: {ret}\n")
return
logger.info(f"AIKIT_Init: {ret}\n")
完整代码:
kws_server_new.py
import pyaudio
import os
from ctypes import CFUNCTYPE, POINTER, Structure, addressof, byref, c_bool, c_char, c_char_p, cdll, c_int, c_int32, c_size_t, c_uint32, c_void_p, cast, create_string_buffer, windll
from loguru import logger
def get_resource_path(relative_path):
if "NUITKA_ONEFILE_BINARY" in os.environ:
logger.info('Running in nuitka onefile mode.')
tmp_path = os.environ["TEMP"] or os.environ["TMP"]
if tmp_path:
return os.path.join(tmp_path, relative_path)
else:
return os.path.join(".", relative_path)
else:
logger.info('Running in development mode.')
return os.path.join(os.path.abspath('.'), relative_path)
# 加载动态链接库
msc_load_library = get_resource_path('kws/new/libs/AEE_lib.dll')
dll = cdll.LoadLibrary(msc_load_library)
# 能力ID
ABILITY = b"e867a88f2"
# 定义回调函数
def on_output(handle, output):
"""输出数据回调
Args:
handle (AIKIT_HANDLE*): 会话hand
作者:qq_30035723