文档首页 > > SDK参考> Java SDK> 使用录音文件识别

使用录音文件识别

分享
更新时间: 2019/12/25 GMT+08:00

前提条件

  • 确保已按照配置Java环境配置完毕。
  • 确保已存在待识别的音频文件并上传OBS,示例音频可参考下载SDK压缩包文件,同时确保服务已授权访问OBS,可参考配置OBS服务

初始化Client

初始化AsrCustomizationClient,其参数包括AuthInfo和SisConfig,详见表 AuthInfo数据结构表 SisConfig数据结构

表1 AuthInfo数据结构

参数名称

是否必选

参数类型

描述

ak

String

用户的ak,可参考AK/SK认证

sk

String

用户的sk,可参考AK/SK认证

region

String

区域,如cn-north-4,参考终端节点

projectId

String

项目ID,同region一一对应,参考获取项目ID

endpoint

String

终端节点,参考地区和终端节点。一般使用默认即可。

表2 SisConfig数据结构

参数名称

是否必选

参数类型

描述

socketTimeout

Integer

Socket超时,默认5000,单位ms。

connectionTimeout

Integer

连接超时,默认5000,单位ms。

requestTimeout

Integer

请求超时,默认1000,单位ms。

请求参数

请求类为AsrCustomLongRequest,详见表 AsrCustomLongRequest数据结构

表3 AsrCustomLongRequest数据结构

参数名称

是否必选

参数类型

描述

dataUrl

String

OBS音频链接,目前华为云仅支持来自OBS的链接,注意OBS的region要与AuthInfo的region保持一致, 同时需要确保链接为用户个人的OBS的音频连接,不支持访问其他用户的公共读的OBS音频链接。

audioFormat

String

音频格式,具体信息请参见《API参考》中录音文件识别章节。

property

String

属性字符串,语言_采样率_模型,如chinese_8k_common。具体信息请参见《API参考》中录音文件识别章节。

addPunc

String

识别结果是否添加标点,yes或no,默认no。

needAnalysisInfo

Boolean

是否选择分析信息。

如果选择false,则声道、话者分离、情绪检测、速度信息均无效。默认false。

diarization

Boolean

是否需要话者分离,表示识别结果会包含role项,默认true。

channel

String

语音文件声道信息,可以为MONO(缺省), LEFT_AGENT, RIGHT_AGENT。

emotion

Boolean

是否需要做情绪检测,默认true。

speed

Boolean

是否需要输出语速信息,默认true。

vocabularyId

String

热词表id,不使用则不填写。

创建热词表请参考《API参考》中创建热词表章节。

响应参数

响应类为AsrCustomLongResponse,详见表 AsrCustomLongResponse数据结构

表4 AsrCustomLongResponse数据结构

参数名称

是否必选

参数类型

描述

status

String

描述返回状态。

  • WAITING 等待识别。
  • FINISHED识别已经完成。
  • ERROR 识别过程中发生错误。

createTime

String

任务创建时间。格式如2018-12-04T13:10:29.310Z。

startTime

String

开始识别时间。格式如2018-12-04T13:10:29.310Z。

finishTime

String

识别完成时间。格式如2018-12-04T13:10:29.310Z。

sentenceList

List<Sentence>

多句结果的数组。结果为空则为null。详见表 Sentence数据结构

表5 Sentence数据结构

参数名称

是否必选

类型

描述

startTime

Integer

语句起始时间,单位ms。

endTime

Integer

语句截止时间,单位ms。

text

String

语句识别结果。

analysisInfo

Object

语句分析信息,详见表 AnalysisInfo数据结构

表6 AnalysisInfo数据结构

参数名称

是否必选

类型

描述

role

String

角色类型。

emotion

String

情绪类型,目前仅支持NORMAL(正常),ANGRY(愤怒)在识别配置中emotion为true时存在。

speed

Float

语速信息,单位是"每秒字数"。 识别配置中speed为true时存在。

代码示例

import com.huawei.sis.bean.SisConfig;
import com.huawei.sis.bean.SisConstant;
import com.huawei.sis.bean.request.AsrCustomLongRequest;
import com.huawei.sis.bean.response.AsrCustomLongResponse;
import com.huawei.sis.bean.request.AsrCustomShortRequest;
import com.huawei.sis.bean.response.AsrCustomShortResponse;
import com.huawei.sis.bean.AuthInfo;
import com.huawei.sis.bean.base.AsrcLongAnalysisInfo;
import com.huawei.sis.bean.base.AsrcLongSentence;
import com.huawei.sis.client.AsrCustomizationClient;
import com.huawei.sis.exception.SisException;
import com.huawei.sis.util.IOUtils;

import java.util.List;

/**
 * 定制语音识别 demo、包含录音文件识别
 *
 * Copyright 2019 Huawei Technologies Co.,Ltd.
 */
public class AsrCustomizationDemo {
  private static final int SLEEP_TIME = 500;
  private static final int MAX_POLLING_NUMS = 1000;

  private String ak = "";
  private String sk = "";
  private String region = "";    // 区域,如cn-north-1、cn-north-4
  private String projectId = ""; // 项目id,在我的凭证查看。参考https://support.huaweicloud.com/api-sis/sis_03_0008.html

  // 录音文件识别参数
  private String obsUrl = "";           // 音频文件OBS链接,录音文件识别目前仅支持传入OBS音频连接
  private String obsAudioFormat = "";   // 文件格式,详见api文档
  private String obsProperty = "";      // 属性字符串,详见api文档

  /**
   * 设置录音文件识别参数,所有参数均有默认值,不配置也可使用
   *
   * @param request 录音文件识别请求
   */
  private void setLongParameter(AsrCustomLongRequest request) {
    // 设置否是添加标点,yes 或no, 默认是no
    request.setAddPunc("yes");
    // 设置声道,MONO/LEFT_AGENT/RIGHT_AGENT, 默认是单声道MONO
    request.setChannel("MONO");
    // 设置是否需要话者分离,若是,则识别结果包含role,默认true
    request.setDirization(true);
    // 设置是否需要情绪检测,默认ture
    request.setEmotion(true);
    // 设置是否需要分析,默认为false
    request.setNeedAnalysis(true);
    // 设置热词id,详见api文档,若热词id不存在,则会报错
    // request.setVocabularyId("");
  }

  /**
   * 定义config,所有参数可选,设置超时时间等。
   *
   * @return SisConfig
   */
  private SisConfig getConfig() {
    SisConfig config = new SisConfig();
    // 设置连接超时,默认5000ms
    config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT);
    // 设置请求超时,默认1000ms
    config.setRequestTimeout(SisConstant.DEFAULT_CONNECTION_REQUEST_TIMEOUT);
    // 设置socket超时,默认5000ms
    config.setSocketTimeout(SisConstant.DEFAULT_SOCKET_TIMEOUT);
    // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理,new ProxyHostInfo(host, port);
    // ProxyHostInfo proxy = new ProxyHostInfo(host, port, username, password);
    // config.setProxy(proxy);
    return config;
  }

  /**
   * 打印录音文件识别识别结果
   *
   * @param response 录音文件识别响应
   */
  private void printAsrLongResponse(AsrCustomLongResponse response) {
    System.out.println("status=" + response.getStatus());
    System.out.println("startTime=" + response.getStartTime());
    System.out.println("createTime=" + response.getCreateTime());
    System.out.println("finishTime=" + response.getFinishTime());
    System.out.println("segments=");
    List<AsrcLongSentence> sentenceList = response.getSentenceList();
    if (sentenceList == null) {
      System.out.println("response 识别结果为空");
      return;
    }

    for (int i = 0; i < sentenceList.size(); i++) {
      System.out.println("\t{");
      AsrcLongSentence sentence = sentenceList.get(i);
      System.out.println("\t\tsentenceStartTime=" + sentence.getStartTime());
      System.out.println("\t\tsentenceEndTime=" + sentence.getEndTime());
      System.out.println("\t\tsentenceText=" + sentence.getText());
      AsrcLongAnalysisInfo analysisInfo = sentence.getAnalysisInfo();
      if (analysisInfo != null) {
        if (!analysisInfo.getRole().equals("")) {
          System.out.println("\t\trole=" + analysisInfo.getRole());
        }
        if (!analysisInfo.getEmotion().equals("")) {
          System.out.println("\t\temotion=" + analysisInfo.getEmotion());
        }
        if (analysisInfo.getSpeed() != -1) {
          System.out.println("\t\tspeed=" + analysisInfo.getSpeed());
        }

      }
      System.out.println("\t}");
    }
    System.out.println("\n");
  }

  /**
   * 录音文件识别demo
   */
  private void longDemo() {
    try {
      // 1. 初始化AsrCustomizationClient
      // 定义authInfo,根据ak,sk,region,projectId.
      AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId);
      // 设置config,主要与超时有关
      SisConfig config = getConfig();
      // 根据authInfo和config,构造AsrCustomizationClient
      AsrCustomizationClient asr = new AsrCustomizationClient(authInfo, config);

      // 2. 生成请求
      AsrCustomLongRequest request = new AsrCustomLongRequest(obsUrl, obsAudioFormat, obsProperty);
      // 设置请求参数,所有参数均为可选
      setLongParameter(request);

      // 3. 提交任务,获取jobId
      String jobId = asr.submitJob(request);

      // 4 轮询jobId,获取最终结果。
      int count = 0;   
      int successFlag = 0;
      AsrCustomLongResponse response = null;
      while (count < MAX_POLLING_NUMS) {
        System.out.println("正在进行第" + count + "次尝试");
        response = asr.getAsrLongResponse(jobId);
        String status = response.getStatus();
        if (status.equals("FINISHED")) {
          successFlag = 1;
          break;
        } else if (status.equals("ERROR")) {
          System.out.println("执行失败, 无法根据jobId获取结果");
          return;
        }
        try {
          Thread.sleep(SLEEP_TIME);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
        count++;
      }
      // 打印结果
      if (successFlag == 0) {
        System.out.println("已进行" + count + "次尝试,无法获取识别结果");
        return;
      }
      printAsrLongResponse(response);
    } catch (SisException e) {
      e.printStackTrace();
      System.out.println("error_code:" + e.getErrorCode() + "\nerror_msg:" + e.getErrorMsg());
    }
  }

  public static void main(String[] args) {
    AsrCustomizationDemo demo = new AsrCustomizationDemo();
    // 录音文件识别
    demo.longDemo();
  }
}
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区