文档首页 > > SDK参考> Java SDK> 使用实时语音转写

使用实时语音转写

分享
更新时间: 2019/11/29 GMT+08:00

前提条件

  • 确保已按照配置Java环境配置完毕。
  • 确保已存在待识别的音频文件。如果需要请在下载的SDK压缩包中获取示例音频。

初始化Client

初始化RasrClient,其参数包括UserInfo、RasrListener、SisConfig。

RasrListener需要用户自定义实现监听逻辑,UserInfo和SisConfig 详见表 UserInfo数据结构表 SisConfig数据结构

表1 UserInfo数据结构

参数名称

是否必选

参数类型

描述

userName

String

用户名。

password

String

密码。

domainNmae

String

账户名,一般等同用户名。

region

String

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

projectId

String

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

serviceEndpoint

String

一般使用默认即可。

tokenEndpoint

String

一般使用默认即可。

表2 SisConfig数据结构

参数名称

是否必选

参数类型

描述

socketTimeout

Integer

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

connectionTimeout

Integer

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

requestTimeout

Integer

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

请求参数

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

表3 RasrRequest数据结构

参数名称

是否必选

参数类型

描述

audioFormat

String

音频格式,支持pcm,alaw,ulaw等,如pcm8k16bit,参见《API参考》中开始识别章节。

property

String

属性字符串,language_sampleRate_domain, 如chinese_8k_common,参见《API参考》中开始识别章节。

punc

String

是否添加标点,yes 或 no,默认no。

vadHead

Integer

头部最大静音时间,[0, 60000],默认10000ms。

vadTail

Integer

尾部最大静音时间,[0, 3000],默认500ms。

maxSeconds

Integer

音频最长持续时间, [0, 60],默认30s。

intermediateResult

String

是否显示中间结果,yes 或 no,默认no。

vocabularyId

String

热词表id,若没有则不填。

响应参数

状态响应类为StateResponse,详见表 StateResponse数据结构

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

表4 StateResponse数据结构

参数名称

是否必选

参数类型

描述

state

String

识别状态,包括start、end、fail。

traceId

String

用于日志问题追溯。

description

String

状态描述。

表5 RasrResponse数据结构

参数名称

是否必选

参数类型

描述

traceId

String

用于问题追溯。

sentenceList

List<RasrSentence>

每一句识别结果,详见表 RasrSentence数据结构

表6 RasrSentence数据结构

参数名称

是否必选

参数类型

描述

isFinal

Boolean

是否为一句话最终结果,当设置返回中间结果时可以用到。

startTime

Integer

一句话开始时间。

endTime

Integer

一句话结束时间。

text

String

识别结果。

score

Float

识别结果置信度。

示例代码

import com.huawei.sis.bean.SisConfig;
import com.huawei.sis.bean.SisConstant;
import com.huawei.sis.bean.request.RasrRequest;
import com.huawei.sis.bean.response.RasrResponse;
import com.huawei.sis.bean.base.RasrSentence;
import com.huawei.sis.bean.response.StateResponse;
import com.huawei.sis.bean.UserInfo;
import com.huawei.sis.client.RasrClient;
import com.huawei.sis.bean.RasrListener;

import java.util.List;

/**
 * 实时语音转写demo
 *
 * Copyright 2019 Huawei Technologies Co.,Ltd.
 */
public class RasrDemo {
  private static final int DEFAULT_HEAD_SILENCE_TIME = 1000;
  private static final int DEFAULT_TAIL_SILENCE_TIME = 500;
  private static final int DEFAULT_CONTINUE_SECONDS = 30;

  private String userName = "";       // 用户名
  private String password = "";       // 密码
  private String serviceRegion = "";  // 区域,如cn-north-1、cn-north-4
  private String projectId = "";      // 项目id,在我的凭证查看。参考https://support.huaweicloud.com/api-sis/sis_03_0008.html
  private String domainName = "";     // 账户名,一般等同于用户名

  private String path = "";           // 本地音频路径

  private String audioFormat = "";    // 音频格式,详见api文档或sdk文档
  private String property = "";       // 属性字符串,language_sampleRate_domain,如chinese_8k_common, 详见api文档

  /**
   * 实时语音转写参数设置,所有参数设置均为可选,均有默认值。用户根据需求设置参数。
   *
   * @param request request请求,包含各种参数
   */
  private void setParameters(RasrRequest request) {

    // 1. 设置是否添加标点符号,yes 或 no, 默认"no"
    request.setAddPunc("yes");
    // 2. 设置头部的最大静音时间,[0,60000], 默认10000ms
    request.setVadHead(DEFAULT_HEAD_SILENCE_TIME);
    // 3. 设置尾部最大静音时间,[0, 3000], 默认500ms,
    request.setVadTail(DEFAULT_TAIL_SILENCE_TIME);
    // 4. 设置最长持续时间,仅在continue-stream,sentence-stream模式下起作用,[1, 60], 默认30s
    request.setMaxSeconds(DEFAULT_CONTINUE_SECONDS);
    // 5. 设置是否显示中间结果,yes或no,默认“no”
    request.setIntermediateResult("no");
    // 6. 设置热词表id, 若没有则设置,否则会报错。
    // request.setVocabularyId(vocabularyId);
  }

  /**
   * 定义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);
    // 设置代理, websocket目前仅支持不带用户密码的代理。使用前务必要确保代理是可用的,一般不建议使用。
    // config.setProxy(new ProxyHostInfo(host, port));
    return config;
  }

  /**
   * 打印响应结果。
   *
   * @param rasrResponse 识别结果类
   */
  private void printRasrResponse(RasrResponse rasrResponse) {
    // traceId, 用于分析日志,可忽略
    System.out.println("traceId = " + rasrResponse.getTraceId());

    // 打印语句
    List<RasrSentence> sentenceList = rasrResponse.getSentenceList();
    for (int i = 0; i < sentenceList.size(); i++) {
      RasrSentence sentence = sentenceList.get(i);
      // 语句索引
      System.out.println("{\n\tindex: " + (i + 1));
      // 每句话的中间结果还是最终结果
      System.out.println("\tis final: " + sentence.isFinal());
      // 语句起始时间,ms
      System.out.println("\tstart time: " + sentence.getStartTime());
      // 语句结束时间,ms
      System.out.println("\tend time: " + sentence.getEndTime());
      // 语句识别结果
      System.out.println("\ttext: " + sentence.getText());
      // 识别置信度,目前作用不大
      System.out.println("\tscore: " + sentence.getScore());
      System.out.println("}");
    }
    System.out.println();
  }

  private void printStateResponse(StateResponse response) {
    System.out.println("{\n\tstate: " + response.getState());
    System.out.println("\ttraceId: " + response.getTraceId());
    System.out.println("\tdescription: " + response.getDescription() + "\n}");
  }

  /**
   * 获取监听器,监听器的监听函数。
   *
   * @return RasrListener,用于监听实时语音转写的开始、识别结果、结束以及失败响应
   */
  private RasrListener getRasrListener() {
    RasrListener rasrListener = new RasrListener() {

      @Override
      /**
       * 响应结果
       */
      public void onTranscriptionResponse(RasrResponse rasrResponse) {
        printRasrResponse(rasrResponse);
      }

      @Override
      /**
       * 识别开始回调,返回traceId信息
       */
      public void onTranscriptionBegin(StateResponse response) {
        printStateResponse(response);
      }

      @Override
      /**
       * 识别结束回调,返回traceId等信息
       */
      public void onSTranscriptionEnd(StateResponse response) {
        printStateResponse(response);
      }

      @Override
      /**
       * 识别出错回调,这里指代已成功连接websocket,但是未成功识别结果。
       */
      public void onTranscriptionFail(StateResponse response) {
        printStateResponse(response);
      }
    };
    return rasrListener;
  }

  /**
   * 实时语音转写SDK的工作流程
   */
  private void process() {
    try {
      // 1. 实现监听器接口RasrListener,用户自定义收到响应的处理逻辑。
      RasrListener rasrListener = getRasrListener();

      // 2. 初始化RasrClient
      UserInfo userInfo = new UserInfo(userName, password, domainName, serviceRegion, projectId);
      RasrClient rasrClient = new RasrClient(userInfo, rasrListener, getConfig());

      // 3. 配置参数
      // audioFormat为支持格式、property为属性字符串,具体填写请详细参考api文档
      RasrRequest request = new RasrRequest(audioFormat, property);
      setParameters(request);

      // 4 选择连接模式,目前实时语音转写提供三种接口,流式一句话、实时语音转写连续模式、实时语音转写单句模式
      // 选择1 流式一句话连接
      // rasrClient.shortStreamConnect(request);

      // 选择2,实时语音转写单句模式
      // rasrClient.sentenceStreamConnect(request);

      // 选择3,实时语音转写连续模式
      rasrClient.continueStreamConnect(request);

      // 5. 发送开始请求、发送音频、发送end请求
      // 发送开始请求,即将开始请求连带配置发送至服务端
      rasrClient.sendStart();

      // 发送数据,在实时语音连续模式下可多次发送。识别结果可以通过监听器获取
      rasrClient.sendAudio(path);
      // 也可以自己控制发送速率.byteLen为每次发送大小,sleepTime为每次发送后睡眠时间(ms)。 也可直接发送byte流
      // rasrClient.sendAudio(path, byteLen, sleepTime);
      // rasrClient.sendByte(data, byteLen, sleepTime);

      // 发送结尾请求
      rasrClient.sendEnd();

      // 6. 关闭客户端。发送完毕后,此步一定要实施,否则服务端因为20s没有接受任何消息而报异常。
      rasrClient.close();

    } catch (Exception e) {
      e.printStackTrace();
    }

  }

  public static void main(String[] args) {
    RasrDemo rasrDemo = new RasrDemo();
    rasrDemo.process();
  }
}
分享:

    相关文档

    相关产品

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

提交成功!

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

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

*必选

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

字符长度不能超过200

提交反馈 取消

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

跳转到云社区