CosyVoice自定义语音训练:打造专属AI声音的完整流程
引言:AI语音定制的痛点与解决方案
你是否还在为通用TTS(Text-to-Speech,文本转语音)模型无法满足特定场景需求而困扰?企业客服需要统一的品牌声音,内容创作者渴望个性化的虚拟主播声线,语言学习者则需要标准发音的定制语音。CosyVoice作为一款多语言语音生成模型,提供了从数据准备到模型部署的全栈能力,让你无需深厚的语音合成知识即可训练专属AI声音。本文将带你深入CosyVoice的自定义语音训练流程,从环境搭建到模型微调,再到最终的语音生成,全程实战,一步到位。
读完本文,你将能够:
- 理解CosyVoice的技术架构与自定义训练原理
- 准备符合要求的语音数据集并完成预处理
- 配置训练参数并启动模型训练
- 评估训练效果并优化模型性能
- 部署自定义语音模型并实现语音生成
技术架构解析:CosyVoice的核心组件
CosyVoice采用模块化设计,主要由文本编码器(Text Encoder)、语言模型(LLM)、流匹配解码器(Flow Matching Decoder)和HiFi-GAN声码器(Vocoder)四部分组成。这种架构允许各模块独立训练与优化,极大提升了自定义语音的灵活性。
核心组件功能
| 组件 | 功能描述 | 输入 | 输出 |
|---|---|---|---|
| 文本编码器 | 将文本转换为语义向量 | 文本序列 | 文本嵌入向量(512维) |
| 语言模型 | 生成语音令牌序列 | 文本嵌入向量+说话人嵌入 | 语音令牌序列(4096类) |
| 流匹配解码器 | 将语音令牌转换为梅尔频谱 | 语音令牌序列+说话人嵌入 | 梅尔频谱(80维) |
| HiFi-GAN声码器 | 将梅尔频谱转换为波形 | 梅尔频谱+基频(F0) | 音频波形(22050Hz) |
技术流程图
环境准备:从依赖安装到硬件要求
系统要求
CosyVoice训练对硬件有较高要求,尤其是GPU显存。建议配置如下:
- GPU:NVIDIA GPU,显存≥16GB(推荐RTX 3090/4090或A100)
- CPU:≥8核,主频≥3.0GHz
- 内存:≥32GB
- 存储:≥100GB空闲空间(用于数据集和模型文件)
- 操作系统:Linux(推荐Ubuntu 20.04/22.04)
依赖安装
首先克隆项目仓库并安装依赖:
# 克隆仓库
git clone https://gitcode.com/gh_mirrors/cos/CosyVoice.git
cd CosyVoice
# 创建虚拟环境
conda create -n cosyvoice python=3.10 -y
conda activate cosyvoice
# 安装依赖
pip install -r requirements.txt
注意:requirements.txt中指定了PyTorch 2.3.1和CUDA 12.1版本,确保你的系统已安装对应版本的NVIDIA驱动。若使用不同CUDA版本,需修改requirements.txt中的对应依赖,如将
torch==2.3.1替换为与你的CUDA版本匹配的PyTorch版本。
预训练模型下载
CosyVoice提供了预训练模型作为微调起点,可显著减少训练时间。下载预训练模型:
# 创建预训练模型目录
mkdir -p pretrained_models/CosyVoice-300M
# 下载模型文件(示例链接,实际请参考官方文档)
wget https://example.com/CosyVoice-300M/llm.pt -P pretrained_models/CosyVoice-300M
wget https://example.com/CosyVoice-300M/flow.pt -P pretrained_models/CosyVoice-300M
wget https://example.com/CosyVoice-300M/hifigan.pt -P pretrained_models/CosyVoice-300M
wget https://example.com/CosyVoice-300M/campplus.onnx -P pretrained_models/CosyVoice-300M
wget https://example.com/CosyVoice-300M/speech_tokenizer_v1.onnx -P pretrained_models/CosyVoice-300M
数据集准备:录制、清洗与预处理
数据采集规范
高质量的训练数据是获得良好合成语音的关键。以下是数据采集的核心要求:
- 时长:至少1小时(推荐3-5小时,可显著提升效果)
- 采样率:22050Hz(与模型默认配置一致)
- 格式:WAV格式,16位单声道
- 内容:文本内容应多样化,涵盖不同语速、语调、情感(如陈述、疑问、感叹)
- 质量:低噪声、无回声、清晰发音,避免背景音乐和杂音
数据组织结构
将采集的音频和文本按以下结构组织:
custom_dataset/
├── train/
│ ├── audio/
│ │ ├── 001.wav
│ │ ├── 002.wav
│ │ └── ...
│ └── text.txt
└── dev/
├── audio/
│ ├── 001.wav
│ ├── 002.wav
│ └── ...
└── text.txt
其中text.txt格式为:音频文件名(不含扩展名) 对应文本,例如:
001 欢迎使用CosyVoice自定义语音训练
002 今天天气真好,适合外出游玩
003 人工智能正在改变我们的生活方式
数据预处理流程
数据预处理是将原始音频和文本转换为模型可接受格式的关键步骤,主要包括数据准备、说话人嵌入提取、语音令牌提取和Parquet格式转换。
1. 数据准备
使用prepare_data.py脚本生成训练所需的文件列表(wav.scp、text、utt2spk、spk2utt):
# 创建数据目录
mkdir -p examples/custom/cosyvoice/data/train
mkdir -p examples/custom/cosyvoice/data/dev
# 准备训练数据
python examples/custom/cosyvoice/local/prepare_data.py \
--src_dir /path/to/custom_dataset/train \
--des_dir examples/custom/cosyvoice/data/train
# 准备验证数据
python examples/custom/cosyvoice/local/prepare_data.py \
--src_dir /path/to/custom_dataset/dev \
--des_dir examples/custom/cosyvoice/data/dev
该脚本会读取音频文件和文本,生成以下文件:
wav.scp:音频文件路径列表text:音频对应的文本内容utt2spk: utterance(语音片段)到说话人的映射spk2utt:说话人到utterance的映射
2. 说话人嵌入提取
说话人嵌入(Speaker Embedding)是表征说话人身份的固定维度向量,用于让模型区分不同说话人。使用预训练的Campplus模型提取说话人嵌入:
pretrained_model_dir=../../../../pretrained_models/CosyVoice-300M
# 提取训练集说话人嵌入
python examples/custom/cosyvoice/tools/extract_embedding.py \
--dir examples/custom/cosyvoice/data/train \
--onnx_path $pretrained_model_dir/campplus.onnx \
--num_thread 8
# 提取验证集说话人嵌入
python examples/custom/cosyvoice/tools/extract_embedding.py \
--dir examples/custom/cosyvoice/data/dev \
--onnx_path $pretrained_model_dir/campplus.onnx \
--num_thread 8
执行后会在数据目录生成spk2embedding.pt(说话人到嵌入的映射)和utt2embedding.pt(utterance到嵌入的映射)。
3. 语音令牌提取
语音令牌(Speech Token)是将音频波形转换为离散序列的表示,类似于文本的分词。使用预训练的语音令牌器提取语音令牌:
# 提取训练集语音令牌
python examples/custom/cosyvoice/tools/extract_speech_token.py \
--dir examples/custom/cosyvoice/data/train \
--onnx_path $pretrained_model_dir/speech_tokenizer_v1.onnx \
--num_thread 8
# 提取验证集语音令牌
python examples/custom/cosyvoice/tools/extract_speech_token.py \
--dir examples/custom/cosyvoice/data/dev \
--onnx_path $pretrained_model_dir/speech_tokenizer_v1.onnx \
--num_thread 8
执行后会在数据目录生成utt2speech_token.pt(utterance到语音令牌的映射)。
4. Parquet格式转换
为提高训练效率,CosyVoice将数据转换为Parquet格式,这是一种列式存储格式,支持高效的随机访问:
# 转换训练集为Parquet格式
python examples/custom/cosyvoice/tools/make_parquet_list.py \
--num_utts_per_parquet 1000 \
--num_processes 10 \
--src_dir examples/custom/cosyvoice/data/train \
--des_dir examples/custom/cosyvoice/data/train/parquet
# 转换验证集为Parquet格式
python examples/custom/cosyvoice/tools/make_parquet_list.py \
--num_utts_per_parquet 1000 \
--num_processes 10 \
--src_dir examples/custom/cosyvoice/data/dev \
--des_dir examples/custom/cosyvoice/data/dev/parquet
生成的数据列表文件用于训练时加载数据:
# 创建训练数据列表
cat examples/custom/cosyvoice/data/train/parquet/data.list > examples/custom/cosyvoice/data/train.data.list
# 创建验证数据列表
cat examples/custom/cosyvoice/data/dev/parquet/data.list > examples/custom/cosyvoice/data/dev.data.list
训练配置:参数解析与优化策略
CosyVoice使用YAML格式的配置文件定义模型结构和训练参数。理解并合理配置这些参数是训练成功的关键。以下是基于examples/libritts/cosyvoice/conf/cosyvoice.yaml的核心参数解析与自定义语音训练的优化建议。
核心参数解析
1. 数据相关参数
# 固定参数
sample_rate: 22050 # 采样率,需与数据集一致
text_encoder_input_size: 512 # 文本编码器输入维度
llm_input_size: 1024 # 语言模型输入维度
llm_output_size: 1024 # 语言模型输出维度
spk_embed_dim: 192 # 说话人嵌入维度
2. 模型结构参数
语言模型(LLM)配置:
llm: !new:cosyvoice.llm.llm.TransformerLM
text_encoder_input_size: !ref <text_encoder_input_size>
llm_input_size: !ref <llm_input_size>
llm_output_size: !ref <llm_output_size>
text_token_size: 51866 # 文本令牌数量
speech_token_size: 4096 # 语音令牌数量
length_normalized_loss: True # 是否长度归一化损失
lsm_weight: 0 # 标签平滑权重,0表示不使用
spk_embed_dim: !ref <spk_embed_dim>
text_encoder: !new:cosyvoice.transformer.encoder.ConformerEncoder
input_size: !ref <text_encoder_input_size>
output_size: 1024
attention_heads: 16 # 注意力头数
linear_units: 4096 # 前馈网络隐藏层维度
num_blocks: 6 # 编码器块数量
dropout_rate: 0.1 # Dropout比例
llm: !new:cosyvoice.transformer.encoder.TransformerEncoder
input_size: !ref <llm_input_size>
output_size: !ref <llm_output_size>
attention_heads: 16
linear_units: 4096
num_blocks: 14 # LLM编码器块数量,决定模型容量
流匹配解码器(Flow)配置:
flow: !new:cosyvoice.flow.flow.MaskedDiffWithXvec
input_size: 512
output_size: 80 # 梅尔频谱维度
spk_embed_dim: !ref <spk_embed_dim>
output_type: 'mel' # 输出类型为梅尔频谱
vocab_size: 4096 # 语音令牌数量,需与LLM一致
input_frame_rate: 50 # 输入帧率
encoder: !new:cosyvoice.transformer.encoder.ConformerEncoder
output_size: 512
attention_heads: 8
linear_units: 2048
num_blocks: 6 # 编码器块数量
dropout_rate: 0.1
HiFi-GAN声码器配置:
hift: !new:cosyvoice.hifigan.generator.HiFTGenerator
in_channels: 80 # 输入梅尔频谱维度
base_channels: 512 # 基础通道数
nb_harmonics: 8 # 谐波数量
sampling_rate: !ref <sample_rate>
nsf_alpha: 0.1 # NSFA参数
nsf_sigma: 0.003 # NSFA参数
upsample_rates: [8, 8] # 上采样率,乘积应为总上采样倍数
3. 训练参数
语言模型训练配置:
train_conf:
optim: adam # 优化器
optim_conf:
lr: 0.001 # 初始学习率,微调时建议减小至1e-5
scheduler: warmuplr # 学习率调度器
scheduler_conf:
warmup_steps: 2500 # 预热步数
max_epoch: 200 # 最大 epoch 数
grad_clip: 5 # 梯度裁剪阈值
accum_grad: 2 # 梯度累积步数
log_interval: 100 # 日志打印间隔
save_per_step: -1 # 按步数保存模型,-1表示按epoch保存
自定义训练参数优化建议
-
学习率调整:微调时,建议将语言模型的学习率从0.001减小到1e-5,以避免破坏预训练模型的知识。可修改
train_conf.optim_conf.lr为1e-5,并将scheduler改为constantlr。 -
批处理大小:根据GPU显存调整。若显存不足,可减小
max_frames_in_batch(在batch处理器中)或增加accum_grad(梯度累积)。 -
说话人嵌入使用:在数据预处理的
padding步骤,确保use_spk_embedding: True,使模型能够利用说话人嵌入区分不同说话人。 -
训练轮数:对于1-5小时的数据集,建议将
max_epoch设置为50-100,避免过拟合。可通过监控验证集损失(Val Loss)判断是否收敛,若连续多个epoch验证损失不再下降,可提前停止训练。
修改后的训练配置示例(针对小数据集微调):
# 微调时的学习率和调度器
train_conf:
optim: adam
optim_conf:
lr: 1e-5 # 减小学习率
scheduler: constantlr # 使用恒定学习率
scheduler_conf:
warmup_steps: 0 # 无需预热
max_epoch: 80 # 减少训练轮数
grad_clip: 5
accum_grad: 4 # 增加梯度累积(若显存不足)
log_interval: 50 # 更频繁地打印日志
模型训练:分步实施与监控方法
CosyVoice的训练分为三个主要阶段:语言模型(LLM)训练、流匹配解码器(Flow)训练和HiFi-GAN声码器(HiFiGAN)训练。通常建议按此顺序依次训练,因为后续模块依赖于前面模块的输出。
训练脚本解析
训练脚本run.sh(位于examples/libritts/cosyvoice/)定义了从数据下载到模型训练的完整流程。以下是针对自定义语音训练的关键步骤解析与修改。
1. 数据准备阶段
修改run.sh中的数据路径和预训练模型路径:
# 自定义数据路径
data_dir=/path/to/custom_dataset # 原始数据目录
exp_dir=exp/custom_cosyvoice # 实验结果目录
pretrained_model_dir=../../../pretrained_models/CosyVoice-300M # 预训练模型目录
# 数据准备(已在前面手动执行,此处可注释或调整)
if [ ${stage} -le 0 ] && [ ${stop_stage} -ge 0 ]; then
echo "Data preparation"
for x in train dev; do
mkdir -p data/$x
python local/prepare_data.py --src_dir $data_dir/$x --des_dir data/$x
done
fi
2. 模型训练阶段
启动训练的核心命令:
# 训练配置
export CUDA_VISIBLE_DEVICES="0,1" # 使用的GPU设备
num_gpus=$(echo $CUDA_VISIBLE_DEVICES | awk -F "," '{print NF}')
job_id=1986 # 分布式训练ID
train_engine=torch_ddp # 训练引擎,torch_ddp或deepspeed
# 训练数据列表
cat data/train/parquet/data.list > data/train.data.list
cat data/dev/parquet/data.list > data/dev.data.list
# 依次训练LLM、Flow、HiFiGAN
for model in llm flow hifigan; do
torchrun --nnodes=1 --nproc_per_node=$num_gpus \
--rdzv_id=$job_id --rdzv_backend="c10d" --rdzv_endpoint="localhost:1234" \
cosyvoice/bin/train.py \
--train_engine $train_engine \
--config conf/cosyvoice.yaml \
--train_data data/train.data.list \
--cv_data data/dev.data.list \
--model $model \
--checkpoint $pretrained_model_dir/$model.pt \ # 预训练模型 checkpoint
--model_dir $exp_dir/$model/$train_engine \ # 模型保存目录
--tensorboard_dir tensorboard/custom_cosyvoice/$model/$train_engine \ # TensorBoard日志目录
--ddp.dist_backend "nccl" \
--num_workers 4 \
--prefetch 100 \
--pin_memory \
--use_amp # 使用混合精度训练
done
启动训练
修改完成后,执行训练脚本:
cd examples/custom/cosyvoice
chmod +x run.sh
./run.sh --stage 1 --stop_stage 3 # 从模型训练阶段开始
训练监控
- TensorBoard监控:训练过程中会生成TensorBoard日志,可通过以下命令查看损失曲线、学习率变化等:
tensorboard --logdir tensorboard/custom_cosyvoice/ --port 6006
在浏览器中访问http://localhost:6006,重点关注以下指标:
train_loss:训练损失,应逐渐下降并趋于稳定val_loss:验证损失,若持续上升可能表示过拟合learning_rate:学习率,确认是否按预期调度
- 日志文件:训练日志会输出到终端,同时也可重定向到文件保存:
./run.sh --stage 1 --stop_stage 3 > train.log 2>&1
日志中需关注是否有报错信息,如OutOfMemoryError(显存不足)、DataLoader错误(数据格式问题)等。
- 模型保存:模型会保存在
exp_dir指定的目录下,每个epoch结束后保存一次。建议训练过程中定期备份模型文件,以防意外中断。
常见训练问题与解决方法
-
显存不足:
- 减小
max_frames_in_batch(在配置文件的batch处理器中) - 增加
accum_grad(梯度累积) - 使用更小的
num_workers - 减少GPU数量或使用单GPU训练
- 减小
-
过拟合:
- 增加数据量或数据增强
- 增大
dropout_rate - 减小训练轮数(
max_epoch) - 使用早停策略(监控验证损失)
-
训练不稳定:
- 降低学习率
- 使用梯度裁剪(
grad_clip) - 检查数据质量,确保无异常样本
模型评估与优化:从指标到主观评价
训练完成后,需要从客观指标和主观听感两方面评估模型性能,并根据评估结果进行优化。
客观指标评估
CosyVoice提供了评估脚本,可计算语音合成的常用客观指标,如梅尔频谱失真(Mel Spectrogram Distortion, MSD)、语音清晰度(STOI)、语音质量(PESQ)等。
# 生成验证集语音
python cosyvoice/bin/generate.py \
--config exp/custom_cosyvoice/llm/torch_ddp/config.yaml \
--checkpoint exp/custom_cosyvoice/hifigan/torch_ddp/hifigan.pt \
--test_data data/dev.data.list \
--output_dir exp/custom_cosyvoice/generate/dev
# 计算客观指标
python tools/compute_metrics.py \
--ref_dir data/dev/audio \ # 参考音频目录
--gen_dir exp/custom_cosyvoice/generate/dev \ # 生成音频目录
--metrics msd stoi pesq # 要计算的指标
关键指标解读:
- MSD:梅尔频谱失真,值越小越好,理想值<0.1
- STOI:语音清晰度,范围0-1,越接近1越好
- PESQ:语音质量,范围-0.5-4.5,越接近4.5越好
主观听感评价
客观指标不能完全反映语音质量,主观听感评价至关重要。建议从以下维度评估:
- 自然度:语音是否流畅自然,有无机械感或卡顿
- 清晰度:发音是否清晰,是否有模糊或错误的音素
- 相似度:合成语音与目标说话人的相似度
- 情感一致性:合成语音的情感是否与文本匹配(如疑问句的语调)
可邀请多人对合成语音进行评分(1-5分),取平均值作为主观评价结果。
模型优化策略
根据评估结果,可采取以下优化策略:
-
数据层面:
- 增加训练数据量,尤其是多样性(不同语速、语调、内容)
- 清洗低质量音频(去除噪声、剪辑静音部分)
- 数据增强(轻微变速、加噪、 pitch调整)
-
模型层面:
- 调整学习率和训练轮数,避免过拟合或欠拟合
- 增加模型容量(如增加
num_blocks或attention_heads) - 使用更大的预训练模型(如CosyVoice-1B)
-
推理层面:
- 调整生成参数,如
top_p、top_k(在配置文件的sampling部分) - 优化声码器参数,如
nsf_alpha、nsf_sigma
- 调整生成参数,如
例如,若合成语音存在卡顿,可尝试调整语言模型的采样参数:
sampling: !name:cosyvoice.utils.common.ras_sampling
top_p: 0.9 # 增加top_p,提高采样多样性
top_k: 50 # 增加top_k
win_size: 10
tau_r: 0.1
模型部署:从 checkpoint 到语音生成 API
训练好的模型需要部署为可用的服务才能实际应用。CosyVoice提供了多种部署方式,包括FastAPI接口和gRPC服务,适用于不同的应用场景。
模型导出
首先将训练好的模型导出为ONNX格式,以提高推理速度:
# 导出LLM模型
python cosyvoice/bin/export_onnx.py \
--model_dir exp/custom_cosyvoice/llm/torch_ddp \
--output_dir exp/custom_cosyvoice/onnx/llm
# 导出Flow模型
python cosyvoice/bin/export_onnx.py \
--model_dir exp/custom_cosyvoice/flow/torch_ddp \
--output_dir exp/custom_cosyvoice/onnx/flow
# 导出HiFiGAN模型
python cosyvoice/bin/export_onnx.py \
--model_dir exp/custom_cosyvoice/hifigan/torch_ddp \
--output_dir exp/custom_cosyvoice/onnx/hifigan
FastAPI服务部署
FastAPI是一种高性能的API框架,适合构建轻量级的语音生成服务。CosyVoice提供了FastAPI服务示例,位于runtime/python/fastapi/。
1. 修改配置文件
创建runtime/python/fastapi/config.yaml,指定模型路径:
model_dir: ../../../exp/custom_cosyvoice/onnx
sample_rate: 22050
text_encoder_input_size: 512
llm_input_size: 1024
llm_output_size: 1024
spk_embed_dim: 192
2. 启动服务
cd runtime/python/fastapi
uvicorn server:app --host 0.0.0.0 --port 8000
服务启动后,可通过HTTP请求调用语音生成API:
# 发送POST请求生成语音
curl -X POST "http://localhost:8000/generate" \
-H "Content-Type: application/json" \
-d '{"text": "欢迎使用CosyVoice自定义语音服务", "spk_id": "custom_spk"}' --output output.wav
3. API参数说明
| 参数 | 类型 | 描述 |
|---|---|---|
| text | string | 要转换的文本 |
| spk_id | string | 说话人ID,对应训练数据中的说话人 |
| speed | float | 语速,默认1.0,范围0.5-2.0 |
| pitch | float | 基频,默认1.0,范围0.5-2.0 |
| volume | float | 音量,默认1.0,范围0.1-2.0 |
gRPC服务部署
对于高并发场景,gRPC提供了比HTTP更高的性能。CosyVoice的gRPC服务示例位于runtime/python/grpc/。
1. 编译protobuf文件
cd runtime/python/grpc
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. cosyvoice.proto
2. 启动gRPC服务
python server.py --model_dir ../../../exp/custom_cosyvoice/onnx
3. 客户端调用示例
import grpc
import cosyvoice_pb2
import cosyvoice_pb2_grpc
def generate_voice(text, spk_id):
channel = grpc.insecure_channel('localhost:50051')
stub = cosyvoice_pb2_grpc.CosyVoiceStub(channel)
request = cosyvoice_pb2.GenerateRequest(
text=text,
spk_id=spk_id,
speed=1.0,
pitch=1.0,
volume=1.0
)
response = stub.Generate(request)
with open('output.wav', 'wb') as f:
f.write(response.audio_data)
generate_voice("欢迎使用CosyVoice自定义语音服务", "custom_spk")
结论与展望
本文详细介绍了使用CosyVoice进行自定义语音训练的完整流程,从环境搭建、数据准备、模型训练到部署应用,涵盖了技术细节和实践技巧。通过CosyVoice的模块化设计和灵活的配置系统,即使是语音合成领域的新手也能快速上手,训练出高质量的专属AI声音。
关键成果总结
- 技术架构理解:掌握了CosyVoice的核心组件(文本编码器、语言模型、流匹配解码器、HiFi-GAN声码器)及其协作流程。
- 数据处理能力:学会了如何准备符合要求的语音数据集,包括数据采集、预处理、说话人嵌入提取和语音令牌提取。
- 模型训练与优化:能够配置训练参数、启动训练过程、监控训练状态,并根据评估结果优化模型性能。
- 模型部署应用:掌握了FastAPI和gRPC两种部署方式,能够将训练好的模型集成到实际应用中。
未来展望
CosyVoice作为一款开源的多语言语音生成模型,仍在快速发展中。未来可以关注以下方向:
- 多说话人训练:目前流程主要针对单说话人,未来可探索多说话人联合训练,实现一个模型支持多种声线。
- 情感迁移:研究如何将文本中的情感信息融入语音生成,使合成语音更具表现力。
- 低资源训练:探索在数据量有限(如少于1小时)的情况下如何训练高质量语音模型,降低自定义语音的门槛。
- 实时生成优化:进一步优化推理速度,实现毫秒级响应,满足实时交互场景需求。
希望本文能为你在自定义语音训练的道路上提供有力的指导。如有任何问题或建议,欢迎在项目仓库提交issue或参与社区讨论。祝你训练顺利,打造出完美的专属AI声音!
收藏与关注
如果本文对你有帮助,请点赞、收藏并关注项目更新。后续我们将推出更多关于CosyVoice高级应用的教程,敬请期待!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



