首页 > 其他分享 >chatTTS系列之-apiServer

chatTTS系列之-apiServer

时间:2024-06-14 23:58:56浏览次数:12  
标签:chatTTS 系列 FastAPI apiServer seed chat path audio local

文章目录

背景

在之前文章中我们对chattts有了一个大致的了解并对webui进行了一定的优化。然而,还有很多情况下我们还需要进行api调用。gradio虽然也提供了sdk,但只有python和node两种语言,远远不如http接口来的泛用。因此,我们来对chatts更近一步优化,来编写一个apiServer。

技术方案

技术方案我们选用FastAPI。

我们对FastAPI做一个简要的介绍

fastapi,一个用于构建 API 的现代、快速(高性能)的web框架。

fastapi是建立在Starlette和Pydantic基础上的,Pydantic是一个基于Python类型提示来定义数据验证、序列化和文档的库。Starlette是一种轻量级的ASGI框架/工具包,是构建高性能Asyncio服务的理性选择。

  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 StarlettePydantic),是最快的 Python web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档

方案实现

安装FastAPI

pip install "fastapi[all]"
pip install "uvicorn[standard]"

编写一个入口

 from fastapi import FastAPI  # FastAPI 是一个为你的 API 提供了所有功能的 Python 类。
 import uvicorn

 app = FastAPI()  # 这个实例将是创建你所有 API 的主要交互对象。这个 app 同样在如下命令中被 uvicorn 所引用
 
 @app.get("/")
 async def root():
     return {"message": "Hello yuan"}
    
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8087)

一个简单案例就做好了,和其它很多框架一样,我们需要引入路由分组

app = FastAPI()
app.include_router(prefix="/chat", router=audio_router)

不同分组就不再是通过app来修饰

router = APIRouter()

@router.post("/generate_audio")
async def generate_audio(request: GenerateAudioRequest):
    ...

逻辑实现

全局只维护一个chat对象

如何每次创建一个chat对象,显存将很快被耗完。每创建完一个对象大约消耗1GB显存,小于4GB显存将强制使用CPU进行推理

def create_chat(local_path=None):
    """创建ChatTTS实例"""
    if "chat" in cf:
        logging.info("cached chat")
        return cf['chat']
    local_model_path = os.getenv('MODEL_LOCAL_PATH', None)
    # 导入模型实例
    chat = ChatTTS.Chat()
    if local_model_path is None:
        chat.load_models()
    else:
        logging.info('local model path:', local_model_path)
        chat.load_models('local', local_path=local_model_path)
    cf['chat'] = chat
    return chat

生成随机音色

def determine_seed(seed):
    """限定模型使用的种子值"""
    torch.manual_seed(seed)
    np.random.seed(seed)
    torch.cuda.manual_seed(seed)
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False



def build_random_speaker(chat, request: GenerateAudioRequest):
    """
    生成随机音色
    :param chat:
    :param request:
    :return:
    """
    # 使用音色种子值创建音色
    audio_seed_input = request.audio_seed_input
    determine_seed(audio_seed_input)
    return chat.sample_random_speaker()

合成一个完整音频

# 将所有的语音片段合并成一个完整的音频
audio_data_all = np.concatenate(audio_data_all)
sample_rate = 24000
# 写入WAV文件
file_name = wav_utils.build_wav_name()
file_path = str(Path(global_info.AUDIO_TEMP_PATH).joinpath(file_name).resolve())
wavfile.write(file_path, sample_rate, audio_data_all)

返回结果

在每次音频生成结束后,返回音频名称,并将tensor等参数一并返回,方便保存

return {
        "out_put_text": "\n".join(text_data_all),
        "audio_name": file_name,
        "tensor": speak_tensor.tolist()
 }

总结

我们可以根据这些核心需求编写chattts的服务端,满足自己的接口调用需求。本文代码见

chatts-manger




# 总结

我们可以根据这些核心需求编写chattts的服务端,满足自己的接口调用需求。本文代码见

[chatts-manger](https://github.com/MaterialShadow/ChatTTS-manager/tree/master/apiServer)

标签:chatTTS,系列,FastAPI,apiServer,seed,chat,path,audio,local
From: https://blog.csdn.net/u012399690/article/details/139690829

相关文章

  • 模拟集成电路设计系列博客——7.1.6 多比特SAR ADC
    7.1.6多比特SARADC我们目前讨论的逐次逼近型ADC在每个周期都通过单次的比较将搜索空间一分为二。这个搜索可以通过在每个周期进行多次比较来实现加速,每次将搜索空间切分为更小的区域。例如,如果我们想要猜测一个1到128之间的数时,我们除了提问“这个数是否大于64”,还可以同时提问......
  • 模拟集成电路设计系列博客——7.1.5 SAR ADC中的错误纠正
    7.1.5SARADC中的错误纠正片上部件的最佳匹配精度可以达到百分之0.1,但是这对于有着10比特及以上精度的SARADC来说仍然不够,因此需要一种校正手段。其中一种用于获得16比特线性ADC的错误纠正方式如下图所示[Lee,1984]:在这种方式中,MSB部分通过二进制权重电容阵列来实现,例如,这个......
  • 模拟集成电路设计系列博客——7.1.4 电荷重分布SAR ADC的速度估计
    7.1.4电荷重分布SARADC的速度估计电荷重分布SARADC的主要速度限制来自于电容阵列和开关构成的RC时间常数。为了估计这个时间,考虑电容阵列复位后的简化模型,如下图所示:此处\(R\),\(R_{s1}\)和\(R_{s2}\)表示位线,\(S_1\)和\(S_2\)开关上的开态电阻,相对的,尽管这个电路很容易就可......
  • 模拟集成电路设计系列博客——7.1.3 电阻电容混合SAR ADC
    7.1.3电阻电容混合SARADC在DAC中组合使用电阻串和电容阵列的方式同样可以在ADC中使用,一种实现[Fotouhi,1979]如下图所示:第一步是将所有的电容都充电到\(V_{in}\)并重置比较器,接着,通过逐次逼近的方式来查找两个相邻的电阻节点具有大于和小于\(V_{in}\)的电压。使用两根总线,分......
  • 模拟集成电路设计系列博客——7.1.2 基于电荷重分布的SAR ADC
    7.1.2基于电荷重分布的SARADC实现SARADC最直接的方式是使用一个独立的DAC,并将其设置等于输入电压(在一个LSB范围内)进而修改流程图如下:首个用这种方式实现的开关电容模拟系统即所谓的电荷重分布MOSADC[McCreary,1975]。通过这个转换器,采样和保持电路,DAC,以及比较器被组合在了......
  • 【SpringBoot整合系列】SpringBoot整合kinfe4j
    目录kinfe4j与Swagger的区别SpringBoot2.x整合kinfe4j1.添加依赖2.启动类注解3.创建Knife4J配置类4.实体类5.接口admin访问api访问常用注解汇总SpringBoot3.x整合Kinfe4j启动报错解决1.更换依赖2.启动类3.配置4.配置类5.参数实体类6.接口admin访问api访问各版......
  • 一文读懂多模态大模型的LLM主干(1):ChatGLM系列
    〔探索AI的无限可能,微信关注“AIGCmagic”公众号,让AIGC科技点亮生活〕本文作者:AIGCmagic社区  刘一手前言AI多模态大模型发展至今,每年都有非常优秀的工作产出,按照当前模型设计思路,多模态大模型的架构主要包括以下几个部分:模态编码器(ModalityEncoder,ME):负责将不同......
  • 软考 系统架构设计师系列知识点之杂项集萃(35)
    接前一篇文章:软考系统架构设计师系列知识点之杂项集萃(34)第56题遗留系统的演化可以采用淘汰、继承、改造和集成四种策略。若企业中的遗留系统技术含量较高,业务价值较低,在局部领域中工作良好,形成了一个个信息孤岛时,适合于采用()演化策略。A.淘汰B.继承C.改造D.集成正......
  • 3个月搞定计算机二级C语言!高效刷题系列进行中
    前言大家好,我是梁国庆。计算机二级应该是每一位大学生的必修课,相信很多同学的大学flag中都会有它的身影。我在大学里也不止一次的想要考计算机二级office,但由于种种原因,备考了几次都不了了之。这一次我想换个目标!备考计算机二级C语言今天山东省考试院发布了关于2024年9月全......
  • 【Git系列】Git LFS常用命令的使用
    前言LFS是LargeFileStorage的缩写,是一个Git扩展,用于管理大型二进制文件,它允许将这些文件存储在单独的存储库中,以便更有效地处理Git仓库。常用命令LFS安装gitlfs要求git>=1.8.2linux环境:gitlfsinstall执行显示UpdatedGithooks.GitLFSinitialized.......