实时语音识别
前提条件
- 确保已按照配置Python环境配置完毕,Python SDK仅支持Python3。
- 确保已存在待识别的音频文件。如果需要请在下载的SDK压缩包中获取示例音频。
- 请参考SDK(websocket)获取最新版本SDK包。
初始化Client
初始化RasrClient详见表 RasrClient初始化参数。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
ak |
是 |
String |
用户的ak,请参考AK/SK认证。 |
sk |
是 |
String |
用户的sk,请参考AK/SK认证。 |
use_aksk |
是 |
Boolean |
使用ak、sk要填写true。 |
region |
是 |
String |
区域,如:cn-north-4。具体请参考终端节点。 |
project_id |
是 |
String |
项目ID,同region一一对应,参考获取项目ID。 |
callback |
是 |
Object |
回调类RasrCallBack,用于监听Websocket连接、响应、断开、错误等。参考代码示例。 |
config |
否 |
Object |
详见表2。 |
service_endpoint |
否 |
String |
终端节点,一般使用默认即可。 |
请求参数
请求类为RasrRequest,详见表3。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
audio_format |
是 |
String |
音频格式,支持pcm,alaw,ulaw等,如pcm8k16bit,参见《API参考》中开始识别章节。 |
model_property |
是 |
String |
属性字符串,language_sampleRate_domain, 如chinese_16k_general,参见《API参考》中开始识别章节。 |
add_punc |
否 |
String |
表示是否在识别结果中添加标点,取值为yes 、 no,默认no。 |
digit_norm |
否 |
String |
表示是否将语音中的数字识别为阿拉伯数字,取值为yes 、 no,默认为yes。 |
vad_head |
否 |
Integer |
头部最大静音时间,[0, 60000],默认10000ms。 |
vad_tail |
否 |
Integer |
尾部最大静音时间,[0, 3000],默认500ms。 |
max_seconds |
否 |
Integer |
音频最长持续时间, [1, 60],默认30s。 |
interim_results |
否 |
String |
是否显示中间结果,yes 或 no,默认no。例如分3次发送音频,选择no结果一次性返回,选择yes分三次返回。 |
vocabulary_id |
否 |
String |
热词表id,若没有则不填。 |
need_word_info |
否 |
String |
表示是否在识别结果中输出分词结果信息,取值为“yes”和“no”,默认为“no”。 |
响应参数
Python SDK响应结果为Json格式,详见表4。调用失败处理方法请参见错误码。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
resp_type |
是 |
String |
参数值为RESULT,表示识别结果响应。 |
trace_id |
是 |
String |
服务内部的令牌,可用于在日志中追溯具体流程。 |
segments |
是 |
Array of objects |
多句结果。详见表5。 |
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
start_time |
是 |
Integer |
一句的起始时间戳,单位为ms。 |
end_time |
是 |
Integer |
一句的结束时间戳,单位为ms。 |
is_final |
是 |
Boolen |
true表示是最终结果, false表示为中间临时结果。 |
result |
是 |
Object |
调用成功表示识别结果,详见表6。 |
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
text |
是 |
String |
识别结果。 |
score |
是 |
Float |
识别结果的置信度(0-1之间)。此值仅会在最终结果时被赋值,在中间结果时统一置为“0.0”。 |
word_info |
否 |
Array of objects |
分词信息列表。 |
参数名 |
是否必选 |
参数类型 |
说明 |
---|---|---|---|
start_time |
否 |
Integer |
起始时间 |
end_time |
否 |
Integer |
结束时间 |
word |
否 |
String |
分词 |
代码示例
如下示例仅供参考,最新代码请前往SDK(websocket)章节获取并运行。
# -*- coding: utf-8 -*- from huaweicloud_sis.client.rasr_client import RasrClient from huaweicloud_sis.bean.rasr_request import RasrRequest from huaweicloud_sis.bean.callback import RasrCallBack from huaweicloud_sis.bean.sis_config import SisConfig import json import os # 鉴权参数 # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SIS_AK/HUAWEICLOUD_SIS_SK ak = os.getenv("HUAWEICLOUD_SIS_AK") # 从环境变量获取ak 参考https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html assert ak is not None, "Please add ak in your develop environment" sk = os.getenv("HUAWEICLOUD_SIS_SK") # 从环境变量获取sk 参考https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html assert sk is not None, "Please add sk in your develop environment" project_id = "" # project id 同region一一对应,参考https://support.huaweicloud.com/api-sis/sis_03_0008.html region = 'cn-north-4' # region,如cn-north-4 """ todo 请正确填写音频格式和模型属性字符串 1. 音频格式一定要相匹配. 例如音频是pcm格式,并且采样率为8k,则格式填写pcm8k16bit。 如果返回audio_format is invalid 说明该文件格式不支持。具体支持哪些音频格式,需要参考一些api文档。 2. 音频采样率要与属性字符串的采样率要匹配。 例如格式选择pcm16k16bit,属性字符串却选择chinese_8k_common, 则会返回'audio_format' is not match model """ # 实时语音识别参数 path = '' # 需要发送音频路径,如D:/test.pcm, 同时sdk也支持byte流发送数据。 audio_format = 'pcm16k16bit' # 音频支持格式,如pcm16k16bit,详见api文档 property = 'chinese_16k_general' # 属性字符串,language_sampleRate_domain, 如chinese_16k_general, 采样率要和音频一致。详见api文档 class MyCallback(RasrCallBack): """ 回调类,用户需要在对应方法中实现自己的逻辑,其中on_response必须重写 """ def on_open(self): """ websocket连接成功会回调此函数 """ print('websocket connect success') def on_start(self, message): """ websocket 开始识别回调此函数 :param message: 传入信息 :return: - """ print('webscoket start to recognize, %s' % message) def on_response(self, message): """ websockert返回响应结果会回调此函数 :param message: json格式 :return: - """ print(json.dumps(message, indent=2, ensure_ascii=False)) def on_end(self, message): """ websocket 结束识别回调此函数 :param message: 传入信息 :return: - """ print('websocket is ended, %s' % message) def on_close(self): """ websocket关闭会回调此函数 """ print('websocket is closed') def on_error(self, error): """ websocket出错回调此函数 :param error: 错误信息 :return: - """ print('websocket meets error, the error is %s' % error) def on_event(self, event): """ 出现事件的回调 :param event: 事件名称 :return: - """ print('receive event %s' % event) def rasr_example(): """ 实时语音识别demo """ # step1 初始化RasrClient, 暂不支持使用代理 my_callback = MyCallback() config = SisConfig() # 设置连接超时,默认是10 config.set_connect_timeout(10) # 设置读取超时, 默认是10 config.set_read_timeout(10) # 设置connect lost超时,一般在普通并发下,不需要设置此值。默认是10 config.set_connect_lost_timeout(10) # websocket暂时不支持使用代理 rasr_client = RasrClient(ak=ak, sk=sk, use_aksk=True, region=region, project_id=project_id, callback=my_callback, config=config) try: # step2 构造请求 request = RasrRequest(audio_format, property) # 所有参数均可不设置,使用默认值 request.set_add_punc('yes') # 设置是否添加标点, yes or no, 默认no request.set_vad_head(10000) # 设置有效头部, [0, 60000], 默认10000 request.set_vad_tail(500) # 设置有效尾部,[0, 3000], 默认500 request.set_max_seconds(30) # 设置一句话最大长度,[1, 60], 默认30 request.set_interim_results('no') # 设置是否返回中间结果,yes or no,默认no request.set_digit_norm('no') # 设置是否将语音中数字转写为阿拉伯数字,yes or no,默认yes # request.set_vocabulary_id('') # 设置热词表id,若不存在则不填写,否则会报错 request.set_need_word_info('no') # 设置是否需要word_info,yes or no, 默认no # step3 选择连接模式 # rasr_client.short_stream_connect(request) # 流式一句话模式 # rasr_client.sentence_stream_connect(request) # 实时语音识别单句模式 rasr_client.continue_stream_connect(request) # 实时语音识别连续模式 # use enterprise_project_Id # headers = {'Enterprise-Project-Id': 'your enterprise project id'} # rasr_client.continue_stream_connect(request, headers) # step4 发送音频 rasr_client.send_start() # 连续模式下,可多次发送音频,发送格式为byte数组 with open(path, 'rb') as f: data = f.read() rasr_client.send_audio(data) # 可选byte_len和sleep_time参数,建议使用默认值 rasr_client.send_end() except Exception as e: print('rasr error', e) finally: # step5 关闭客户端,使用完毕后一定要关闭,否则服务端20s内没收到数据会报错并主动断开。 rasr_client.close() if __name__ == '__main__': rasr_example()