介绍
ChatTTS是专门为对话场景设计的文本转语音模型,例如LLM助手对话任务。它支持英文和中文两种语言。最大的模型使用了10万小时以上的中英文数据进行训练。ChatTTS webUI & API 为 ChatTTS 提供了网页界面和API服务。
资源编排服务(Resource Orchestration Service, ROS)是阿里云提供基于基础设施即代码(Infrastructure as Code, IaC) 理念的自动化部署服务,我们可以通过定义一个 Terraform 模板,轻松部署一套云上的 ChatTTS 环境。
部署步骤
- 登录ROS控制台-ChatTTS部署页面
- 配置模板参数:选择 ECS 实例的可用区、实例类型等
- 点击【下一步】,然后【创建】。部署完成后,点击资源栈的输出,即可看到 ChatTTS 服务的地址。点击链接即可体验 ChatTTS 的功能。
⚠️说明:
由于服务首次启动会下载模型,需要等待2-5分钟后才能正常访问。
本示例使用 GitHub 镜像站点进行克隆,以避免网络问题。
ChatTTS 安装在 /opt/chat-tts-ui 下,日志文件为 app.log。
部署原理
我们可以看到通过 ROS 可以非常快捷地部署阿里云上的各种云资源(比如 alicloud_vpc、alicloud_vswitch、alicloud_instance 实例等)和应用程序(比如 ChatTTS)。如果想了解是如何做到的,那么可以阅读此章节。
- 编写 Terraform 模板。在如下模板中定义了:
- resource:定义了 VPC、VSwitch、ECS 实例、安全组、安全组规则以及安装 ChatTTS 的命令执行。
- variable:定义了常用的参数,比如可用区、ECS实例类型类型。
- output:定义了自定义输出,比如 ChatTTS 服务的地址
variable "zone_id" {type = stringdescription = <<EOT{"AssociationProperty": "ALIYUN::ECS::Instance:ZoneId","Label": {"zh-cn": "可用区ID"}}EOT
}variable "instance_type" {type = stringdescription = <<EOT{"AssociationProperty": "ALIYUN::ECS::Instance::InstanceType","AssociationPropertyMetadata": {"ZoneId": "$${zone_id}","DefaultValueStrategy": "recent"},"Label": {"zh-cn": "实例类型"}}EOT
}variable "system_disk_category" {type = stringdescription = <<EOT{"AssociationProperty": "ALIYUN::ECS::Disk::SystemDiskCategory","AssociationPropertyMetadata": {"ZoneId": "$${zone_id}","LocaleKey": "DiskCategory","InstanceType": "$${instance_type}","AutoSelectFirst": true,"AutoChangeType": false},"Label": {"zh-cn": "系统盘类型"}}EOT
}variable "password" {type = stringdescription = <<EOT{"ConstraintDescription": {"en": "Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).","zh-cn": "长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)。"},"Description": {"en": "Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in).","zh-cn": "服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)。"},"Default": null,"AllowedPattern": "[0-9A-Za-z\\_\\-\\&:;'<>,=%`~!@#\\(\\)\\$\\^\\*\\+\\|\\{\\}\\[\\]\\.\\?\\/]+$","MinLength": 8,"MaxLength": 30,"NoEcho": true,"Label": {"zh-cn": "实例密码"}}EOT
}resource "alicloud_vpc" "vpc" {vpc_name = "game-vpc"cidr_block = "192.168.0.0/16"
}resource "alicloud_vswitch" "vswitch" {vpc_id = alicloud_vpc.vpc.idzone_id = var.zone_idcidr_block = "192.168.0.0/24"
}resource "alicloud_security_group" "group" {vpc_id = alicloud_vpc.vpc.id
}resource "alicloud_security_group_rule" "rule" {type = "ingress"ip_protocol = "tcp"nic_type = "intranet"policy = "accept"port_range = "9966/9966"security_group_id = alicloud_security_group.group.idcidr_ip = "0.0.0.0/0"
}resource "alicloud_instance" "ecs" {availability_zone = var.zone_idsecurity_groups = alicloud_security_group.group.*.idinstance_type = var.instance_typesystem_disk_category = var.system_disk_categoryimage_id = "ubuntu_22_04_x64_20G_alibase_20240530.vhd"instance_name = "ChatTTS"vswitch_id = alicloud_vswitch.vswitch.idpassword = var.passwordinternet_max_bandwidth_out = 1
}locals {command = <<EOF
#!/bin/bash
echo "#########################"
echo "# Install ChatTTS Web UI"
echo "#########################"
apt-get update
apt-get install -y python3-venvgit clone --depth 1 https://gitclone.com/github.com/jianchang512/ChatTTS-ui.git /opt/chat-tts-ui && cd /opt/chat-tts-ui
ret_code=$?
if [ $ret_code -ne 0 ]; thenecho "Git clone https://gitclone.com/github.com/jianchang512/ChatTTS-ui.git failed. Exiting."exit $ret_code
fipython3 -m venv venv
source ./venv/bin/activate
pip3 install -r requirements.txt
export WEB_ADDRESS=0.0.0.0:9966
nohup python3 app.py > app.log 2>&1 &
EOFbase_64_command = base64encode(local.command)
}resource "alicloud_ecs_command" "command" {name = "game-command"command_content = local.base_64_commandtype = "RunShellScript"timeout = 1200working_dir = "/root"
}resource "alicloud_ecs_invocation" "default" {command_id = alicloud_ecs_command.command.idinstance_id = [alicloud_instance.ecs.id]timeouts {create = "1200s"}
}output "ChatTTS_URL" {value = format("http://%s:9966", alicloud_instance.ecs.public_ip)
}
- 在 ROS 控制台中使用此模板创建资源栈。ROS 提供的 Terraform 托管服务会自动解析出模板中资源的依赖关系,按照资源依赖顺序创建云资源。如果资源间没有依赖,则会并发创建,从而提升部署效率。ROS 会把这次创建的所有资源存放到一个“资源栈”中,后续可以方便地管理这组资源集合。比如:
- 将新模板应用到这个“资源栈”中,从而更新里面的资源。
- 删除这个“资源栈”,从而把所有的资源删掉。
总结
基于 IaC 的理念,通过定义一个模板,使用 ROS 提供的 Terraform 托管服务进行自动化部署,可以非常高效快捷地部署任意云资源和应用(比如 ChatTTS 服务)。相比于手动部署或者通过 API、SDK 的部署方式,有着高效、稳定等诸多优势,也是服务上云的最佳实践。