前言
-
本篇文章是基于你已经部署好了模型。
- 我也是一个AI小白,也是一步步摸索,希望还在查查这块资料的朋友能够轻松一点,大家一起进步。~
官方文档
我找的API文档是这个:语音合成CosyVoice_大模型服务平台百炼(Model Studio)-阿里云帮助中心
魔塔社区示例:https://www.modelscope.cn/models/iic/CosyVoice2-0.5B
官网示例说明
魔塔社区:https://www.modelscope.cn/models/iic/CosyVoice2-0.5B
从这个示例中,以及源码,和AI解析后,可总结为下面这接口调用
注:参考音频是为目标人提供说话的音色和发音风格的特征。
CosyVoice 1
预训练音色生成
cosyvoice = CosyVoice('pretrained_models/CosyVoice-300M-SFT', ...)
cosyvoice.inference_sft('文本内容', '中文女', stream=False)
模仿音色生成
cosyvoice.inference_zero_shot('目标文本', '参考文本', 参考音频)
加载音色,生成其他国家的语音,需要在文本加上 <|zh|><|en|><|jp|><|yue|><|ko|>
cosyvoice.inference_cross_lingual('<|en|>英文文本', 参考音频)
原音频音色转换
cosyvoice.inference_vc(源音频, 参考音频)
指令或情感控制,角色描述好像只支持英文
描述,可以是:暴躁的、绝望的、火辣的、性感的
cosyvoice.inference_instruct('含特殊标签的文本', '中文男', '角色描述')
关键参数:Stream
False:一次性生成,True:流式生成,进行循环得到所有语音
Cosyvoice 2
预训练语音生成
for i, result in enumerate(cosyvoice.inference_sft("文本内容", "中文女", stream=False)):
torchaudio.save(f"sft_{
i}.wav", result['tts_speech'], sample_rate)
模仿音色生成
prompt_audio = load_wav("prompt.wav", 16000)
for i, result in enumerate(cosyvoice.inference_zero_shot("目标文本", "参考文本", 参考音频)):
torchaudio.save(f"zero_shot_{
i}.wav", result['tts_speech'], sample_rate)
for i, result in enumerate(cosyvoice.inference_cross_lingual("<|en|>Hello", 参考音频)):
torchaudio.save(f"cross_lingual_{
i}.wav", result['tts_speech'], sample_rate)
原音频音色转换
source_audio = load_wav("source.wav", 16000)
for i, result in enumerate(cosyvoice.inference_vc(source_audio, 参考音频)):
torchaudio.save(f"vc_{
i}.wav", result['tts_speech'], sample_rate)
指令或情感控制
# 指令模式1:情感标签
cosyvoice.inference_instruct("文本<strong>强调</strong>[laughter]", "中文男", "角色描述(角色风格)")
# 指令模式2:方言控制(inference_instruct2)
cosyvoice.inference_instruct2("文本内容", "用四川话说这句话", 参考音频)
混合语言生成
text = "<|zh|>你好<|en|>Hello<|jp|>こんにちは"
cosyvoice.inference_cross_lingual(text, prompt_audio)
情感强度控制
text = "这个故事太好笑了[laughter intensity=0.9]"
FastApi服务编写
安装依赖
安装必要依赖
pip install flask modelscope torchaudio funasr python-multipart
#安装ASGI服务器
pip install “uvicorn[standard]”
运行服务发布
main -》 是文件名
app -》对象
host 0.0.0.0 -》是不绑定本机,可以远程访问
uvicorn api:app --reload --host 0.0.0.0 --port 8000
脚本说明
- 脚本内置了日志模块,记录服务运行期间日志,位置:
./logs/api_server.log
,按天分割日志 - 默认使用:
CosyVoice-300M-Instruct
模型,按需要更改 - 我不是专业的,所以有想法大家可以讨论
FastApi服务脚本
将下面的脚本,复制到CosyVoice项目,中,改名api.py
,这个api
就是对应命令里的api
注意:用这个版本,就不用再启动官方的事例了(不要再启动webui.py,启用也是可以,但是占用内存)
import sys
sys.path.append('third_party/Matcha-TTS')
from cosyvoice.cli.cosyvoice import CosyVoice, CosyVoice2
from cosyvoice.utils.file_utils import load_wav
# ASGI服务器
from typing import Union
# FASTapi
from fastapi import FastAPI, HTTPException, UploadFile, File, Form
from pydantic import BaseModel
from fastapi.responses import FileResponse
import torchaudio, torch
import os, io
import time
# 导入日志模块
import logging
from logging import handlers
# 强制标准流使用UTF-8
# sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
# sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
# 日志格式
formatter = logging.Formatter('%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s')
# 创建自定义Logger
logger = logging.getLogger('api')
logger.setLevel(logging.INFO)
logger.propagate = False # 关键修复:禁用传播
# 清理根Logger的默认处理器
root_logger = logging.getLogger()
root_logger.handlers = []
# --- 文件处理器 ---
file_handler = handlers.TimedRotatingFileHandler(
filename='./logs/api_server.log',
when='D',
encoding='utf-8',
backupCount=7
)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
# --- 控制台处理器 ---
stream_handler = logging.StreamHandler()
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
# 添加处理器到自定义Logger
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
app = FastAPI()
INSTRUCT_MODEL = 'pretrained_models/CosyVoice-300M-Instruct'
BASE_MODEL = 'pretrained_models/CosyVoice-300M'
UP_MODEL = 'pretrained_models/CosyVoice2-0.5B'
SFT_MODEL = 'pretrained_models/CosyVoice-300M-SFT'
AUDIO_BASE_PATH = "new_audio"
AUDIO_BASE_PATH_TEMP = "new_audio/temp"
os.makedirs(AUDIO_BASE_PATH, exist_ok=True)
os.makedirs('./logs', exist_ok=True)
os.makedirs(AUDIO_BASE_PATH, exist_ok=True)
os.makedirs