AI小白搞AI之CosyVoice API服务脚本,复制即用

前言

本篇文章是基于你已经部署好了模型。
我也是一个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

  1. 监督式微调(SFT)

预训练音色生成

cosyvoice = CosyVoice('pretrained_models/CosyVoice-300M-SFT', ...)
cosyvoice.inference_sft('文本内容', '中文女', stream=False)
  1. 零样本学习(Zero-shot)

模仿音色生成

cosyvoice.inference_zero_shot('目标文本', '参考文本', 参考音频)
  1. 跨语言生成(Cross-lingual)

加载音色,生成其他国家的语音,需要在文本加上 <|zh|><|en|><|jp|><|yue|><|ko|>

cosyvoice.inference_cross_lingual('<|en|>英文文本', 参考音频)
  1. 语音转换(Voice Conversion, VC)

原音频音色转换

cosyvoice.inference_vc(源音频, 参考音频)
  1. 指令模式(Instruct)

指令或情感控制,角色描述好像只支持英文

描述,可以是:暴躁的、绝望的、火辣的、性感的

cosyvoice.inference_instruct('含特殊标签的文本', '中文男', '角色描述')

关键参数:Stream

False:一次性生成,True:流式生成,进行循环得到所有语音

Cosyvoice 2

  1. 监督式微调模式 (inference_sft)

预训练语音生成

for i, result in enumerate(cosyvoice.inference_sft("文本内容", "中文女", stream=False)):
    torchaudio.save(f"sft_{
     i}.wav", result['tts_speech'], sample_rate)
  1. 零样本学习模式 (inference_zero_shot)

模仿音色生成

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)
  1. 跨语言生成 (inference_cross_lingual)
for i, result in enumerate(cosyvoice.inference_cross_lingual("<|en|>Hello", 参考音频)):
    torchaudio.save(f"cross_lingual_{
     i}.wav", result['tts_speech'], sample_rate)
  1. 语音转换 (inference_vc)

原音频音色转换

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. 指令驱动模式 (inference_instruct / inference_instruct2)

指令或情感控制

# 指令模式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

脚本说明

  1. 脚本内置了日志模块,记录服务运行期间日志,位置:./logs/api_server.log,按天分割日志
  2. 默认使用:CosyVoice-300M-Instruct模型,按需要更改
  3. 我不是专业的,所以有想法大家可以讨论

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值