华为云用户手册

  • 目标集群资源规划 CCE支持对集群资源进行自定义选择,以满足您的多种业务需求。表1中列举了集群的主要性能参数,并给出了本示例的规划值,您可根据业务的实际需求大小进行设置,建议与原集群性能配置保持相对一致。 集群创建成功后,表1中带“*”号的资源参数将不可更改,请谨慎选择。 表1 CCE集群规划 资源 主要性能参数 参数说明 本示例规划 集群 *集群类型 CCE集群:支持虚拟机节点。基于高性能网络模型提供全方位、多场景、安全稳定的容器运行环境。 CCE Turbo 集群:基于云原生基础设施构建的云原生2.0容器引擎服务,具备软硬协同、网络无损、安全可靠、调度智能的优势,为用户提供一站式、高性价比的全新容器服务体验。支持裸金属节点。 CCE集群 *网络模型 VPC网络:采用VPC路由方式与底层网络深度整合,适用于高性能场景,节点数量受限于 虚拟私有云VPC 的路由配额。 容器隧道网络(Overlay):基于底层VPC网络,另构建了独立的VXLAN隧道化容器网络,适用于一般场景。 云原生2.0:深度整合弹性网卡(Elastic Network Interface,简称ENI)能力,采用VPC网段分配容器地址,支持ELB直通容器,享有高性能。 VPC网络 *控制节点数 3:三个控制节点,容灾性能好,在单个控制节点发生故障后集群可以继续使用,不影响业务功能。 1:单个控制节点,不建议在商用场景使用。 3 节点 OS类型 EulerOS CentOS Ubuntu EulerOS 节点规格(根据实际区域可能存在差异) 通用型:该类型实例提供均衡的计算、存储以及网络配置,适用于大多数的使用场景。通用型实例可用于Web服务器、开发测试环境以及小型数据库工作负载等场景。 内存优化型:该类型实例提供内存比例更高的实例,可以用于对内存要求较高、数据量大的工作负载,例如关系数据库、NoSQL等场景。 通用入门型:通用入门型实例提供均衡的计算、存储以及网络配置,利用CPU积分机制保证基准性能,适合平时不会持续高压力使用CPU,但偶尔需要提高计算性能完成工作负载的场景,可用于轻量级Web服务器、开发、测试环境以及中低性能数据库等场景。 GPU加速型:提供优秀的浮点计算能力,从容应对高实时、高并发的海量计算场景。P系列适合于深度学习,科学计算,CAE等;G系列适合于3D动画渲染,CAD等。仅支持1.11及以上版本集群添加GPU加速型节点。 高性能计算型:实例提供具有更稳定、超高性能计算性能的实例,可以用于超高性能计算能力、高吞吐量的工作负载场景,例如科学计算。 通用计算增强型:该类型实例具有性能稳定且资源独享的特点,满足计算性能高且稳定的企业级工作负载诉求。 磁盘增强型:该类型实例能提供可使用本地磁盘存储以及更高网络性能的实例,可以用于处理需要高吞吐以及高数据交换处理的工作负载,例如大数据工作负载等场景。 超高I/O型:该类型实例提供超低SSD盘访问延迟和超高IOPS性能,适用于高性能关系型数据库、NoSQL数据库(如Cassandra、MongoDB)、ElasticSearch搜索等场景。 AI加速型:AI加速型节点实例,搭载高性能、低功耗的海思Ascend 310 AI处理器,实现快速高效地处理推理和图像识别等工作,适用于图像识别、视频处理、推理计算以及机器学习等场景。 通用型(节点规格为4U8G) 系统盘类型 高IO:后端存储介质为SAS类型。 超高IO:后端存储介质为SSD类型。 高IO 存储类型 云硬盘存储卷:CCE支持将EVS创建的云硬盘挂载到容器的某一路径下。当容器迁移时,挂载的云硬盘将一同迁移,这种存储方式适用于需要永久化保存的数据。 文件存储卷: CCE支持创建SFS存储卷并挂载到容器的某一路径下,也可以使用底层SFS服务创建的文件存储卷,SFS存储卷适用于多读多写的持久化存储,适用于多种工作负载场景,包括 媒体处理 、内容管理、大数据分析和分析工作负载程序等场景。 对象存储卷:CCE支持创建OBS对象存储卷并挂载到容器的某一路径下,对象存储适用于云工作负载、数据分析、内容分析和热点对象等场景。 极速文件存储卷:CCE支持创建SFS Turbo极速文件存储卷并挂载到容器的某一路径下,极速文件存储具有按需申请,快速供给,弹性扩展,方便灵活等特点,适用于DevOps、容器微服务、企业办公等应用场景。 云硬盘存储卷 父主题: 将自建K8s集群迁移到CCE
  • 获取长期的docker login命令 在Jenkins安装部署过程中,已经完成了容器中执行docker命令的配置(参见9),故Jenkins对接SWR无需额外配置,可直接执行docker命令。仅需获取长期有效的SWR登录指令,具体步骤请参见获取长期有效docker login指令。 例如本账号的命令为: docker login -u cn-east-3@xxxxx -p xxxxx swr.cn-east-3.myhuaweicloud.com
  • 创建pipeline完成镜像构建及push 本示例将使用Jenkins构建一条流水线,该流水线的作用是从代码仓中拉取代码并打包成镜像推送到SWR镜像仓库中。 创建pipeline步骤如下: 在Jenkins界面单击“New Item”。 输入任务名称,并选择创建流水线。 配置pipeline脚本,其他步骤不配置。 以下pipeline脚本仅供您参考,您可根据自身业务自定义脚本内容,关于更多关于流水线脚本的语法请参考Pipeline。 示例脚本中的部分参数需要修改: git_url:您代码仓库的地址,需要替换为实际取值。 swr_login:登录命令为获取长期的docker login命令获取的命令。 swr_region:SWR的区域。 organization:SWR中的实际组织名称。 build_name:制作的镜像名称。 credential:添加到Jenkins的集群凭证,请填写凭证ID。如果需要部署在另一个集群,需要重新将这个集群的访问凭证添加到Jenkins,具体操作请参考设置集群访问凭证。 apiserver:部署应用集群的APIserver地址,需保证从Jenkins集群可以正常访问该地址。 //定义代码仓地址 def git_url = 'https://github.com/lookforstar/jenkins-demo.git' //定义SWR登录指令 def swr_login = 'docker login -u cn-east-3@xxxxx -p xxxxx swr.cn-east-3.myhuaweicloud.com' //定义SWR区域 def swr_region = 'cn-east-3' //定义需要上传的SWR组织名称 def organization = 'container' //定义镜像名称 def build_name = 'jenkins-demo' //部署集群的证书ID def credential = 'k8s-token' //集群的APIserver地址,需保证从Jenkins集群可以正常访问该地址 def apiserver = 'https://192.168.0.100:6443' pipeline { agent any stages { stage('Clone') { steps{ echo "1.Clone Stage" git url: git_url script { build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() } } } stage('Test') { steps{ echo "2.Test Stage" } } stage('Build') { steps{ echo "3.Build Docker Image Stage" sh "docker build -t swr.${swr_region}.myhuaweicloud.com/${organization}/${build_name}:${build_tag} ." //${build_tag}表示获取上文中的build_tag变量作为镜像标签,为git rev-parse --short HEAD命令的返回值,即commit ID。 } } stage('Push') { steps{ echo "4.Push Docker Image Stage" sh swr_login sh "docker push swr.${swr_region}.myhuaweicloud.com/${organization}/${build_name}:${build_tag}" } } stage('Deploy') { steps{ echo "5. Deploy Stage" echo "This is a deploy step to test" script { sh "cat k8s.yaml" echo "begin to config kubenetes" try { withKubeConfig([credentialsId: credential, serverUrl: apiserver]) { sh 'kubectl apply -f k8s.yaml' //该YAML文件位于代码仓中,此处仅做示例,请您自行替换 } println "hooray, success" } catch (e) { println "oh no! Deployment failed! " println e } } } } } } 保存后执行Jenkins job。
  • 应用功能验证 由于集群迁移是对应用数据的全量迁移,可能存在应用内适配问题。例如本示例中,集群迁移后,Wordpress中发布的文章跳转链接仍是原域名,单击文章标题将会重定向至原集群中的应用实例,因此需要通过搜索将Wordpress中原有的旧域名并替换为新域名,并修改数据库中的site_url和主url值,具体操作可参考更改站点URL。 最后在浏览器上访问迁移后的Wordpress应用新地址,可以看到迁移前发布的文章,说明持久卷的数据还原成功。
  • 访问服务更新适配 集群迁移后,原有集群的访问服务可能无法生效,可执行如下步骤更新服务。如原集群中设置了Ingress资源,迁移后需重新对接ELB,您可参考添加Ingress-对接已有ELB。 通过kubectl连接集群。 编辑对应Service的YAML文件,修改服务类型及端口。 kubectl edit svc wordpress LoadBanlancer资源进行更新时,需要重新对接ELB。请参考通过kubectl命令行创建-使用已有ELB,添加如下Annotation: annotations: kubernetes.io/elb.class: union #共享型ELB kubernetes.io/elb.id: 9d06a39d-xxxx-xxxx-xxxx-c204397498a3 #ELB的ID,可前往ELB控制台查询 kubernetes.io/elb.subnet-id: f86ba71c-xxxx-xxxx-xxxx-39c8a7d4bb36 #集群所在子网的ID kubernetes.io/session-affinity-mode: SOURCE_IP #开启会话保持,基于源IP地址 浏览器访问查看服务是否可用。
  • 数据库更新适配 本例中数据库为本地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集群 通过多台E CS 自建的集群 其他云服务商提供的集群服务 在迁移前,需对原集群的所有资源进行分析再决定迁移方案,可迁移的资源包括集群内资源和集群外资源,如下表所示。 表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 AC CES S 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。
  • 请求参数 请求类为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”。
  • 初始化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长连接连接失败是回调。
  • 响应参数 响应类为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。
  • 请求参数 请求类为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参考》中创建热词表章节。
  • 请求参数 请求类为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参考》中语音合成章节。
  • 代码示例 如下示例仅供参考,最新代码请前往获取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; } }
  • 初始化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(); } }
  • 示例代码 如下示例仅供参考,最新代码请前往获取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() } }
  • 响应参数 结果响应类为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”。 说明: 目前置信度作用不是太大,请勿过多依赖此值。
  • 初始化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(); } }
共100000条