自制神之嘴: fish-speech 容器镜像 (文本转语音 AI 大模型)

news2024/9/21 4:32:15

穷, 没有 N 卡 ! 穷, 没有 N 卡 ! 穷, 没有 N 卡 !! (重要的事情说 3 遍. )

最近发现了一个很新的 AI (神经网络) 文本转语音大模型: https://speech.fish.audio/

fish-speech 可以根据输入的文本, 生成高质量的人类说话声音, 效果挺好的. fish-speech 官方已经提供了容器 (docker) 镜像, 但是这个镜像很大 (好多 GB), 下载速度慢, 使用并不方便.

所以决定自制容器镜像, 方便直接部署运行 (podman). 那么问题来了: 把派蒙装进容器, 一共需要几步 ?

这里是 穷人小水滴, 专注于 穷人友好型 低成本技术. 下面开始吧 ~


相关视频: 《win10 安装 Podman Desktop (教程)》 https://www.bilibili.com/video/BV14ta9eKEin/ https://live.csdn.net/v/416094

相关文章:

  • 《构建 deno/fresh 的 docker 镜像》 https://blog.csdn.net/secext2022/article/details/139649084
  • 《基于 sftp 的 NAS (局域网文件存储服务器)》 https://blog.csdn.net/secext2022/article/details/140305630
  • 《光驱的内部结构及日常使用》 https://blog.csdn.net/secext2022/article/details/140558507

目录

  • 1 天下苦 N 卡久矣
  • 2 制作 fish-speech 容器镜像
    • 2.1 构建 python 基础镜像
    • 2.2 构建 fish-speech 镜像
    • 2.3 镜像的长期保存 (刻录光盘)
  • 3 测试运行 (CPU 推理)
  • 4 总结与展望

1 天下苦 N 卡久矣

AI (神经网络) 大模型已经火了好几年了, 但是普通人想要在本地运行 AI 大模型, 仍然面对巨大的困难:

  • (1) N 卡 (CUDA) 垄断. 如果没有 N 卡 (没有 CUDA), 那么基本上各种 AI 都是玩儿不了的, A 卡和 I 卡基本没啥用, 只能在角落吃灰. (大部分能够本地运行的 AI 都只支持 N 卡. )

  • (2) 网速太慢. AI 大模型相关的软件, 通常体积巨大, 几 GB 都是小的, 几十 GB 也很常见. 然而下载速度又太慢, 一个模型需要下载好久, 甚至下载失败.

在下, 作为根正苗红的穷人, 那自然是无论如何也买不起 N 卡的. 只能仰天大呼: CUDA 宁有种乎 ?

于是乎, 只能祭出终极大杀器: CPU 推理 ! 既然被 GPU 无情抛弃, 那么就转身投入 CPU 的温暖怀抱 !

用 9 年前的弱鸡老旧 CPU (i5-6200U) 强行小马拉大车, 配合 16GB 内存 (DDR3-1600MHz), 吭哧吭哧虽然很吃力, 但也不是不能运行嘛 !

什么 ? CPU 运行太慢 ?? 穷人嘛, 钱是没有的, 时间那可是大大的有 ! 反正穷人的时间又不值钱, 慢慢运行也是能出结果的啦.

总之, 买 N 卡是不可能买的, 这辈子都不可能的, 也就只能是蹭蹭温暖的娇小 CPU, 在风扇声旁安然入睡这样子.

2 制作 fish-speech 容器镜像

首先从这里下载源代码包: https://github.com/fishaudio/fish-speech

> ls -l fish-speech-main.zip
-rw-r--r-- 1 s2 s2 600573  8623:25 fish-speech-main.zip

然后从这里下载 “模型” 数据文件: https://hf-mirror.com/fishaudio/fish-speech-1.2-sft

> ls -l checkpoints/fish-speech-1.2-sft/
总计 1122676
-rw-r--r-- 1 s2 s2       493  8620:24 config.json
-rw-r--r-- 1 s2 s2 167393289  8620:27 firefly-gan-vq-fsq-4x1024-42hz-generator.pth
-rw-r--r-- 1 s2 s2 980602750  8622:48 model.pth
-rw-r--r-- 1 s2 s2      1140  8620:24 README.md
-rw-r--r-- 1 s2 s2       449  8620:24 special_tokens_map.json
-rw-r--r-- 1 s2 s2      1860  8620:24 tokenizer_config.json
-rw-r--r-- 1 s2 s2   1602418  8620:24 tokenizer.json

2.1 构建 python 基础镜像

构建容器镜像的过程中, 需要从网络下载大量文件, 所以为了方便制作, 方便修改和调试, 这里首先制作一个基础镜像, 安装好依赖的各种软件包.

Dockerfile 文件内容:

FROM quay.io/jitesoft/ubuntu:22.04

# 重新安装 ca-certificates
RUN apt update && apt install -y ca-certificates
# 设置 apt 镜像
RUN sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirror.sjtu.edu.cn/g' /etc/apt/sources.list
# 更新系统, 安装 python, 清理
RUN apt update && apt upgrade -y && apt install -y python3 python3-pip libsox-dev && apt clean

# 设置 pip 镜像
RUN pip3 config set global.index-url https://mirror.sjtu.edu.cn/pypi/web/simple
# 更新 pip
RUN python3 -m pip install --upgrade pip

# 安装 fish-speech 依赖
RUN pip3 install torch torchvision torchaudio

fish-speech 要求使用 python 3.10 版本, 如果 python 版本不对, 可能会出现一些奇奇怪怪的问题, 所以使用 ubuntu:22.04.

构建命令:

podman build -t f-base .

可能需要执行较长时间, 结果如下:

> podman images
REPOSITORY                 TAG       IMAGE ID      CREATED        SIZE
localhost/f-base           latest    059c1254b455  8 days ago     8.72 GB
quay.io/jitesoft/ubuntu    22.04     100c712b0c2b  13 months ago  80.3 MB

此处 f-base 就是制作好的基础镜像.

2.2 构建 fish-speech 镜像

首先准备所需文件, 解压源码包 fish-speech-main.zip, 放入模型数据 checkpoints/fish-speech-1.2-sft/, 再放入参考音频, 文件列表如下:

> find checkpoints ref_data
checkpoints
checkpoints/fish-speech-1.2-sft
checkpoints/fish-speech-1.2-sft/special_tokens_map.json
checkpoints/fish-speech-1.2-sft/README.md
checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth
checkpoints/fish-speech-1.2-sft/tokenizer_config.json
checkpoints/fish-speech-1.2-sft/tokenizer.json
checkpoints/fish-speech-1.2-sft/config.json
checkpoints/fish-speech-1.2-sft/model.pth
ref_data
ref_data/1paimon
ref_data/1paimon/e1
ref_data/1paimon/e1/2003_1.wav
ref_data/1paimon/e1/2003_1.lab
ref_data/2r
ref_data/2r/e1
ref_data/2r/e1/2r.wav
ref_data/2r/e1/2r.lab

参考音频放在 ref_data 目录, 下级目录格式 说话者/情绪, 比如此处 1paimon/e1 表示说话者 1paimon, 情绪 e1. 这些目录可以随意命名.

然后里面放 参考音频, 格式为 “音频-标签” 对. 比如 2003_1.wav 就是一个声音文件 (wav 格式), 2003_1.lab 是这段声音对应的文本内容. 注意音频文件和标签文件的名称对应.


然后使用的 Dockerfile 如下:

FROM f-base

WORKDIR /fish-speech
COPY . .

WORKDIR /fish-speech/fish-speech-main
RUN pip3 install -e .

# ref_data.json
RUN python3 tools/gen_ref.py

EXPOSE 8080
CMD ["python3", "-m", "tools.api", "--listen", "0.0.0.0:8080", "--llama-checkpoint-path", "checkpoints/fish-speech-1.2-sft", "--decoder-checkpoint-path", "checkpoints/fish-speech-1.2-sft/firefly-gan-vq-fsq-4x1024-42hz-generator.pth", "--decoder-config-name", "firefly_gan_vq", "--device", "cpu"]

最后的命令 (CMD) 会运行一个 HTTP 服务器, 方便调用. --device cpu 表示使用 CPU 推理 (计算).

构建命令:

podman build -t fish-speech .

结果:

> podman images
REPOSITORY               TAG       IMAGE ID      CREATED       SIZE
localhost/fish-speech    latest    879b905fd360  8 days ago    17.1 GB
localhost/f-base         latest    059c1254b455  8 days ago    8.72 GB

其中 fish-speech 就是构建出来的镜像, 很大, 17.1GB.

2.3 镜像的长期保存 (刻录光盘)

保存镜像:

podman save fish-speech | zstd > fish-speech-20240807.tar.zst

获得:

> ls -l fish-speech-20240807.tar.zst
-r--r--r-- 1 s2 s2 10498845335  87日 06:53 fish-speech-20240807.tar.zst

压缩后大小 10GB. 有了这个镜像文件, 部署运行就很方便了.


上述制作镜像的过程中, 需要通过网络下载大量的数据, 很不容易. 所以制作好的镜像文件需要好好保存, 防止丢失.

此处选择使用一张 BD-R 25G 光盘来备份数据:

在这里插入图片描述

光盘里面的文件:

在这里插入图片描述

可以方便的使用 sha256sum -c sha256.txt 检查光盘中的文件是否损坏:

在这里插入图片描述

蓝光光盘最大读取速度可达 35MB/s.

3 测试运行 (CPU 推理)

使用 podman 运行 fish-speech 容器 (HTTP 服务器):

> podman run --rm -p 8080:8080 fish-speech
2024-08-06 21:41:54.080 | INFO     | __main__:<module>:445 - Loading Llama model...
2024-08-06 21:42:12.718 | INFO     | tools.llama.generate:load_model:347 - Restored model from checkpoint
2024-08-06 21:42:12.718 | INFO     | tools.llama.generate:load_model:351 - Using DualARTransformer
2024-08-06 21:42:12.720 | INFO     | __main__:<module>:452 - Llama model loaded, loading VQ-GAN model...
2024-08-06 21:42:16.992 | INFO     | tools.vqgan.inference:load_model:44 - Loaded model: <All keys matched successfully>
2024-08-06 21:42:16.996 | INFO     | __main__:<module>:460 - VQ-GAN model loaded, warming up...
2024-08-06 21:42:16.997 | INFO     | __main__:load_json:165 - Not using a json file
2024-08-06 21:42:16.999 | INFO     | __main__:encode_reference:118 - No reference audio provided
2024-08-06 21:42:17.000 | INFO     | __main__:inference:231 - ref_text: None
2024-08-06 21:42:17.006 | INFO     | tools.llama.generate:generate_long:432 - Encoded text: Hello world.
2024-08-06 21:42:17.008 | INFO     | tools.llama.generate:generate_long:450 - Generating sentence 1/1 of sample 1/1
  0%|          | 0/4081 [00:00<?, ?it/s]/usr/local/lib/python3.10/dist-packages/torch/backends/cuda/__init__.py:342: FutureWarning: torch.backends.cuda.sdp_kernel() is deprecated. In the future, this context manager will be removed. Please see, torch.nn.attention.sdpa_kernel() for the new context manager, with updated signature.
  warnings.warn(
  2%|| 73/4081 [01:48<1:39:24,  1.49s/it]
2024-08-06 21:44:19.325 | INFO     | tools.llama.generate:generate_long:505 - Generated 75 tokens in 122.32 seconds, 0.61 tokens/sec
2024-08-06 21:44:19.325 | INFO     | tools.llama.generate:generate_long:508 - Bandwidth achieved: 0.30 GB/s
2024-08-06 21:44:19.327 | INFO     | __main__:decode_vq_tokens:129 - VQ features: torch.Size([4, 74])
2024-08-06 21:46:24.453 | INFO     | __main__:<module>:481 - Warming up done, starting server at http://0.0.0.0:8080
INFO:     Started server process [1]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)

生成音频:

> python -m tools.post_api --text "测试说话" --speaker "1paimon" --emotion "e1" --out 2_test.wav
Audio has been saved to '2_test.wav'.

生成过程中产生的日志:

2024-08-06 22:44:35.020 | INFO     | __main__:inference:222 - ref_path: ref_data/1paimon/e1/2003_1.wav
2024-08-06 22:44:35.020 | INFO     | __main__:inference:223 - ref_text: 我们这边也不是那么好骗的

2024-08-06 22:45:08.752 | INFO     | __main__:encode_reference:107 - Loaded audio with 2.94 seconds
2024-08-06 22:45:09.478 | INFO     | __main__:encode_reference:115 - Encoded prompt: torch.Size([4, 126])
2024-08-06 22:45:09.478 | INFO     | __main__:inference:231 - ref_text: 我们这边也不是那么好骗的

2024-08-06 22:45:09.486 | INFO     | tools.llama.generate:generate_long:432 - Encoded text: 测试说话
2024-08-06 22:45:09.487 | INFO     | tools.llama.generate:generate_long:450 - Generating sentence 1/1 of sample 1/1
  0%|          | 0/1023 [00:00<?, ?it/s]/usr/local/lib/python3.10/dist-packages/torch/backends/cuda/__init__.py:342: FutureWarning: torch.backends.cuda.sdp_kernel() is deprecated. In the future, this context manager will be removed. Please see, torch.nn.attention.sdpa_kernel() for the new context manager, with updated signature.
  warnings.warn(
 12%|█▏        | 118/1023 [04:49<36:59,  2.45s/it]
2024-08-06 22:52:01.134 | INFO     | tools.llama.generate:generate_long:505 - Generated 120 tokens in 411.65 seconds, 0.29 tokens/sec
2024-08-06 22:52:01.135 | INFO     | tools.llama.generate:generate_long:508 - Bandwidth achieved: 0.14 GB/s
2024-08-06 22:52:01.136 | INFO     | __main__:decode_vq_tokens:129 - VQ features: torch.Size([4, 119])
INFO:     172.17.0.1:52808 - "POST /v1/invoke HTTP/1.1" 200 OK

好了, 成功获得了一只神之嘴, 撒花 ~


使用 CPU 推理, 速度大约比 N 卡慢 100 倍, 生成 1 秒的音频大约需要 1 分钟.

这个速度虽然很慢, 但是也是具有一定的实用意义的, 比如制作一个 10 分钟的视频, 进行配音, 所需的时间, 也就是晚上睡一觉而已, 第二天起来就生成好了.

具体栗子请见视频 《win10 安装 Podman Desktop (教程)》 (链接在文章开头).

4 总结与展望

fish-speech 是一个新的 AI (神经网络) 文本转语音大模型, 可以生成高质量的人类说话声音. 在此感谢开发 fish-speech 并开源的巨佬们 !

通过自制 fish-speech 容器镜像, 并添加参考音频数据, 窝们成功获得了一只封装好的派蒙罐头 (真·应急食品). 随便放在哪里都可以直接运行, 无需网络, 很是方便好用.

CPU 推理确实很慢, 后续计划寻找无需 N 卡条件下, 更快运行大模型的方法.


本文使用 CC-BY-SA 4.0 许可发布.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.3 不同数据库管理系统的比较与应用场景

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

[LitCTF 2024]浏览器也能套娃?

题目有标志SSRF SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统。&#xff08;正是因为它是由服务端发起的&#xff0c;所以它能够请求到与它相…

背包九讲(灵魂版)

文章目录 背包九讲[题库 - AcWing](https://www.acwing.com/problem/search/1/?search_content背包九讲&show_algorithm_tags0)01背包朴素代码一维优化代码 完全背包朴素代码一维优化代码 多重背包I 模板题代码 多重背包 II 二进制优化代码 多重背包 III 单调队列优化代码…

[算法题]01 矩阵

题目链接: 01 矩阵 多源BFS类型题, 即给定多个起点, 判断从哪个起点走到终点距离最短, 一般解题思路为将所有起点看成一个"起点", 由此"起点"做bfs得到题解, 实际代码编写将所有起点都入队列, 每次都对所有起点做一层扩展. 题解思路: 从1往0处走寻找最短…

kali-linux 常用命令大集合(目录、文件查看与编辑,登录、电源、帮助等相关命令详解)

目录 目录查看-ls 帮助命令 帮助命令&#xff1a;whatis 帮助命令&#xff1a;help 帮助命令&#xff1a;man 帮助命令&#xff1a;info 登录命令 登录命令&#xff1a;login 登录命令&#xff1a;last 登录命令&#xff1a;exit 切换用户&#xff1a;su/sudo 命令-…

嵌入式学习day17(顺序表)

大纲 线性表是最基本、最简单、也是最常用的一种数据结构&#xff0c;可以存储逻辑关系为线性的数据。线性表&#xff08;linear list&#xff09;是数据结构的一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 分类&#xff1a; 顺序表、单向链表、单向循环…

WhatsApp代理地址:如何成功连接WhatsApp?

所有外贸人都非常需要通过WhatsApp与客户沟通&#xff0c;简直是搞钱“生命线”&#xff01;但是&#xff0c;很多老板在后台抱怨说自己一直登不进去&#xff0c;99.99%是你网络问题。很多外贸人找的代理IP来路不明或者滥竽充数&#xff0c;要和很多人一起共用IP或者IP地址总是…

【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库&#xff1f; 假设您有如下图表&#xff1a; 我们可以在 NetworkX 中构建此图&#xff1a; 1import networkx as nx23G nx.Graph()45G.add_edges_from([6 ("A", "B"),7 ("A", "…

HAproxy 七层负载均衡调度器详解及配置

HAproxy 七层负载均衡 负载均衡技术 负载均衡&#xff08;Load Balance&#xff09;&#xff1a;一种服务&#xff0c;或基于硬件设备实现的高可用的反向代理技术&#xff0c;是指将特定的业务流量分摊给一个或多个后端的特定服务器或设备&#xff0c;实现高并发处理业务流量…

KNN算法原理

KNN&#xff08;K-Nearest Neighbors&#xff0c;K最近邻&#xff09;算法是一种基本且广泛使用的分类与回归方法。在分类任务中&#xff0c;KNN的输入为实例的特征向量&#xff0c;对应于特征空间的点&#xff1b;输出为实例的类别&#xff0c;可以取为类别集合中任意一个类别…

深入解析Java设计模式之中介者模式

一、什么是中介者模式 中介者模式&#xff08;Mediator Pattern&#xff09;是Java设计模式中的一种行为型模式。在中介者模式中&#xff0c;一个中介者对象封装了一系列对象之间的交互&#xff0c;使对象之间不直接相互通信&#xff0c;而是通过中介者对象进行通信。这种模式有…

VM——深度学习算子GPU版本耗时不稳定

1、问题&#xff1a;使用3080TI显卡4台130万相机&#xff0c;GPU版本算子&#xff0c;耗时不稳定&#xff0c;15ms-150ms波动 2、方法&#xff1a; 1&#xff09;参考海康提供的问题手册

Java面试题--JVM大厂篇之JVM 内存管理深度探秘:原理与实战

目录 引言: 正文: 1. JVM内存管理的基本原理 痛点一&#xff1a;频繁的Minor GC 2. 内存分配与回收案例 3. 避免内存泄漏的技巧 痛点二&#xff1a;未关闭的资源 痛点三&#xff1a;静态集合类持有对象引用 4. 优化内存使用的技巧 痛点四&#xff1a;对象过多占用内存…

超越自我——带你学haproxy算法一遍过!!!

文章目录 前言介绍 静态算法static-rrfirst 动态算法roundrobinleastconn 其他算法source算法map-base 取模法一致性hashuriurI_param 取模法hdr 总结本文相关连接如下&#xff1a; 前言 本文相关连接如下&#xff1a; 如果想更多了解haproxy的相关知识&#xff0c;请点击&am…

考试:操作系统知识(03)

分区存储管理 所谓分区存储组织&#xff0c;就是整存&#xff0c;将某进程运行所需的内存整体一起分配给它&#xff0c;然后再执行。有三种分区方式&#xff1a; 固定分区&#xff1a;静态分区方法&#xff0c;将主存分为若干个固定的分区&#xff0c;将要运行的作业装配进去…

ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化

这里在分享一个人口1km精度栅格数据&#xff0c;LandScan是由美国能源部橡树岭国家实验室&#xff08;ORNL&#xff09;提供的全球人口分布数据集&#xff0c;具有最高分辨率的全球人口分布数据&#xff0c;是全球人口数据发布的社会标准&#xff0c;是全球最为准确、可靠&…

架构设计-分层思想

一、为什么要分层设计&#xff1f; 分层设计是为了剥离硬件环境的依赖&#xff0c;使软件系统更好复用&#xff0c;当更换硬件方案时&#xff0c;只需要修改底层函数的初始化&#xff0c;抽象层和服务层完全不需要改动&#xff0c;这样极大的减小时间成本&#xff0c;平台能够很…

前后端分离项目实战-通用管理系统搭建(前端Vue3+ElementPlus,后端Springboot+Mysql+Redis)第二篇:项目登录功能的实现

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Element UI左侧导航栏写法(递归组件实现)

1、左侧导航栏组件使用的是Element Ui的导航栏组件&#xff0c;思路&#xff1a;首先判断导航栏数据是否存在children&#xff0c;以此来实现一级菜单与多级菜单的渲染&#xff0c;然后使用递归组件实现多级菜单的子菜单渲染&#xff0c;注意使用递归组件需将菜单栏数据在父组件…