
# 录音文件识别
#### 前提条件
- 确保已按照[配置Python环境](https://support.huaweicloud.com/sdkreference-sis/sis_05_0056.html)配置完毕，Python SDK仅支持Python3。
- 确保已存在待识别的音频文件并上传OBS或者有公网可访问服务器上（需保证可使用域名访问），示例音频可参考下载SDK压缩包文件。如果音频存放在OBS上，确保服务已授权访问OBS，可参考[配置OBS服务](https://support.huaweicloud.com/api-sis/sis_03_0047.html)。
- 请参考[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)获取最新版本SDK包。
 
#### 初始化Client
初始化AsrCustomizationClient详见[表 AsrCustomizationClient初始化参数]。
 表1AsrCustomizationClient初始化参数 
| 参数名称             | 是否必选 | 参数类型   | 描述                                                                                     |
|:---|:---|:---|:---|
| 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)。 |
| 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)。 |
| service_endpoint | 否    | String | 终端节点，一般使用默认即可。                                                                         |
| sis_config       | 否    | Object | 详见[表2]。                                             |
   
 表2SisConfig 
| 参数名称            | 是否必选 | 参数类型    | 描述                                                   |
|:---|:---|:---|:---|
| connect_timeout | 否    | Integer | 连接超时，默认10，单位s。                                       |
| read_timeout    | 否    | Integer | 读取超时，默认10，单位s。                                       |
| proxy           | 否    | List    | \[host, port\] 或 \[host, port, username, password\]。 |
   
#### 请求参数
请求类为AsrCustomLongRequest，详见[表3]。
 表3AsrCustomLongRequest 
| 参数名称               | 是否必选 | 参数类型             | 描述                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| data_url           | 是    | String           | 存放录音文件地址： - 推荐使用华为云OBS：授权配置请参见[OBS配置](https://support.huaweicloud.com/api-sis/sis_03_0047.html)。  - 您也可以把录音文件放在自行搭建服务器上，提供下载文件的地址。URL不能使用IP地址，只能使用域名，请尽量避免中文   |
| audio_format       | 是    | String           | 音频格式，具体信息请参见《API参考》中[录音文件识别](https://support.huaweicloud.com/api-sis/sis_03_0092.html)章节。                                                                                                                                                                                                                                                               |
| property           | 是    | String           | 属性字符串，语言_采样率_模型，如chinese_8k_common。具体信息请参见《API参考》中[录音文件识别](https://support.huaweicloud.com/api-sis/sis_03_0092.html)章节。                                                                                                                                                                                                                                 |
| add_punc           | 否    | String           | 表示是否在识别结果中添加标点，取值为yes 、 no，默认no。                                                                                                                                                                                                                                                                                                                        |
| digit_norm         | 否    | String           | 表示是否将语音中的数字识别为阿拉伯数字，取值为yes 、 no，默认为yes。                                                                                                                                                                                                                                                                                                                 |
| need_analysis_info | 否    | Boolean          | 是否选择分析信息。 如果选择false，则声道、话者分离、情绪检测、速度信息均无效。默认false。 该参数用于设置质检分析参数，是否需要输出质检分析内容以及会议场景多说话人分离，如果为false，表示不需要。                                                                                                                                                                                     |
| diarization        | 否    | Boolean          | 是否需要话者分离，表示识别结果会包含role项，默认true。                                                                                                                                                                                                                                                                                                                         |
| channel            | 否    | String           | 语音文件声道信息，可以为MONO（缺省), LEFT_AGENT， RIGHT_AGENT。默认MONO，详见[提交录音文件识别任务](https://support.huaweicloud.com/api-sis/sis_03_0092.html)。                                                                                                                                                                                                                          |
| emotion            | 否    | Boolean          | 是否需要做情绪检测，默认true，详见[提交录音文件识别任务](https://support.huaweicloud.com/api-sis/sis_03_0092.html)。                                                                                                                                                                                                                                                              |
| speed              | 否    | Boolean          | 是否需要输出语速信息，默认true。                                                                                                                                                                                                                                                                                                                                      |
| vocabulary_id      | 否    | String           | 热词表id，不使用则不填写。 创建热词表请参考《API参考》中[创建热词表](https://support.huaweicloud.com/api-sis/sis_03_0071.html)章节。                                                                                                                                                                                                                       |
| need_word_info     | 否    | Array of objects | 分词信息列表。                                                                                                                                                                                                                                                                                                                                                 |
   
#### 响应参数
Python SDK响应结果为Json格式，详见[表4]。调用失败处理方法请参见[错误码](https://support.huaweicloud.com/api-sis/sis_03_0045.html)。
 表4响应结果 
| 参数名称           | 是否必选 | 参数类型             | 描述                                                                                                                                                           |
|:---|:---|:---|:---|
| status         | 否    | String           | 当前识别状态。具体状态如下所示： WAITING 等待识别。 FINISHED 识别已经完成。 ERROR 识别过程中发生错误。 |
| create_time    | 否    | String           | 任务创建时间, 遵循 RFC 3339格式。 格式示例：2018-12-04T13:10:29.310Z。                                                                          |
| start_time     | 否    | String           | 开始识别时间, 遵循 RFC 3339格式。 当status为FINISHED或ERROR时存在。 格式示例：2018-12-04T13:10:29.310Z。                  |
| finish_time    | 否    | String           | 识别完成时间, 遵循 RFC 3339格式。 当status为FINISHED或ERROR时存在。 格式示例：2018-12-04T13:10:29.310Z。              |
| audio_duration | 否    | Integer          | 提交音频时长，单位ms。                                                                                                                                                 |
| segments       | 否    | Array of objects | 识别结果, 多句结果的数组。 数据结构参见[表5]。                                                                    |
   
 表5Segment 
| 参数名        | 是否必选 | 参数类型    | 说明                                                            |
|:---|:---|:---|:---|
| start_time | 是    | Integer | 一句的起始时间戳，单位ms。                                                |
| end_time   | 是    | Integer | 一句的结束时间戳，单位ms。                                                |
| result     | 是    | Object  | 调用成功表示识别结果，调用失败时无此字段。详见[表6]。 |
   
 表6Result 
| 参数名           | 是否必选 | 参数类型            | 说明                                                                                                                              |
|:---|:---|:---|:---|
| text          | 是    | String          | 识别结果文本。                                                                                                                         |
| analysis_info | 否    | Object          | 每一句的质检分析结果对象。 仅在识别配置中的need_analysis_info不为null时存在该返回结果。详见[表7]。 |
| word_info     | 否    | Array of Object | 分词输出列表。                                                                                                                         |
   
 表7Analysis_info 
| 参数名     | 是否必选 | 参数类型   | 说明                                                                                   |
|:---|:---|:---|:---|
| role    | 否    | String | 角色类型，目前仅支持 AGENT(座席)，USER(用户)。                                                       |
| emotion | 否    | String | 情绪类型，目前仅支持NORMAL(正常)，ANGRY(愤怒)。 在识别配置中emotion为true时存在。 |
| speed   | 否    | Float  | 语速信息，单位是"每秒字数"。 在识别配置中speed为true时存在。                   |
   
表8Word_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 AsrCustomizationClient
from huaweicloud_sis.bean.asr_request import AsrCustomLongRequest
from huaweicloud_sis.exception.exceptions import ClientException
from huaweicloud_sis.exception.exceptions import ServerException
from huaweicloud_sis.bean.sis_config import SisConfig
import json
import time
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 = ''         # region，如cn-north-4
"""
    todo 请正确填写音频格式和模型属性字符串
    1. 音频格式一定要相匹配.
         例如wav音频，格式是auto。具体参考api文档。
         例如音频是pcm格式，并且采样率为8k，则格式填写pcm8k16bit。
         如果返回audio_format is invalid 说明该文件格式不支持。具体支持哪些音频格式，需要参考一些api文档。
         
    2. 音频采样率要与属性字符串的采样率要匹配。
         例如格式选择pcm16k16bit，属性字符串却选择chinese_8k_common, 则会返回'audio_format' is not match model
         例如wav本身是16k采样率，属性选择chinese_8k_common, 同样会返回'audio_format' is not match model
"""
# 录音文件识别参数，音频文件以obs连接方式传入（即先需要将音频传送到华为云的obs）
obs_url = ''                # 音频obs连接
obs_audio_format = ''       # 音频格式，如auto等，详见api文档
obs_property = ''           # language_sampleRate_domain, 如chinese_8k_common，详见api文档
def lasr_example():
    """ 录音文件识别示例 """
    # step1 初始化客户端
    config = SisConfig()
    config.set_connect_timeout(10)       # 设置连接超时
    config.set_read_timeout(10)         # 设置读取超时
    # 设置代理，使用代理前一定要确保代理可用。 代理格式可为[host, port] 或 [host, port, username, password]
    # config.set_proxy(proxy)
    asr_client = AsrCustomizationClient(ak, sk, region, project_id,  sis_config=config)
    # step2 构造请求
    asrc_request = AsrCustomLongRequest(obs_audio_format, obs_property, obs_url)
    # 所有参数均可不设置，使用默认值
    # 设置是否添加标点，yes or no，默认no
    asrc_request.set_add_punc('yes')
    # 设置是否将语音中数字转写为阿拉伯数字，yes or no，默认yes
    asrc_request.set_digit_norm('yes')
    # 设置 是否需要分析信息，True or False, 默认False。 只有need_analysis_info生效，diarization、channel、emotion、speed才会生效
    # 目前仅支持8k模型，详见api文档
    asrc_request.set_need_analysis_info(True)
    # 设置是否需要话者分离，默认True，需要need_analysis_info设置为True才生效。
    asrc_request.set_diarization(True)
    # 设置声道信息, 一般都是单声道，默认为MONO，需要need_analysis_info设置为True才生效
    asrc_request.set_channel('MONO')
    # 设置是否返回感情信息, 默认True，需要need_analysis_info设置为True才生效。
    asrc_request.set_emotion(True)
    # 设置是否需要返回语速信息，默认True，需要need_analysis_info设置为True才生效。
    asrc_request.set_speed(True)
    # 设置回调地址，设置后音频转写结果将直接发送至回调地址。请务必保证地址可连通。
    # asrc_request.set_callback_url('')
    # 设置是否添加热词表id，没有则不填
    # asrc_request.set_vocabulary_id(None)
    # 设置是否需要word_info，yes or no, 默认no
    asrc_request.set_need_word_info('no')
    # step3 发送请求，获取job_id
    job_id = asr_client.submit_job(asrc_request)
    # use enterprise_project_Id
    # headers = {'Enterprise-Project-Id': 'your enterprise project id', 'Content-Type': 'application/json'}
    # job_id = asr_client.submit_job(asrc_request, headers)
    # step4 根据job_id轮询，获取结果。
    status = 'WAITING'
    count = 0   # 每2s查询一次，尝试2000次，即4000s。如果音频很长，可适当考虑加长一些。
    while status != 'FINISHED' and count < 2000:
        print(count, ' query')
        result = asr_client.get_long_response(job_id)
        status = result['status']
        if status == 'ERROR':
            print('录音文件识别执行失败, %s' % json.dump(result))
            break
        time.sleep(2)
        count += 1
    if status != 'FINISHED':
        print('录音文件识别未在 %d 内获取结果，job_id 为%s' % (count, job_id))
    # result为json格式
    print(json.dumps(result, indent=2, ensure_ascii=False))
if __name__ == '__main__':
    try:
        lasr_example()
    except ClientException as e:
        print(e)
    except ServerException as e:
        print(e)
```
