华为云用户手册

  • 数据库更新适配 本例中数据库为本地MySQL数据库,迁移后无需重新配置。若您通过数据复制服务DRS将本地数据库迁移至云数据库RDS,则在迁移后需重新配置数据库的访问,请您根据实际情况进行配置。 若云数据库RDS实例与CCE集群处于同一VPC下,则可通过内网地址访问,否则只能通过绑定EIP的方式进行公网访问。建议使用内网访问方式,安全性高,并且可实现RDS的较好性能。 请确认RDS所在安全组入方向规则已对集群放通,否则将连接失败。 登录RDS控制台,在该实例的“基本信息”页面获取其“内网地址”及端口。 使用如下命令对Wordpress工作负载进行修改。 kubectl edit deploy wordpress 设置env字段下的环境变量: WORDPRESS_DB_HOST:数据库的访问地址和端口,即上一步中获取的内网地址及端口。 WORDPRESS_DB_USER:访问数据库的用户名。 WORDPRESS_DB_PASSWORD:访问数据库的密码。 WORDPRESS_DB_NAME:需要连接的数据库名。 检查RDS数据库是否正常连接。
  • 镜像更新适配 由于本例使用的Wordpress和MySQL镜像均可从SWR正常拉取,因此不会出现镜像拉取失败(ErrImagePull)问题。如迁移应用为私有镜像,请执行以下步骤完成镜像更新适配。 将镜像资源迁移至容器镜像服务(SWR),具体步骤请参考客户端上传镜像。 登录SWR控制台查看获取迁移后的镜像地址。 镜像地址格式如下: 'swr.{区域}.myhuaweicloud.com/{所属组织名称}/{镜像名称}:{版本名称}' 使用如下命令对工作负载进行修改,并将YAML文件中的image字段替换成迁移后的镜像地址。 kubectl edit deploy wordpress 查看应用实例运行情况。
  • 迁移步骤 集群迁移大致包含如下6个步骤: 目标集群资源规划。 请详细了解CCE集群与自建集群间的差异,参考目标集群资源规划中的关键性能参数,按需进行资源规划,建议尽量保持迁移后集群与原集群中性能配置相对一致。 集群外资源迁移。 若您需对集群外的相关资源进行迁移,可使用对应的迁移解决方案,具体请参见集群外资源迁移。 迁移工具安装。 完成集群外资源迁移后,可通过迁移工具在原集群和目标集群内分别进行应用配置的备份和还原,工具的安装步骤请参考迁移工具安装。 集群内资源迁移。 使用Velero将原集群内资源备份至对象存储中,并在目标集群中进行恢复,详细步骤可参考集群内资源迁移(Velero)。 原集群应用备份 当用户执行备份时,首先通过Velero工具在原集群中创建Backup对象,并查询集群相关的数据和资源进行备份,并将数据打包上传至S3协议兼容的对象存储中,各类集群资源将以JSON格式文件进行存储。 目标集群应用恢复 在目标集群中进行还原时,Velero将指定之前存储备份数据的临时对象桶,并把备份的数据下载至新集群,再根据JSON文件对资源进行重新部署。 资源更新适配。 迁移后的集群资源可能存在无法部署的问题,需要对出现错误的资源进行更新适配,可能发生的适配问题主要包括如下几类: 镜像更新适配 访问服务更新适配 StorageClass更新适配 数据库更新适配 其余工作。 集群资源正常部署后,需对迁移后应用内的功能进行验证,并将业务流量切换至新集群。最后确定所有服务正常运行后,可将原集群下线。
  • 迁移方案 本文介绍一种集群迁移方案,适合如下几类集群: 本地IDC自建的K8s集群 通过多台ECS自建的集群 其他云服务商提供的集群服务 在迁移前,需对原集群的所有资源进行分析再决定迁移方案,可迁移的资源包括集群内资源和集群外资源,如下表所示。 表1 可迁移资源列表 资源类别 可迁移对象 备注 集群内资源 集群中的所有对象,Pod、Job、Service、Deployment、ConfigMap等。 不建议迁移的资源:命名空间velero和kube-system下的资源。 velero:该命名空间下的资源为迁移工具创建,无需迁移。 kube-system:该命名空间下的资源为系统资源。如原集群该命名空间下包含用户自行创建的资源,建议按需迁移。 注意: 如果您是迁移或备份CCE中集群的资源,比如从一个Namespace到另外一个Namespace,请不要备份名称为paas.elb的Secret。因为paas.elb的内容是会定期更新,备份后再恢复时可能已经失效,会影响网络存储相关功能。 挂载到容器的持久化存储。 由于Restic工具限制,不支持进行HostPath类型存储迁移,解决方法请参考无法备份HostPath类型存储卷。 集群外资源 自建镜像仓库。 可迁移至容器镜像服务SWR。 非容器化的数据库。 可迁移至云数据库服务RDS。 对象存储等非本地存储。 可迁移至对象存储服务OBS等云存储服务。 迁移流程如图1所示,对于集群外资源您可根据实际需求进行选择性迁移。 图1 迁移方案示意图
  • 操作场景 随着容器化技术的发展,越来越多的企业使用容器代替了虚拟机完成应用的运行部署,而Kubernetes的发展让容器化的部署变得简单并且高效。目前许多企业选择自建Kubernetes集群,但是自建集群往往有着沉重的运维负担,需要运维人员自己配置管理系统和监控解决方案,伴随而来的就是企业人力成本的上升和效率的降低。 在性能方面,自建集群的规模固定,可扩展性又比较弱,在业务流量高峰期无法实现自适应的弹性扩缩容,很容易出现集群资源不足或浪费等现象。而且自建集群往往没有考虑容灾风险,导致可靠性较差,一旦出现故障将会使整个集群无法使用,可能会形成十分严重的生产事件。 面对以上的种种不足,CCE提供了简单的集群管理能力和灵活的弹性放缩能力,深度集成应用服务网格和Helm标准模板,能够有效帮助企业简化集群运维管理方式,降低运营成本,以简单易用、高性能、安全可靠、开放兼容等诸多优点,获取了大量企业用户的青睐。因此很多企业选择将自建集群全量搬迁至CCE进行管理,本文主要介绍集群迁移上云的方案和步骤。
  • 安装Velero 首先前往OBS控制台或MinIO console界面,创建存放备份文件的桶并命名为velero。此处桶名称可自定义,但安装Velero时必须指定此桶名称,否则将无法访问导致备份失败,参见4。 原集群和目标集群中均需要安装部署Velero实例,安装步骤一致,分别用于备份和恢复。 CCE集群的Master节点不对外提供远程登录端口,您可通过kubectl操作集群完成Velero安装。 如果备份资源量较大,请调整Velero及Restic工具的cpu和内存资源(建议调整至1U1G及以上),请参考备份工具资源分配不足。 用于存放备份文件的对象存储桶需要是空桶。 从Velero官方发布路径https://github.com/vmware-tanzu/velero/releases下载最新的稳定版二进制文件,本文以Velero 1.7.0版本为例。原集群和目标集群中的安装过程一致,请参考如下步骤。 下载Velero 1.7.0版本的二进制文件。 wget https://github.com/vmware-tanzu/velero/releases/download/v1.7.0/velero-v1.7.0-linux-amd64.tar.gz 安装Velero客户端。 tar -xvf velero-v1.7.0-linux-amd64.tar.gz cp ./velero-v1.7.0-linux-amd64/velero /usr/local/bin 创建备份对象存储访问密钥文件credentials-velero。 vim credentials-velero 文件内容如下,其中的AK/SK请根据实际情况进行替换。使用OBS时,可参考获取访问密钥(AK/SK)获取AK/SK。如使用MinIO,此处AK/SK则为2中所创建的用户名及密码。 [default] aws_access_key_id = {AK} aws_secret_access_key = {SK} 部署Velero服务端。注意其中--bucket参数需要修改为已创建的对象存储桶名称,本例中为velero。关于更多自定义安装参数,请参考自定义安装Velero。 velero install \ --provider aws \ --plugins velero/velero-plugin-for-aws:v1.2.1 \ --bucket velero \ --secret-file ./credentials-velero \ --use-restic \ --use-volume-snapshots=false \ --backup-location-config region=cn-north-4,s3ForcePathStyle="true",s3Url=http://obs.cn-north-4.myhuaweicloud.com 表1 Velero安装参数说明 安装参数 参数说明 --provider 声明使用“aws”提供的插件类型。 --plugins 使用AWS S3兼容的API组件,本文使用的OBS和MinIO对象存储均支持该S3协议。 --bucket 用于存放备份文件的对象存储桶名称,需提前创建。 --secret-file 访问对象存储的密钥文件,即3中创建的“credentials-velero”文件。 --use-restic 使用Restic工具支持PV数据备份,建议开启,否则将无法备份存储卷资源。 --use-volume-snapshots 是否创建 VolumeSnapshotLocation 对象进行PV快照,需要提供快照程序支持。该值设为false。 --backup-location-config 对象存储桶相关配置,包括region、s3ForcePathStyle、s3Url等。 region 对象存储桶所在区域。 OBS:请根据实际区域填写,如“cn-north-4”。 MinIO:参数值为minio。 s3ForcePathStyle 参数值为“true”,表示使用S3文件路径格式。 s3Url 对象存储桶的API访问地址。 OBS:该参数值需根据对象存储桶地域决定,参数值为“http://obs.{region}.myhuaweicloud.com”。例如区域为北京四(cn-north-4),则参数值为“http://obs.cn-north-4.myhuaweicloud.com”。 MinIO:该参数值需根据MinIO安装节点的IP及暴露端口确定,参数值为“http://{minio所在节点的eip}:9000”。 说明: s3Url中的访问端口需填写MinIO的API端口,而非console端口。MinIO API端口默认为9000。 访问集群外安装的MinIO时,需填写其公网IP地址。 Velero实例将默认创建一个名为velero的namespace,执行以下命令可查看pod状态。 $ kubectl get pod -n velero NAME READY STATUS RESTARTS AGE restic-rn29c 1/1 Running 0 16s velero-c9ddd56-tkzpk 1/1 Running 0 16s 为防止在实际生产环境中备份时出现内存不足的情况,建议您参照备份工具资源分配不足,修改Restic和Velero分配的CPU和内存大小。 查看Velero工具与对象存储的对接情况,状态需要为available。 $ velero backup-location get NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT default aws velero Available 2021-10-22 15:21:12 +0800 CST ReadWrite true
  • 安装MinIO MinIO 是一个兼容S3接口协议的高性能对象存储开源工具。若使用MinIO进行存放集群迁移的备份文件,您需要一台临时服务器用于部署MinIO并对外提供服务。若您使用OBS存放备份文件,请忽略此步骤,前往安装Velero。 MinIO的安装位置选择有如下几种: 集群外临时ECS 将MinIO服务端安装在集群外,能够保障集群发生灾难性故障时,备份文件不会受到影响。 集群内的空闲节点 您可以远程登录节点安装MinIO服务端,也可以选择容器化安装MinIO,请参考Velero官方文档https://velero.io/docs/v1.7/contributions/minio/#set-up-server。 如使用容器化安装MinIO: Velero官方文档提供的YAML文件中存储类型为empty dir,建议将其修改为HostPath或Local类型,否则容器重启后将永久丢失备份文件。 您需将MinIO服务对外提供访问,否则将无法在集群外下载备份文件,可选择将Service修改为NodePort类型或使用其他类型的公网访问服务。 无论使用何种方法进行部署,安装MinIO的服务器需要有足够的存储空间,且均需要绑定EIP并在安全组中开放MinIO的服务端口,否则将无法上传(下载)备份文件。 本示例选择在一台集群外的临时ECS上安装MinIO,步骤如下。 下载MinIO对象存储。 mkdir /opt/minio mkdir /opt/miniodata cd /opt/minio wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod +x minio 设置MinIO的用户名及密码。 此方法设置的用户名及密码为临时环境变量,在服务重启后需要重新设定,否则会使用默认root凭据minioadmin:minioadmin来创建服务。 export MINIO_ROOT_USER=minio export MINIO_ROOT_PASSWORD=minio123 创建服务,其中/opt/miniodata/为MinIO 存储数据的本地磁盘路径。 MinIO的API端口默认为9000,console端口默认为随机生成,您可使用--console-address参数指定console访问端口。 ./minio server /opt/miniodata/ --console-address ":30840" & 安装MinIO工具的服务器需开放防火墙、安全组中对应的API和console端口,否则将无法访问对象桶。 浏览器访问http://{minio所在节点的eip}:30840,可进入MinIO console界面。
  • 前提条件 原始自建集群Kubernetes版本需1.10及以上,且集群可正常使用DNS与互联网服务。 若您使用OBS存放备份文件,需已有OBS操作权限用户的AK/SK,请参考获取访问密钥(AK/SK)。 若您使用MinIO存放备份文件,则安装MinIO的服务器需要绑定EIP并在安全组中开放MinIO的API端口和Console端口。 已创建迁移的目标CCE集群。 原集群和目标集群中需要至少各拥有一个空闲节点,节点规格建议为4U8G及以上。
  • 初始化Client 初始化RttsClient,其参数包括AuthInfo 表1 AuthInfo 参数名称 是否必选 参数类型 描述 ak 是 String 用户的ak,可参考AK/SK认证。 sk 是 String 用户的sk,可参考AK/SK认证。 projectId 是 String 项目ID,同region一一对应,参考获取项目ID。 region 是 String 区域,如cn-north-4,参考终端节点。 endpoint 否 String 终端节点,参考地区和终端节点。一般使用默认即可。
  • 请求参数 请求类为RttsRequest,详见表 RttsRequest。 表2 RttsRequest 参数名称 是否必选 参数类型 描述 text 是 String 待合成文本,不超过500字。 通过set方法可以设置具体参数,详见表 RttsRequest设置参数 表3 RttsRequest设置参数 方法名称 是否必选 参数类型 描述 SetAudioFormat 否 String 设置语音格式,默认pcm。 SetAudioProperty 否 String 设置语音合成特征字符串,{language}_{speaker}_{domain},即“语种_人员标识_领域”。默认chinese_xiaoyan_common 。详见API文档。 SetSampleRate 否 String 设置采样率:8000、16000,默认8000。 SetPitch 否 Integer 设置音高,-500~500,默认0。 SetVolume 否 Integer 设置音量,0~100,默认50。 SetSpeed 否 Integer 设置语速,-500~500,默认0。
  • 初始化Client 初始化SasrWsClient,其中参数包含AuthInfo,SisHttpConfig,SasrWsResponseListener,SasrWsConnProcessListener。 表1 SasrWsClient 参数 是否必选 参数类型 描述 AuthInfo 是 Object 鉴权信息类。 SisHttpConfig 是 Object 连接时网络的配置类。 SasrWsResponseListener 是 Object webSocket回调过程中,业务逻辑的Listener。 SasrWsConnProcessListener 否 Object webSocket生命周期的Listener。 其中AuthInfo和SisHttpConfig的参数如下表所示 表2 AuthInfo 参数名称 是否必选 参数类型 描述 ak 是 String 用户的ak,可参考AK/SK认证。 sk 是 String 用户的sk,可参考AK/SK认证。 serviceRegion 是 String 区域,如cn-north-4,参考终端节点。 projectId 是 String 项目ID,同region一一对应,参考获取项目ID。 serviceEndPoint 否 String 终端节点,参考地区和终端节点。 表3 SisHttpConfig 参数名称 是否必选 参数类型 描述 connectionTimeout 否 Integer 连接超时,默认10000,单位ms。 readTimeout 否 Integer 读取超时,默认10000,单位ms。 websocketWaitTimeout 否 Integer webSocket返回数据时等待时间,默认20000,单位毫秒。 ProxyHostInfo 否 ProxyHostInfo 代理类。 表4 ProxyHostInfo 参数名称 是否必选 参数类型 描述 userName 否 String 代理用户名(例:test)。 passWord 否 String 代理密码(例:test)。 hostName 否 String 代理地址(例:“proxy.huaweicloud.com”)。 port 否 int 代理端口号(例:8080)。 表5 SasrWsResponseListener 函数 描述 void onExceededAudio(); 识别时长超过一分钟时,响应,后续录入音频不在识别。 void onResponseError(AsrResponse response); 识别过程中出现异常,调用。 void onResponseEnd(AsrResponse response); 识别结束时回调。 void onResponseBegin(AsrResponse response); 识别开始时回调。 void onResponseMessage(AsrResponse message); 返回识别的结果。 表6 SasrWsConnProcessListener 函数 描述 void onTranscriptionConnect() webSocket连接建立后回调。 void onTranscriptionClose(); webSocket连接关闭后回调 void onTranscriptionFail(AsrResponse var1); webSocket长连接连接失败是回调。
  • 请求参数 请求类为SasrWsRequest,其中参数详见下表 表7 SasrWsRequest 参数名称 是否必选 参数类型 描述 command 是 String 需设置为START,表示开始识别请求;发送END,表示识别结束请求。 config 是 Object 配置信息,详见下表。 表8 Config 参数名称 是否必选 参数类型 描述 audioFormat 是 String 音频格式,支持pcm,alaw,ulaw等,如pcm8k16bit,具体规格请参见《API参考》中开始识别章节。 property 是 String 属性字符串,language_sampleRate_domain, 如chinese_8k_common。 addPunc 否 String 表示是否在识别结果中添加标点,取值为yes 、 no,默认no。 digitNorm 否 String 表示是否将语音中的数字识别为阿拉伯数字,取值为yes 、 no,默认为yes。 intermediateResult 否 String 是否显示中间结果,yes 或 no,默认no。 vocabularyId 否 String 热词表id,若没有则不填。 needWordInfo 否 String 表示是否在识别结果中输出分词结果信息,取值为“yes”和“no”,默认为“no”。
  • 请求参数 请求类为SASRConfig和语音数据data,详见表2。 表2 SASRConfig 参数名称 是否必选 参数类型 描述 config 是 Config object 配置信息。 data 是 String 本地音频文件经过Base64编码后的字符串,音频文件时长小于60s。 表3 Config 参数名称 是否必选 参数类型 描述 audioFormat 是 String 音频格式,具体信息请参见《API参考》中一句话识别章节。 property 是 String 属性字符串,语言_采样率_模型,如chinese_16k_general。具体信息请参见《API参考》中一句话识别章节。 addPunc 否 String 表示是否在识别结果中添加标点,取值为yes 、 no,默认no。 digitNorm 否 String 表示是否将语音中的数字识别为阿拉伯数字,取值为yes 、 no,默认为yes。 vocabularyId 否 String 热词表id,不使用则不填写。 创建热词表请参考《API参考》中创建热词表章节。
  • 响应参数 响应类为SASRResponse,详见表4。调用失败处理方法请参见错误码。 表4 SASRResponse 参数名 是否必选 参数类型 说明 traceId 是 String 服务内部的令牌,可用于在日志中追溯具体流程,调用失败无此字段。 在某些错误情况下可能没有此令牌字符串。 result 是 SASRResult 调用成功表示识别结果,调用失败时无此字段。请参考表5。 表5 SASRResult 参数名 是否必选 参数类型 说明 text 是 String 调用成功表示识别出的内容。 score 是 Float 调用成功表示识别出的置信度,取值范围:0~1。
  • 代码示例 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 import SwiftUI import AVFoundation import SIS struct Config { static let region = "cn-north-4" static let projectId = "" } class HTTPClientDelegate: HTTPDelegate, ObservableObject { @Published var result = "" func onMessage(response: SASRResponse) { self.result = response.result.text } func onError(response: SASRErrorResponse) { self.result = response.errorMsg } } enum STATE { case IDLE case RECORDING } struct SASRView: View { @ObservedObject var delegate = HTTPClientDelegate() @State var client: SASRClient? @State var recordStatus = STATE.IDLE @State var recorder: AudioFileRecorder? var body: some View { VStack { Button("开始录音") { do { try AVAudioSession.sharedInstance().setCategory(.record) try AVAudioSession.sharedInstance().setActive(true) } catch { self.delegate.result = "初始化录音失败" return } //认证用的AK和SK硬编码在代码中或明文存储都有很大安全风险,建议在配置文件或环境变量中密文存放,使用时解密,确保安全。 //本示例以AK和SK保存在环境变量中来实现身份验证为例,运行本示例请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 let ak = ProcessInfo.processInfo.environment["HUAWEICLOUD_SDK_AK"]! let sk = ProcessInfo.processInfo.environment["HUAWEICLOUD_SDK_SK"]! let authInfo = AuthInfo(ak: ak, sk: sk, region: Config.region, projectId: Config.projectId) self.client = SASRClient(auth: authInfo) self.client!.delegate = self.delegate self.recorder = AudioFileRecorder() self.recorder?.start() self.delegate.result = "" self.recordStatus = .RECORDING } .buttonStyle(.borderedProminent) .disabled(self.recordStatus == .RECORDING) Button("停止录音") { self.recorder?.stop() let filePath = self.recorder?.filePath let binData = try! Data(contentsOf: URL(fileURLWithPath: filePath!)) let base64Data = binData.base64EncodedData() let strData = String(decoding: base64Data, as: UTF8.self) var config = SASRConfig() config.addPunc = "yes" config.digitNorm = "no" let sasrRequest = SASRRequest(config: config, data: strData) self.client!.transcribe(request: sasrRequest) self.recordStatus = .IDLE } .buttonStyle(.borderedProminent) .disabled(self.recordStatus == .IDLE) Text(delegate.result) } .padding() } } struct ContentView_Previews: PreviewProvider { static var previews: some View { SASRView() } }
  • 初始化Client 初始化SASRClient,参数为AuthInfo,详见表1。 表1 AuthInfo 参数名称 是否必选 参数类型 描述 ak 是 String 用户的ak,可参考AK/SK认证。 sk 是 String 用户的sk,可参考AK/SK认证。 region 是 String 区域,如cn-north-4,参考终端节点。 projectId 是 String 项目ID,同region一一对应,参考获取项目ID。
  • 代码示例 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 /* * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. */ package com.huaweicloud.sis.android.demo.tts; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import com.cloud.sdk.util.StringUtils; import com.huaweicloud.sdk.core.utils.JsonUtils; import com.huaweicloud.sis.android.demo.R; import com.huaweicloud.sis.android.demo.service.AudioTrackService; import com.huaweicloud.sis.android.demo.Config; import com.huaweicloud.sis.android.demo.service.AudioTrackServiceCallback; import sis.android.sdk.RttsClient; import sis.android.sdk.bean.AuthInfo; import sis.android.sdk.bean.SisHttpConfig; import sis.android.sdk.bean.request.RttsRequest; import sis.android.sdk.bean.response.RttsResponse; import sis.android.sdk.exception.SisException; import sis.android.sdk.listeners.RttsResponseListener; /** * 功能描述 * 语音合成 websocket * * @since 2022-07-18 */ public class RttsActivity extends AppCompatActivity { private EditText textView; private Button startPlay; private RttsClient rttsClient; private SisHttpConfig sisHttpConfig; private AudioTrackService audioTrackService; private AudioTrackServiceCallback audioPlayerCallback; private AuthInfo authInfo; private static int dataAcceptanceTime = 1000 * 60 * 5; private RttsResponseListener rttsResponseListener = new RttsResponseListener() { @Override public void onTranscriptionConnect() { Log.i("info", "建立连接后回调"); } @Override public void onTranscriptionClose() { Log.i("info", "关闭连接后回调"); } @Override public void onTranscriptionFail(RttsResponse response) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "出现异常" + JsonUtils.toJSON(response), Toast.LENGTH_SHORT).show(); } }); updateButtonState(startPlay, true); Log.i("info", "长连接失败后回调" + JsonUtils.toJSON(response)); } @Override public void onTranscriptionBegin(RttsResponse response) { Log.i("info", "开始合成时的响应事件" + response.toString()); } @Override public void onTranscriptionEnd(RttsResponse response) { rttsClient.close(); audioTrackService.setPlayState(AudioTrackService.PlayState.playEnd); } @Override public void onTranscriptionError(RttsResponse response) { runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "出现异常" + JsonUtils.toJSON(response), Toast.LENGTH_SHORT).show(); } }); updateButtonState(startPlay, true); Log.i("info", "合成时发生错误的响应事件" + response.toString()); } @Override public void onTranscriptionResponse(byte[] bytes) { Log.i("info", "合成过程中返回的二进制流"); audioTrackService.setAudioData(bytes); } }; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.rtts); } @Override protected void onStart() { super.onStart(); initView(); initResources(); } @Override protected void onDestroy() { super.onDestroy(); if (audioTrackService != null) { audioTrackService.stop(); audioTrackService.releaseTrack(); } } /** * 初始化UI */ private void initView() { textView = findViewById(R.id.itext); startPlay = findViewById(R.id.startplay); startPlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { updateButtonState(startPlay, false); new Thread(new Runnable() { @Override public void run() { try { audioTrackService.play(); rttsClient = new RttsClient(authInfo, sisHttpConfig, rttsResponseListener); RttsRequest rttsRequest = rttsRequets(); rttsClient.connect(); rttsClient.sendData(rttsRequest); } catch (SisException e) { Log.e("error", e.getErrorCode() + e.getErrorMsg()); } } }).start(); } }); } // 用于设置按钮的状态 private void updateButtonState(final Button btn, final boolean state) { runOnUiThread(new Runnable() { @Override public void run() { btn.setEnabled(state); } }); } /** * 初始化资源 */ private void initResources() { authInfo = new AuthInfo(this.getString(R.string.HUAWEICLOUD_SDK_AK), this.getString(R.string.HUAWEICLOUD_SDK_SK), Config.REGION, Config.PROJECT_ID); sisHttpConfig = new SisHttpConfig(); // 设置等待事件为5分钟 sisHttpConfig.setWebsocketWaitTimeout(dataAcceptanceTime); audioPlayerCallback = new AudioTrackServiceCallback() { @Override public void playStart() { } @Override public void playOver() { updateButtonState(startPlay, true); } }; audioTrackService = new AudioTrackService(audioPlayerCallback); } /** * 功能描述 * 语音合成websocket 版 */ private RttsRequest rttsRequets() { RttsRequest rttsRequest = new RttsRequest(); RttsRequest.Config config = new RttsRequest.Config(); config.setAudioFormat("pcm"); config.setProperty("chinese_huaxiaomei_common"); config.setSampleRate("16000"); config.setPitch(0); config.setVolume(50); rttsRequest.setCommand("START"); rttsRequest.setConfig(config); String text = textView.getText().toString().trim(); if (!StringUtils.isNullOrEmpty(text)) { rttsRequest.setText(text); } else { rttsRequest.setText("请输入合成音频"); } return rttsRequest; } }
  • 请求参数 请求类为RttsRequest,其中参数包含text,command,Config,详见表5。 表5 RttsRequest 参数名称 是否必选 参数类型 描述 text 是 String 待合成的文本,文本长度限制小于500字符。 command 是 String 需设置为START,表示开始识别请求。 Config 是 String 配置信息。可参照表6。 表6 Config 参数名称 是否必选 参数类型 描述 audio_format 否 String 待合成的音频格式,可选mp3,wav等,默认wav。具体信息请参见《API参考》中语音合成章节。 pitch 否 Integer 音高,[-500,500] ,默认是0。 speed 否 Integer 语速,[-500,500] ,默认是0。 volume 否 Integer 音量,[0,100],默认是50。 sample_rate 否 String 采样率,支持“8000”、“16000”,默认“8000”。 property 否 String 特征字符串,{language}_{speaker}_{domain},默认chinese_xiaoqi_common。具体信息请参见《API参考》中语音合成章节。
  • 初始化Client 初始化RttsClient,其中参数包含AuthInfo和SisHttpConfig和RttsResponseListener。其中AuthInfo和SisHttpConfig的参数如表1所示。 表1 AuthInfo 参数名称 是否必选 参数类型 描述 ak 是 String 用户的ak,可参考AK/SK认证。 sk 是 String 用户的sk,可参考AK/SK认证。 serviceRegion 是 String 区域,如cn-north-4,参考终端节点。 projectId 是 String 项目ID,同region一一对应,参考获取项目ID。 serviceEndPoint 否 String 终端节点,参考地区和终端节点。 表2 SisHttpConfig 参数名称 是否必选 参数类型 描述 connectionTimeout 否 Integer 连接超时,默认10000,单位ms。 readTimeout 否 Integer 读取超时,默认10000,单位ms。 websocketWaitTimeout 否 Integer webSocket返回数据时等待时间,默认20000,单位毫秒。 ProxyHostInfo 否 ProxyHostInfo 代理类。 表3 ProxyHostInfo 参数名称 是否必选 参数类型 描述 userName 否 String 代理用户名(例:test)。 passWord 否 String 代理密码(例:test)。 hostName 否 String 代理地址(例:“proxy.huaweicloud.com”)。 port 否 int 代理端口号(例:8080)。 其中RttsResponseListener使用户自定义的,建立webSocket之后,接受服务端返回消息的Listener。 表4 RttsResponseListener 函数名称 作用 void onTranscriptionConnect(); webSocket建立连接后后调。 void onTranscriptionClose(); webSocket连接关闭后回调。 void onTranscriptionFail(RttsResponse response); 长连接连接失败是回调。 void onTranscriptionBegin(RttsResponse response); 开始合成音频数据时回调。 void onTranscriptionEnd(RttsResponse response); 合成音频数据结束时回调。 void onTranscriptionError(RttsResponse response); 合成音频数据过程中失败时回调。 void onTranscriptionResponse(byte[] bytes); 返回合成的二进制数据。
  • 代码示例 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 import com.huawei.sis.bean.SisConfig; import com.huawei.sis.bean.SisConstant; import com.huawei.sis.bean.request.AsrCustomShortRequest; import com.huawei.sis.bean.response.AsrCustomShortResponse; import com.huawei.sis.bean.AuthInfo; import com.huawei.sis.client.AsrCustomizationClient; import com.huawei.sis.exception.SisException; import com.huawei.sis.util.IOUtils; import java.util.List; import com.huawei.sis.util.JsonUtils; /** * 一句话识别 * * Copyright 2021 Huawei Technologies Co.,Ltd. */ public class AsrCustomizationDemo { private static final int SLEEP_TIME = 500; private static final int MAX_POLLING_NUMS = 1000; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 private String ak = System.getenv("HUAWEICLOUD_SDK_AK"); private String sk = System.getenv("HUAWEICLOUD_SDK_SK"); private String region = ""; // 区域,如cn-north-1、cn-north-4 private String projectId = ""; // 项目id。登录管理控制台,鼠标移动到右上角的用户名上,在下拉列表中选择我的凭证,在项目列表中查看项目id。多项目时,展开“所属区域”,从“项目ID”列获取子项目ID。 // 一句话识别参数 private String path = ""; // 音频文件路径,如D:/test.wav等,sdk会将音频文件转化为base64编码 private String pathAudioFormat = ""; // 文件格式,如wav等 private String pathProperty = "chinese_16k_general"; // 属性字符串,language_sampleRate_domain, 16k模型推荐使用chinese_16k_general /** * 设置一句话识别参数,所有参数均有默认值,不配置也可使用 * * @param request 一句话识别请求 */ private void setShortParameter(AsrCustomShortRequest request) { // 设置是否添加标点,默认是no request.setAddPunc("yes"); // 设置是否将语音中的数字转写为阿拉伯数字,yes或no,默认yes request.setDigitNorm("no"); } /** * 定义config,所有参数可选,设置超时时间等。 * * @return SisConfig */ private SisConfig getConfig() { SisConfig config = new SisConfig(); // 设置连接超时,默认10000ms config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT); // 设置读取超时,默认10000ms config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT); // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理,new ProxyHostInfo(host, port); // ProxyHostInfo proxy = new ProxyHostInfo(host, port, username, password); // config.setProxy(proxy); return config; } /** * 一句话识别demo */ private void shortDemo() { 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. 配置请求 String data = IOUtils.getEncodeDataByPath(path); AsrCustomShortRequest request = new AsrCustomShortRequest(data, pathAudioFormat, pathProperty); // 设置请求参数,所有参数均为可选 setShortParameter(request); // 3. 发送请求,获取响应 AsrCustomShortResponse response = asr.getAsrShortResponse(request); // 打印结果 System.out.println(JsonUtils.obj2Str(response, true)); } 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.shortDemo(); } }
  • 代码示例 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 import com.huawei.sis.bean.AuthInfo; import com.huawei.sis.bean.SisConfig; import com.huawei.sis.bean.SisConstant; import com.huawei.sis.bean.request.TtsCustomRequest; import com.huawei.sis.bean.response.TtsCustomResponse; import com.huawei.sis.client.TtsCustomizationClient; import com.huawei.sis.exception.SisException; import com.huawei.sis.util.JsonUtils; /** * 语音合成的demo * * Copyright 2021 Huawei Technologies Co.,Ltd. */ public class TtsCustomizationDemo { private static final int DEFAULT_PITCH = 0; private static final int DEFAULT_SPEED = 0; private static final int DEFAULT_VOLUME = 50; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 private String ak = System.getenv("HUAWEICLOUD_SDK_AK"); private String sk = System.getenv("HUAWEICLOUD_SDK_SK"); private String region = ""; // 区域,如cn-north-1、cn-north-4 private String projectId = ""; // 项目id。登录管理控制台,鼠标移动到右上角的用户名上,在下拉列表中选择我的凭证,在项目列表中查看项目id。多项目时,展开“所属区域”,从“项目ID”列获取子项目ID。 private String text = ""; // 待合成的文本 private String path = ""; // 设置本地音频保存路径.可选择不保存到本地。需具体到文件,如D:/test.wav /** * 用于语音合成参数设置,例如发声人、音高、语速、音量、采样率、连接超时。所有参数均可以不设置,采用默认。 * * @param request 语音合成请求 */ private void setParameter(TtsCustomRequest request) { // 设置语音格式,可选MP3,pcm等,默认wav request.setAudioFormat("wav"); // 音高,[-500, 500], 默认0 request.setPitch(DEFAULT_PITCH); // 语速,[-500, 500],默认0 request.setSpeed(DEFAULT_SPEED); // 音量,[0, 100],默认50 request.setVolume(DEFAULT_VOLUME); // 当前支持8000和16000,默认8000 request.setSampleRate("8000"); // 设置property,特征字符串,{language}_{speaker}_{domain} request.setProperty("chinese_xiaoyu_common"); // 设置返回数据是否保存,默认不保存。若保存,则需要设置一下保存路径,如D:/1.wav request.setSaved(true); request.setSavePath(path); } /** * 定义config,所有参数可选,设置超时时间等。 * * @return SisConfig */ private SisConfig getConfig() { SisConfig config = new SisConfig(); // 设置连接超时,默认10000ms config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT); // 设置读取超时,默认10000ms config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT); // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理,new ProxyHostInfo(host, port); // ProxyHostInfo proxy = new ProxyHostInfo(host, port, username, password); // config.setProxy(proxy); return config; } /** * 根据文本和api,获取生成的音频数据 */ private void ttsCustomDemo() { try { // 1. 初始化TtsCustomizationClient // 定义authInfo,根据ak,sk,region, projectId. AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId); // 定义config,所有参数可选,设置超时时间。 SisConfig config = getConfig(); // 根据authInfo和config,构造TtsCustomizationClient TtsCustomizationClient tts = new TtsCustomizationClient(authInfo, config); // 2. 配置请求 TtsCustomRequest request = new TtsCustomRequest(text); // 设置参数,所有参数均可选,如果要保存合成音频文件,需要在request设置 setParameter(request); // 3. 发送请求,获取响应。具体结果可通过response.getXX获取。 TtsCustomResponse response = tts.getTtsResponse(request); System.out.println(JsonUtils.obj2Str(response, true)); } catch (SisException e) { e.printStackTrace(); System.out.println("error_code:" + e.getErrorCode() + "\nerror_msg:" + e.getErrorMsg()); } } public static void main(String[] args) { TtsCustomizationDemo demo = new TtsCustomizationDemo(); demo.ttsCustomDemo(); } }
  • 响应参数 结果响应类为RASRResponse,详见表2。调用失败处理方法请参见错误码。 表2 RASRResponse 参数名 参数类型 说明 respType String 参数值为RESULT,表示识别结果响应。 traceId String 服务内部的令牌,可用于在日志中追溯具体流程。 segments Array of RASRSentence 多句结果,请参考表3。 errorCode String 错误码。 errorMsg String 错误描述。 表3 RASRSentence 参数名 参数类型 说明 startTime Integer 一句的起始时间戳,单位为ms。 endTime Integer 一句的结束时间戳,单位为ms。 isFinal Boolen true表示是最终结果, false表示为中间临时结果。 result RASRResult 调用成功表示识别结果,调用失败时无此字段。 请参考表4。 表4 RASRResult 参数名 参数类型 说明 text String 识别结果。 score Float 识别结果的置信度,取值范围:0~1。此值仅会在最终结果时被赋值,在中间结果时统一置为“0.0”。 说明: 目前置信度作用不是太大,请勿过多依赖此值。
  • 示例代码 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 import SwiftUI import AVFAudio import SIS struct Config { static let region = "cn-north-4" static let projectId = "" } class WebSocketDelegate: NSObject, WebSocketConnectionDelegate, ObservableObject { @Published var result = "" func onConnected(connection: WebSocketConnection) { print("connected") } func onDisconnected(connection: WebSocketConnection) { print("disconnected") } func onError(connection: WebSocketConnection, error: Error) { print(error.localizedDescription) } func onMessage(connection: WebSocketConnection, response: RASRResponse) { if response.respType == "RESULT" { self.result = response.segments![0].result.text }else if (response.respType == "ERROR"){ self.result = response.errorMsg! } } } enum STATUS { case IDLE case TRANSCRIBING } struct RASRView: View { @ObservedObject var delegate = WebSocketDelegate() @State var client: RASRClient? @State var status = STATUS.IDLE var body: some View { VStack { Button("开始录音") { do { try AVAudioSession.sharedInstance().setCategory(.record) try AVAudioSession.sharedInstance().setActive(true) } catch { self.delegate.result = "初始化录音失败" return } //认证用的AK和SK硬编码在代码中或明文存储都有很大安全风险,建议在配置文件或环境变量中密文存放,使用时解密,确保安全。 //本示例以AK和SK保存在环境变量中来实现身份验证为例,运行本示例请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 let ak = ProcessInfo.processInfo.environment["HUAWEICLOUD_SDK_AK"]! let sk = ProcessInfo.processInfo.environment["HUAWEICLOUD_SDK_SK"]! let authInfo = AuthInfo(ak: ak, sk: sk, region: Config.region, projectId: Config.projectId) var config = RASRConfig() config.addPunc = "yes" config.digitNorm = "no" config.interimResults = "yes" self.client = RASRClient(auth: authInfo, config: config) self.delegate.result = "" self.client?.delegate = self.delegate self.client?.start() self.status = .TRANSCRIBING } .buttonStyle(.borderedProminent) .disabled(self.status == .TRANSCRIBING) Button("停止录音") { self.client?.stop() self.status = .IDLE } .buttonStyle(.borderedProminent) .disabled(self.status == .IDLE) Text(self.delegate.result) } .padding() } } struct RealTimeView_Previews: PreviewProvider { static var previews: some View { RASRView() } }
  • 初始化Client 初始化RASRClient,参数为AuthInfo和RASRConfig。 表1 AuthInfo 参数名称 是否必选 参数类型 描述 ak 是 String 用户的ak,可参考AK/SK认证。 sk 是 String 用户的sk,可参考AK/SK认证。 region 是 String 区域,如cn-north-4,参考终端节点。 projectId 是 String 项目ID,同region一一对应,参考获取项目ID。 表2 RASRConfig 参数名称 是否必选 参数类型 描述 audioFormat 是 String 音频格式,SDK内置录音功能只支持pcm16k16bit,参见《API参考》中开始识别章节。 property 是 String 属性字符串,language_sampleRate_domain, 如chinese_16k_general,参见《API参考》中开始识别章节。 addPunc 否 String 表示是否在识别结果中添加标点,取值为yes 、 no,默认no。 digitNorm 否 String 表示是否将语音中的数字识别为阿拉伯数字,取值为yes 、 no,默认为yes。 vocabularyId 否 String 热词表id,不使用则不填写。 创建热词表请参考《API参考》中创建热词表章节。 interimResults 否 String 是否输出中间结果,可以为yes或no。默认为no,表示不输出中间结果。
  • 示例代码 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 import com.huawei.sis.bean.AuthInfo; import com.huawei.sis.bean.RasrListener; import com.huawei.sis.bean.SisConfig; import com.huawei.sis.bean.SisConstant; import com.huawei.sis.bean.request.SasrWebsocketRequest; import com.huawei.sis.bean.response.RasrResponse; import com.huawei.sis.bean.response.StateResponse; import com.huawei.sis.client.SasrWebsocketClient; import com.huawei.sis.util.JsonUtils; /** * 一句话识别 websocket demo * * Copyright 2021 Huawei Technologies Co.,Ltd. */ public class SasrWebsocketDemo { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 private String ak = System.getenv("HUAWEICLOUD_SDK_AK"); private String sk = System.getenv("HUAWEICLOUD_SDK_SK"); private String region = "cn-north-4"; // 区域,如cn-north-1、cn-north-4 private String projectId = ""; // 项目id,在我的凭证查看。参考https://support.huaweicloud.com/api-sis/sis_03_0008.html private String path = ""; // 本地音频路径,如D:/test.wav, sdk也支持byte数组传送 private String audioFormat = "pcm16k16bit"; // 音频格式,如pcm16k16bit,详见api文档或sdk文档 private String property = "chinese_16k_common"; // 属性字符串,language_sampleRate_domain,如chinese_16k_common, 详见api文档 /** * 一句话识别websocket版本参数设置,所有参数设置均为可选,均有默认值。用户根据需求设置参数。 * * @param request request请求,包含各种参数 */ private void setParameters(SasrWebsocketRequest request) { // 1. 设置是否添加标点符号,yes 或 no, 默认"no" request.setAddPunc("yes"); // 2. 设置是否显示中间结果,yes或no,默认“no” request.setIntermediateResult("no"); // 3. 设置热词表id, 若没有则设置,否则会报错。 // request.setVocabularyId(""); // 4. 设置是否将音频中数字转写为阿拉伯数字,yes or no,默认yes request.setDigitNorm("no"); // 5. 设置是否需要word_info,yes or no, 默认no request.setNeedWordInfo("no"); } /** * 定义config,所有参数可选,设置超时时间等。 * * @return SisConfig */ private SisConfig getConfig() { SisConfig config = new SisConfig(); // 设置连接超时,默认10000ms config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT); // 设置读取超时,默认10000ms config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT); // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理,new ProxyHostInfo(host, port); // ProxyHostInfo proxy = new ProxyHostInfo(host, port, username, password); // config.setProxy(proxy); return config; } /** * 获取监听器,监听器的监听函数。 * * @return RasrListener,用于监听websocket */ private RasrListener getRasrListener() { RasrListener rasrListener = new RasrListener() { @Override /** * 连接成功回调 */ public void onTranscriptionConnect() { System.out.println("sasr websocket connected"); } @Override /** * 断开连接回调 */ public void onTranscriptionClose() { System.out.println("sasr websocket closed"); } @Override /** * 响应结果回调 */ public void onTranscriptionResponse(RasrResponse response) { printResponse(response); } @Override /** * 识别开始回调 */ public void onTranscriptionBegin(StateResponse response) { printResponse(response); } @Override /** * 识别结束回调 */ public void onSTranscriptionEnd(StateResponse response) { printResponse(response); } @Override /** * 识别出错回调 */ public void onTranscriptionFail(StateResponse response) { printResponse(response); } @Override public void onEvent(String event) { log.info("receive event {}", event); } }; return rasrListener; } private void printResponse(Object response) { try { System.out.println(JsonUtils.obj2Str(response, true)); } catch (Exception e) { e.printStackTrace(); } } /** * 实时语音识别SDK的工作流程 */ private void process() { // 1. 实现监听器接口listener,用户自定义收到响应的处理逻辑。 RasrListener listener = getRasrListener(); // 2. 初始化SasrWebsocketClient AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId); SasrWebsocketClient sasrWebsocketClient = new SasrWebsocketClient(authInfo, listener, getConfig()); try { // 3. 配置参数 // audioFormat为支持格式、property为属性字符串,具体填写请详细参考api文档 SasrWebsocketRequest request = new SasrWebsocketRequest(audioFormat, property); setParameters(request); // 4 连接websocket sasrWebsocketClient.sasrConnect(request); // 5. 发送开始请求、发送音频、发送end请求 // 发送开始请求,即将开始请求连带配置发送至服务端 sasrWebsocketClient.sendStart(); // 也可以自己控制发送速率.byteLen为每次发送大小,sleepTime为每次发送后睡眠时间(ms),一些非持续获取音频场景不需要睡眠,可设置为0. sasrWebsocketClient.sendAudio(path); // sasrWebsocketClient.sendAudio(path, byteLen, sleepTime); // 可直接发送byte流,即byte数组 // byte[] data = IOUtils.getFileData(path); // sasrWebsocketClient.sendByte(data); // sasrWebsocketClient.sendByte(data, byteLen, sleepTime); // 发送结尾请求 sasrWebsocketClient.sendEnd(); } catch (Exception e) { e.printStackTrace(); } finally { // 6. 关闭客户端。发送完毕后,此步一定要实施,否则服务端因为20s没有接受任何消息而报异常。 sasrWebsocketClient.close(); } } public static void main(String[] args) { SasrWebsocketDemo sasrWebsocketDemo = new SasrWebsocketDemo(); sasrWebsocketDemo.process(); } }
  • 代码示例 如下示例仅供参考,最新代码请前往获取SDK章节获取并运行。 import com.cloud.sdk.util.StringUtils; import com.huawei.sis.bean.AuthInfo; import com.huawei.sis.bean.RttsListener; import com.huawei.sis.bean.SisConfig; import com.huawei.sis.bean.SisConstant; import com.huawei.sis.bean.request.RttsRequest; import com.huawei.sis.bean.response.RttsDataResponse; import com.huawei.sis.bean.response.StateResponse; import com.huawei.sis.client.RttsClient; import com.huawei.sis.util.JsonUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * 实时语音合成Demo * * Copyright 2021 Huawei Technologies Co.,Ltd. */ public class RttsDemo { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全; // 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。 private String ak = System.getenv("HUAWEICLOUD_SDK_AK"); private String sk = System.getenv("HUAWEICLOUD_SDK_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 text = ""; // 待合成的文本 private String path = ""; // 合成音频存储的路径 public static void main(String[] args) { RttsDemo rttsDemo = new RttsDemo(); rttsDemo.process(); } /** * 实时语音合成参数设置,所有参数设置均为可选,均有默认值。用户根据需求设置参数。 */ private RttsRequest getRttsRequest() { RttsRequest request = new RttsRequest(); request.setCommand("START"); // 设置待合成文本,文本长度1-500字 request.setText(text); RttsRequest.Config config = new RttsRequest.Config(); // 设置发音人属性,{language}_{speaker}_{domain}, 详见api文档 config.setPorperty("chinese_xiaoyan_common"); // 设置合成音频格式,默认pcm config.setAudioFormat("pcm"); // 设置合成音频采样率,当前支持8000和16000,默认8000 config.setSampleRate("8000"); // 设置合成音频音量大小,取值0-100,默认50 config.setVolume(50); // 设置合成音频音高大小,取值-500-500,默认0 config.setPitch(0); // 设置合成音频语速大小,取值-500-500,默认0 config.setSpeed(0); request.setConfig(config); return request; } /** * 定义config,所有参数可选,设置超时时间等。 * * @return SisConfig */ private SisConfig getConfig() { SisConfig config = new SisConfig(); // 设置连接超时,默认10000ms config.setConnectionTimeout(SisConstant.DEFAULT_CONNECTION_TIMEOUT); // 设置读取超时,默认10000ms config.setReadTimeout(SisConstant.DEFAULT_READ_TIMEOUT); // 设置websocket等待超时时间,默认20000ms config.setWebsocketWaitTimeout(SisConstant.DEFAULT_WEBSOCKET_WAIT_TIME); // 设置代理, 一定要确保代理可用才启动此设置。 代理初始化也可用不加密的代理,new ProxyHostInfo(host, port); // ProxyHostInfo proxy = new ProxyHostInfo(host, port, username, password); // config.setProxy(proxy); return config; } private void printResponse(Object response) { try { System.out.println(JsonUtils.obj2Str(response, true)); } catch (Exception e) { e.printStackTrace(); } } /** * 实时语音转写SDK的工作流程 * 1. RttsClient只能发送一次文本,如有多个文本需发送,需要多次新建RttsClient实例 * 2. 实时语音合成会多次收到音频响应,默认格式为pcm。在demo中会把多次返回的结果拼接起来,存入文件中。 * 3. 当服务端完成合成任务后,会返回end响应。 */ private void process() { // 1. 实现监听器接口RttsListener,用户自定义收到响应的处理逻辑。 RttsListener rttsListener = new MyRttsListener(path); // 2. 初始化RttsClient,每个client只能发送一次text,如需发送多次text,需要建立多个client AuthInfo authInfo = new AuthInfo(ak, sk, region, projectId); RttsClient rttsClient = new RttsClient(authInfo, rttsListener, getConfig()); // 3. 配置参数 // audioFormat为支持格式、property为属性字符串,具体填写请详细参考api文档 RttsRequest request = getRttsRequest(); // 4. 发送待合成文本,等待结果 try { rttsClient.synthesis(request); } catch (Exception e) { e.printStackTrace(); } } public class MyRttsListener implements RttsListener { private String path; private FileOutputStream fos = null; public MyRttsListener() { super(); } public MyRttsListener(String path) { this.path = path; } @Override public void onTranscriptionResponse(RttsDataResponse rttsDataResponse) { System.out.println("receive binary data " + rttsDataResponse.getData().length); if (fos == null) { return; } try { fos.write(rttsDataResponse.getData()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onTranscriptionBegin(StateResponse response) { printResponse(response); try { if (StringUtils.isNullOrEmpty(path)) { return; } File f = new File(path); fos = new FileOutputStream(f); } catch (IOException e) { e.printStackTrace(); } } @Override public void onSTranscriptionEnd(StateResponse response) { printResponse(response); close(); } @Override public void onTranscriptionFail(StateResponse response) { printResponse(response); close(); } private void close() { if (fos == null) { return; } try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
  • 发送请求 RecognizeShortAudioResponse response = client.recognizeShortAudio(request); 返回体RecognizeShortAudioResponse的参数如下表所示。 状态码: 200 表2 响应Body参数 参数 是否必选 参数类型 描述 trace_id 是 String 服务内部的令牌,可用于在日志中追溯具体流程,调用失败无此字段。 在某些错误情况下可能没有此令牌字符串。 result 是 Result object 调用成功表示识别结果,调用失败时无此字段。 表3 Result 参数 是否必选 参数类型 描述 text 是 String 调用成功表示识别出的内容。 score 是 Float 调用成功表示识别出的置信度,取值范围:0~1。 word_info 否 Array of WordInfo objects 分词信息列表。 表4 WordInfo 参数 是否必选 参数类型 描述 start_time 否 Integer 起始时间。 end_time 否 Integer 结束时间。 word 否 String 分词。 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 调用失败时的错误码。 调用成功时无此字段。 error_msg String 调用失败时的错误信息。 调用成功时无此字段。
  • 请求参数 请求类为RecognizeShortAudioRequest,该类的body参数为PostShortAudioReq。 PostShortAudioReq的包含data,和config两个参数,其中data为识别音频的base64格式的字符串。Config参数详见表1。 表1 Config 参数 是否必选 参数类型 描述 audioFormat 是 String 支持语音的格式,请参考表 audio_format取值范围。 property 是 String 所使用的模型特征串,通常是 “语种_采样率_领域”的形式,采样率需要与音频采样率保持一致,取值范围请参考表 property取值范围。 addPunc 否 String 表示是否在识别结果中添加标点,取值为“yes”和“no”,默认为“no”。 digitNorm 否 String 表示是否将语音中的数字识别为阿拉伯数字,取值为“yes” 和 “no”,默认为“yes”。 vocabularyId 否 String 热词表id,不使用则不填写。 创建热词表信息请参考创建热词表。 needWordInfo 否 String 表示是否在识别结果中输出分词结果信息,取值为“yes”和“no”,默认为“no”。 伪代码 com.huaweicloud.sdk.sis.v1.model.Config configbody = new com.huaweicloud.sdk.sis.v1.model.Config();configbody.setAudioFormat(com.huaweicloud.sdk.sis.v1.model.Config.AudioFormatEnum.fromValue("pcm16k16bit")); configbody.setProperty(com.huaweicloud.sdk.sis.v1.model.Config.PropertyEnum.fromValue("chinese_16k_general")); configbody.setAddPunc(com.huaweicloud.sdk.sis.v1.model.Config.AddPuncEnum.YES); RecognizeShortAudioRequest request = new RecognizeShortAudioRequest(); PostShortAudioReq body = new PostShortAudioReq();body.withData(encoded);body.withConfig(configbody); request.withBody(body);
  • 初始化Client 初始化SisClient,详细信息如下。 配置客户端连接参数。 默认配置 // 使用默认配置 HttpConfig config = HttpConfig.getDefaultHttpConfig(); 网络代理(可选) // 根据需要配置网络代理,网络代理默认的协议为 `http` 协议 config.withProxyHost("proxy.huaweicloud.com") .withProxyPort(8080) .withProxyUsername("test") .withProxyPassword("test"); 超时配置(可选) // 默认连接超时时间为60秒,可根据需要调整 config.withTimeout(60); SSL配置(可选) // 根据需要配置是否跳过SSL证书验证 config.withIgnoreSSLVerification(true); 配置认证信息。 配置AK、SK、project_id信息。华为云通过AK识别用户的身份,通过SK对请求数据进行签名验证,用于确保请求的机密性、完整性和请求者身份的正确性。 使用永久AK和SK BasicCredentials basicCredentials = new BasicCredentials() .withAk(ak) .withSk(sk) .withProjectId(projectId); 使用临时AK和SK BasicCredentials basicCredentials = new BasicCredentials() .withAk(ak) .withSk(sk) .withSecurityToken(securityToken) .withProjectId(projectId) 认证参数说明: ak、sk:访问秘钥信息,获取方法请参考AK/SK认证。 projectId:华为云项目ID,获取方法请参考获取项目ID。。 securityToken:采用临时AK、SK 认证场景下的安全票据,可以通过token获取或者通过委托授权获取。 初始化客户端(region和指定云服务enddpoint二选一即可)。 指定region方式(强烈推荐推荐) // 初始化客户端认证信息,使用当前客户端初始化方式可不填 projectId/domainId,以初始化 BasicCredentials 为例 BasicCredentials basicCredentials = new BasicCredentials() .withAk(ak) .withSk(sk); // 初始化指定云服务的客户端 {Service}Client ,以初始化 Region 级服务Sis的 SisClient 为例 SisClient client = SisClient.newBuilder() .withHttpConfig(config) .withCredential(bhttps://developer.huaweicloud.com/endpoint?SISasicCredentials) .withRegion(SisRegion.valueOf("cn-north-4")) .build(); 指定云服务endpoint方式(可选) // 指定终端节点,以Sis服务北京四的 endpoint 为例 String endpoint = "https://sis-ext.cn-north-4.myhuaweicloud.com"; // 初始化客户端认证信息,需要填写相应 projectId/domainId,以初始化 BasicCredentials 为例 BasicCredentials basicCredentials = new BasicCredentials() .withAk(ak) .withSk(sk) .withProjectId(projectId); // 初始化指定云服务的客户端 {Service}Client ,以初始化 Region 级服务SiS的 SisClient 为例 SisClient client = SisClient.newBuilder() .withHttpConfig(config) .withCredential(basicCredentials) .withEndpoint(endpoint) .build(); endpoint是华为云各服务应用区域和各服务的终端节点,详情请查看 地区和终端节点。
  • 响应参数 响应类为RunTtsResponse,详见下表。调用失败处理方法请参见错误码。 表2 RunTtsResponse 参数名 是否必选 参数类型 说明 trace_id 是 String 服务内部的令牌,可用于在日志中追溯具体流程,调用失败无此字段。 在某些错误情况下可能没有此令牌字符串。 result 是 Object 调用成功时为合成语音内容,请参考表3。 调用失败时无此字段。 表3 Result 参数名 是否必选 参数类型 说明 data 是 String 合成后生成的语音数据,以Base64编码格式返回。用户如需生成音频,需要将Base64编码解码成byte数组,再保存为wav音频。
共100000条