
# 一句话识别Websocket接口
#### 前提条件
- 确保已按照[配置Python环境](https://support.huaweicloud.com/sdkreference-sis/sis_05_0056.html)配置完毕，Python SDK仅支持Python3。
- 确保已存在待识别的音频文件。如果需要请在下载的SDK压缩包中获取示例音频。
- 该功能为1.70及以上版本SDK新增功能，使用前请检查并更新SDK版本。
- 请参考[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)获取最新版本SDK包。
 
#### 初始化Client
初始化SasrWebsocketClient详见[表 SasrWebsocketClient初始化参数]。
 表1SasrWebsocketClient初始化参数 
| 参数名称             | 是否必选 | 参数类型    | 描述                                                                                            |
|:---|:---|:---|:---|
| ak               | 是    | String  | 用户的ak，请参考[AK/SK认证](https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html)。        |
| sk               | 是    | String  |  用户的sk，请参考[AK/SK认证](https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html)。 |
| use_aksk         | 是    | Boolean | 使用ak、sk要填写true。                                                                               |
| region           | 是    | String  | 区域，如：cn-north-4。具体请参考[终端节点](https://support.huaweicloud.com/api-sis/sis_03_0004.html)。        |
| project_id       | 是    | String  | 项目ID，同region一一对应，参考[获取项目ID](https://support.huaweicloud.com/api-sis/sis_03_0008.html)。        |
| callback         | 是    | Object  | 回调类RasrCallBack，用于监听Websocket连接、响应、断开、错误等。                                                    |
| config           | 否    | Object  | 详见[表 SisConfig]。                                           |
| service_endpoint | 否    | String  | 终端节点，一般使用默认即可。                                                                                |
   
 表2SisConfig 
| 参数名称                 | 是否必选 | 参数类型    | 描述                         |
|:---|:---|:---|:---|
| connect_timeout      | 否    | Integer | 连接超时，默认10，单位s。             |
| read_timeout         | 否    | Integer | 读取超时，默认10，单位s。             |
| connect_lost_timeout | 否    | Integer | 连接失效超时，默认4，单位s。一般不要修改这个参数。 |
   
#### 请求参数
请求类为SasrWebsocketRequest，详见[表 SasrWebsocketRequest]。
 表3SasrWebsocketRequest 
| 参数名称            | 是否必选 | 参数类型   | 描述                                                                                                                                 |
|:---|:---|:---|:---|
| audio_format    | 是    | String | 音频格式，支持pcm，alaw，ulaw等，如pcm8k16bit，具体规格请参见《API参考》中[开始识别](https://support.huaweicloud.com/api-sis/sis_03_0030.html)章节。               |
| property        | 是    | String | 属性字符串，language_sampleRate_domain， 如chinese_8k_common，参见《API参考》中[开始识别](https://support.huaweicloud.com/api-sis/sis_03_0030.html)章节。 |
| add_punc        | 否    | String | 表示是否在识别结果中添加标点，取值为yes 、 no，默认no。                                                                                                   |
| digit_norm      | 否    | String | 表示是否将语音中的数字识别为阿拉伯数字，取值为yes 、 no，默认为yes。                                                                                            |
| interim_results | 否    | String | 是否显示中间结果，yes 或 no，默认no。                                                                                                            |
| vocabulary_id   | 否    | String | 热词表id，若没有则不填，详见[创建热词表](https://support.huaweicloud.com/api-sis/sis_03_0071.html)。                                                  |
| need_word_info  | 否    | String | 表示是否在识别结果中输出分词结果信息，取值为"yes"和"no"，默认为"no"。                                                                                          |
   
#### 响应参数
Python SDK响应结果为Json格式，详见[表4]。调用失败处理方法请参见[错误码](https://support.huaweicloud.com/api-sis/sis_03_0045.html)。
 表4响应结果 
| 参数名称      | 是否必选 | 参数类型             | 描述                                              |
|:---|:---|:---|:---|
| resp_type | 是    | String           | 参数值为RESULT，表示识别结果响应。                            |
| trace_id  | 是    | String           | 服务内部的令牌，可用于在日志中追溯具体流程。                          |
| segments  | 是    | Array of objects | 多句结果。详见[表5]。 |
   
 表5Segment 
| 参数名称       | 是否必选 | 参数类型    | 描述                                                     |
|:---|:---|:---|:---|
| start_time | 是    | Integer | 一句的起始时间戳，单位为ms。                                        |
| end_time   | 是    | Integer | 一句的结束时间戳，单位为ms。                                        |
| is_final   | 是    | Boolean | true表示是最终结果， false表示为中间临时结果。                           |
| result     | 是    | Object  | 调用成功表示识别结果，详见[表6]。 |
   
 表6Result 
| 参数名称      | 是否必选 | 参数类型             | 描述                                             |
|:---|:---|:---|:---|
| text      | 是    | String           | 识别结果。                                          |
| score     | 是    | Float            | 识别结果的置信度（0-1之间）。此值仅会在最终结果时被赋值，在中间结果时统一置为"0.0"。 |
| word_info | 否    | Array of objects | 分词信息列表。                                        |
   
表7Word_info 
| 参数名        | 是否必选 | 参数类型    | 说明   |
|:---|:---|:---|:---|
| start_time | 否    | Integer | 起始时间 |
| end_time   | 否    | Integer | 结束时间 |
| word       | 否    | String  | 分词   |
   
#### 代码示例
如下示例仅供参考，最新代码请前往[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)章节获取并运行。
```
# -*- coding: utf-8 -*-
from huaweicloud_sis.client.asr_client import SasrWebsocketClient
from huaweicloud_sis.bean.asr_request import SasrWebsocketRequest
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
# 一句话识别参数
path = ''           # 需要发送音频路径，如D:/test.pcm, 同时sdk也支持byte流发送数据。
audio_format = ''   # 音频支持格式，如pcm16k16bit，详见api文档
property = ''       # 属性字符串，language_sampleRate_domain, 如chinese_16k_common, 采样率要和音频一致。详见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('websocket 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 sasr_websocket_example():
    """ 一句话识别 websocket demo """
    # step1 初始化SasrWebsocketClient, 暂不支持使用代理
    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暂时不支持使用代理
    sasr_websocket_client = SasrWebsocketClient(ak=ak, sk=sk, use_aksk=True, region=region, project_id=project_id,
                                                callback=my_callback, config=config)
    try:
        # step2 构造请求
        request = SasrWebsocketRequest(audio_format, property)
        # 所有参数均可不设置，使用默认值
        request.set_add_punc('yes')  # 设置是否添加标点， yes or no， 默认no
        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 连接服务端
        sasr_websocket_client.sasr_stream_connect(request)
        # use enterprise_project_Id
        # headers = {'Enterprise-Project-Id': 'your enterprise project id'}
        # sasr_websocket_client.sasr_stream_connect(request, headers)
        # step4 发送音频
        sasr_websocket_client.send_start()
        # 连续模式下，可多次发送音频，发送格式为byte数组
        with open(path, 'rb') as f:
            data = f.read()
            sasr_websocket_client.send_audio(data)  # 可选byte_len和sleep_time参数，建议使用默认值
        sasr_websocket_client.send_end()
    except Exception as e:
        print('sasr websocket error', e)
    finally:
        # step5 关闭客户端，使用完毕后一定要关闭，否则服务端20s内没收到数据会报错并主动断开。
        sasr_websocket_client.close()
if __name__ == '__main__':
    sasr_websocket_example()
```
