AIGC - Stable Diffusion 搭建【从零到一】

这篇具有很好参考价值的文章主要介绍了AIGC - Stable Diffusion 搭建【从零到一】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AIGC - Stable Diffusion 搭建



1. Huggingface Token

url = ’‘
1. 注册获取账号
2. 生成获取用户项目token

2. Cloud GPU

url = '' # 可租用矩池云
1. 注册获取账号
2. 选择GPU档次及预装型号(建议huggingface,Pytorch)
3. huggingface-cli login  # Cloud服务器通过token验证 | 下载模型 
4. JupyterLab 
   pip3 install diffusers 
   pip3 install accelerate
   pip3 install spacy ftfy==4.4.3
   

3. autocover.txt

import diffusers, torch, os
from time import strftime, localtime

model_id = "CompVis/stable-diffusion-v1-4"
device = torch.device("cuda")
pipe = diffusers.StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=True)
pipe = pipe.to(device)
image = pipe(prompt).images[0]
timeprint = strftime("%Y%m%d%H%M%S", localtime())

fldpath = os.path.join('/mnt/', 'xxx/img')
if not os.path.exists(fldpath):
    os.mkdir(fldpath)
img_filenm = f'{timeprint}.png'
image.save(os.path.join(fldpath, img_filenm))
print(f'{timeprint}.png')

4. userinput_write_pyfile.py:

def userinput_write_pyfile(user_input,local_put_path):
	'''
	- 将用户输入的文字信息写入远程py待执行文件中
	'''
    import os
    f = open(local_put_path,'r')
    index = 0
    lines = []
    for line in f.readlines():
        index +=1
        if index == 3:
            prompt = f'prompt = "{user_input}"'
            lines.append(prompt)
        lines.append(line)
    usr_path = os.path.join(os.path.expanduser('~'), 'Desktop/SSH/upload')
    pyfilepath = os.path.join(usr_path,'autocover.py')
    pf = open(pyfilepath,'w')
    for line in lines:
        pf.write(''.join(line))
    pf.close()
    return pyfilepath

5. SSH API

# -*- coding:utf-8 -*-
def get_SSH_account():
    host         =  ""            # 远程服务器ip
    port         =  0000          # 远程服务器端口
    password     =  ""            # 远程服务器密码
    user         =  ""            # 远程服务器用户名
    account_info = [host,port,password,user]    # 返回SSH登陆信息
    return account_info
    
def SSH_connection(user_input,accounts,paths,write_py, specail_fname,is_DownloadALL,filter_fname):
    import paramiko,os,time
    (host, port, password, user) = accounts
    (remote_get_path, remote_put_paths, local_get_path, local_put_paths, pyfilepath, python_path) = paths

    class Pysftp(object):
        """
        python3 自动上传、下载文件
        """
        global local_put_paths, local_put_path, local_get_path, remote_put_paths,remote_put_path, remote_get_path, pyfilepath, python_path

        def __init__(self, host, port, user, password):
            self.host = host
            self.port = port
            self.user = user
            self.password = password

        def connect(self):
            """
            建立ssh连接
            """
            self.ssh = paramiko.SSHClient()
            self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
            self.ssh.connect(self.host, self.port, self.user, self.password)
            print("[SSH] -> 连接成功")

        # def cmd (self, cmd):
        #     """
        # 	需要执行的命令
        # 	"""
        #     cmd = "ls"
        #     stdin, stdout, stderr = self.ssh.exec_command(cmd)
        #     print(stdout.read().decode("utf8"))

        # def mkdir(self):
        #     """
        #     创建本地文件夹,存放上传、下载的文件
        #     """
        #     for lp in [local_put_path, local_get_path]:
        #         if not os.path.exists(lp):
        #             os.makedirs(lp, 666)
        #             print("创建本地文件夹:{}".format(lp))
        #         else:
        #             print("本地文件夹:{}已存在".format(lp))
        
        def run_pyfile(self,pyfilepath):
            '''
            执行python文件
            '''
            cmd = f"export PATH={python_path}:$PATH;python3 -u {pyfilepath}"
            stdin, stdout, stderr = self.ssh.exec_command(cmd)
            for line in stderr :
                print(line.rstrip())
            flnm = stdout.readlines()[0].replace('\n', '')
            print("[SSH] ->生成成功")
            return flnm

        def put(self,user_input,local_put_path,remote_put_path,path_i):
            """
            上传文件
            """
            sftp = paramiko.SFTPClient.from_transport(self.ssh.get_transport())
            # sftp = self.ssh.open_sftp()
            if path_i == 0:
                pyfile_path = write_py(user_input,local_put_path) # ♻️
                local_full_name = pyfile_path
                fname = os.path.basename(pyfile_path)
            else:
                local_full_name = local_put_path
                fname = specail_fname
            # local_done_write(local_full_name)   # 本地文件已写入完成,可以上传了
            sftp.put(local_full_name, os.path.join(remote_put_path, fname))
            print(f'[{fname}] -> 上传成功')
            # os.remove(local_full_name)
            # print("{}\n上传成功:本地文件:{}====>远程{}:{},已删除该本地文件\n".format(datetime.datetime.now(), local_full_name, self.host, remote_put_path))

        def get(self,flnm,is_DownloadALL,filter_fname):
            """
            下载文件
            """
            sftp  = paramiko.SFTPClient.from_transport(self.ssh.get_transport())
            flidx = 0
            for fname in sftp.listdir(remote_get_path):
                flidx += 1
                try:
                    if is_DownloadALL:
                        print(f'[{fname}] -> 正在下载')
                        remote_full_name = os.path.join(remote_get_path, fname)
                        self.remote_done_transffer(remote_full_name)
                        sftp.get(remote_full_name, os.path.join(local_get_path, fname))
                        # sftp.remove(remote_full_name)
                        print(f'[{fname}] -> 下载成功')
                    else:
                        if len(filter_fname) > 0:
                            if filter_fname in fname:
                                print(f'[{fname}] -> 正在下载')
                                remote_full_name = os.path.join(remote_get_path, fname)
                                self.remote_done_transffer(remote_full_name)
                                from time import strftime,localtime
                                timeprint = strftime("%Y%m%d%H%M%S", localtime())
                                nfname = f'{timeprint}{filter_fname}'
                                sftp.get(remote_full_name, os.path.join(local_get_path, nfname))
                                # sftp.remove(remote_full_name)
                                print(f'[{fname}] -> 下载成功')
                                flnm = nfname
                                break
                            else:
                                print(f'[{fname}] -> [{filter_fname}]')
                                if flidx == len(sftp.listdir(remote_get_path)) - 1:
                                    print(f'[{fname}] -> [{filter_fname}] 无法找寻A')
                        else:
                            if flnm in fname:
                                print(f'[{fname}] -> 正在下载')
                                remote_full_name = os.path.join(remote_get_path, fname)
                                self.remote_done_transffer(remote_full_name)
                                sftp.get(remote_full_name, os.path.join(local_get_path, fname))
                                # sftp.remove(remote_full_name)
                                print(f'[{fname}] -> 下载成功')
                                break
                            else:
                                if flidx == len(sftp.listdir(remote_get_path))-1:
                                    print(f'[{fname}] -> [{flnm}] 无法找寻B')
                except Exception as e:
                    print(e)
            return flnm

        def stat(self, fpath):
            """
            检查远程服务器文件状态
            :param fpath:文件绝对路径
            """
            sftp = paramiko.SFTPClient.from_transport(self.ssh.get_transport())
            # sftp = self.ssh.open_sftp()
            return sftp.stat(fpath)

        def remote_done_transffer(self, fpath):
            """
            检查文件是否传输完成
            :param fpath:远程服务器上待下载文件绝对路径
            """
            while True:
                old_size = self.stat(fpath).st_size
                time.sleep(3)
                new_size = self.stat(fpath).st_size
                if new_size <= old_size: # 传输已完成
                    return

        def close(self):
            """
            关闭ssh连接
            """
            self.ssh.close()
            print("[SSH] -> 连接关闭")

        def local_done_write(self, fpath,old_size):
            """
            检查本地文件是否已写入完成
            :param fpath:本地待上传文件绝对路径
            """
            new_size = os.stat(fpath).st_size
            if new_size > old_size:
                print('[SSH] -> 🌈 获取成功')
                return
            else:
                print('[SSH] -> 没有新的写入')

    def transffer(local_get_path):
        """
        传输函数
        """
        old_size = os.stat(local_get_path).st_size
        obj = Pysftp(host, port, user, password)
        obj.connect()                                   # SSH连接
        for path_i in range(len(local_put_paths)):      # 上传py文件/其它附件
            local_put_path  = local_put_paths[path_i]
            remote_put_path = remote_put_paths[path_i]
            obj.put(user_input,local_put_path,remote_put_path,path_i)
        flnm = obj.run_pyfile(pyfilepath)               # 执行py文件
        flnm = obj.get(flnm,is_DownloadALL,filter_fname)# 下载文件
        obj.local_done_write(local_get_path,old_size)   # 下载检查
        obj.close()                                     # 关闭连接
        return flnm
    flnm = transffer(local_get_path)
    flpath = os.path.join(local_get_path,flnm)
    return flpath

6. ffmpeg

解决音频内容GPU运算时遇到ffmpeg引起问题

# conda terminal install
conda config --add channels conda-forge
conda install ffmpeg
pip3 install ffmpy

# 找到ffmpeg安装的位置
which ffmpeg

# 寻找ffdec.py文件并修改33行 【/root/miniconda3/envs/myconda/lib/python3.8/site-packages/audioread/】
ori_COMMANDS = ('ffmpeg', 'avconv')
new_COMMANDS = ('/root/miniconda3/envs/myconda/bin/ffmpeg', 'avconv')

7. Piano Audio To Midi

# pip3 install 
pip3 install piano_transcription_inference

# 将训练集放置在指定位置

8. Spleeter

write_py

# pip3 install 
# pip3 install Spleeter
# pip3 install pydub
# 将训练集放置在指定位置

def auto_spleeter_pywrite(userinput,local_put_path):
    import os
    f = open(local_put_path, 'r')
    index = 0
    lines = []
    for line in f.readlines():
        index +=1
        if index == 1:
            song_convert_path = f'song_convert_path = "/mnt/aigc_music/spleeter/source/song/"'
            bounce_path       = f'bounce_path = "/mnt/aigc_music/spleeter/bounce"'
            lines.append(song_convert_path)
            lines.append('\n')
            lines.append(bounce_path)
            lines.append('\n')
        lines.append(line)
    mainpath = os.path.join(os.path.expanduser('~'), 'Desktop/SSH')
    usr_path = os.path.join(os.path.expanduser('~'), 'Desktop/SSH/upload')
    downloadpath = os.path.join(os.path.expanduser('~'), 'Desktop/SSH/download')
    paths = [mainpath, usr_path, downloadpath]
    for path in paths:
        if not os.path.exists(path):
            os.mkdir(path)
    pyfilepath = os.path.join(usr_path, 'audio_spleeter.py')
    pf = open(pyfilepath, 'w')
    for line in lines:
        pf.write(''.join(line))
    pf.close()
    return pyfilepath

audio_spleeter.txt文章来源地址https://www.toymoban.com/news/detail-489950.html

import os,subprocess,spleeter
audio_path  = os.path.dirname(song_convert_path)  + '/'
result_path = bounce_path

# 执行spleeter
cmd = 'for f in ' + audio_path + '*.mp3; do spleeter separate -o ' + result_path + ' -p spleeter:5stems-16kHz $f -B tensorflow; done'
subprocess.call(cmd, shell=True)

# 压缩音频文件
def wav_to_mp3():
    from pydub import AudioSegment
    wav_foldepath = [os.path.join(bounce_path,i) for i in os.listdir(bounce_path) if not i.startswith('.')][0]
    wav_flodepath = '/mnt/aigc_music/spleeter/bounce/temp_split' # os.path.dirname(wav_foldepath)
    wav_files = [os.path.join(wav_foldepath,i) for i in os.listdir(wav_flodepath) if i.endswith('.wav')]
    for w in wav_files:
        sound = AudioSegment.from_wav(w)
        mp3_flnm = w.replace('.wav', '.mp3')
        sound.export(mp3_flnm, format='mp3', bitrate='320k')
wav_to_mp3()

# zip打包分轨
def get_zip_filepath():
    zipfolders = [os.path.join(bounce_path,i) for i in os.listdir(bounce_path) if not i.startswith('.')][0]
    zipfolders = '/mnt/aigc_music/spleeter/bounce/temp_split' # os.path.dirname(zipfolders) + '/'
    zipsource_files = [os.path.join(zipfolders,i) for i in os.listdir(zipfolders) if i.endswith('.mp3')]
    zip_file = os.path.join(bounce_path+'/temp_split/','zip_temp.zip')
    def file2zip(zip_file, zipsource_files):
        import zipfile, os
        with zipfile.ZipFile(zip_file, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
            for file in zipsource_files:
                parent_path, name = os.path.split(file)
                zf.write(file, arcname=name)

    file2zip(
        zip_file=zip_file,
        zipsource_files=zipsource_files,
    )  # ♻️

    zip_tmpfolderpath = zipfolders
    if not os.path.exists(zip_tmpfolderpath):
        os.mkdir(zip_tmpfolderpath)
    zip_path = os.path.join(zip_tmpfolderpath,'zip_temp.zip')
    return zip_path
zip_path = get_zip_filepath()  # ♻️
print(zip_path)

到了这里,关于AIGC - Stable Diffusion 搭建【从零到一】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • zookeeper单节点部署,手把手从零到一

    kafka戳这里:kafka单节点部署,手把手从零到一 事前准备: 1、一台Linux服务器或者是一台虚拟机 2、准备好JDK环境 3、安装好wget(当然也可以不用这个,只是用于下载安装包的一个工具,所以能下载好包就是没问题的) 4、需要了解vim的一些基础操作,不懂得可自行百度 1.1、

    2023年04月15日
    浏览(54)
  • 开发一个Android应用:从零到一的实践指南

    在这篇博文中,我们将逐步探讨如何从头开始构建一个Android应用。我们将从最基本的环境搭建开始,然后深入讨论组件、布局和其他核心概念。在完成整个过程后,你将会掌握一个简单但完整的Android应用开发流程。让我们开始吧! 准备开发环境 创建项目 理解项目结构 设计

    2024年02月08日
    浏览(87)
  • 如何制作流程图?教你从零到一制作

    如何 制作流程图 ? 在当今快节奏、信息化的社会,流程图已经成为了一种非常重要的沟通工具。它能够帮助我们清晰地表达复杂的过程、系统和思路。那么,如何从零开始制作流程图呢?本文将为你提供一份详细的指南。 一、明确目的和内容 在开始制作流程图之前,首先

    2024年01月24日
    浏览(68)
  • 长安链---从零到一部署Chainmaker-2.0.0

    长安链部署 长安链·ChainMaker具备自主可控、灵活装配、软硬一体、开源开放的突出特点,由北京微芯研究院、清华大学、北京航空航天大学、腾讯、百度和京东等知名高校、企业共同研发。取名“长安链”,喻意“长治久安、再创辉煌、链接世界”。 长安链作为区块链开源

    2023年04月08日
    浏览(55)
  • 【30天python从零到一】---第七天:列表和元组

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 Python专栏 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己

    2023年04月19日
    浏览(52)
  • Vue+Electron打包桌面应用(从零到一完整教程)

    切记,整个项目的json文件不能有注释,及时没报错也不行,否则运行命令时还是有问题 参考此视频 1- 1.创建项目 1- 2. 安装依赖运行项目 1- 3.配置Electron 1- 4.修改配置文件 1) vite.config.js 2)main.js(项目根目录新增) 此为electron运行的入口文件 3)preload.js(项目根目录下新增) 4)package

    2024年02月07日
    浏览(55)
  • 入职从零到一:如何快速学习Git以适应工作环境

    本文并非面向完全的 Git 初学者,也不会详细介绍每一个 Git 命令和它的所有选项。相反,本文的目标读者是那些已经有一些基础,至少知道如何在本地仓库进行基本的版本控制操作,包括 git add , git commit 和 git log ,但是还没有在企业环境中真正使用 Git 进行过项目开发的开

    2024年02月11日
    浏览(79)
  • 从零到一的方法:学习视频剪辑与嵌套合并技巧

    随着社交媒体和数字技术的快速发展,视频制作已是常见的工作。那么如何批量嵌套合并视频呢?下面一起来看云炫AI智剪如何批量合并的方法。 嵌套合并后的视频截图查看。 批量嵌套合并的操作: 操作1、在云炫AI智剪上选择“嵌套合并”功能,切换相应的版块。 操作2、把

    2024年02月02日
    浏览(69)
  • 纯编程从零到一创建图书管理系统V1.0

    上一篇文章 答应了道友们通过ChatGpt制作图书管理系统程序,今天第一版LMS(Library Management System)他来了,完整版代码放在在文末,有基础的道友可以 点此跳转,在安装中遇到问题,可以点击此处查看解决方案 效果图 功能列表 1、搜索图书只显示符合条件的图书所在行 2、添加

    2024年01月17日
    浏览(58)
  • 从零到一,接入广告后如何让你的APP顺利实现冷启动?

    ​很多APP在上线后却面临着变现难的问题。其中一个主要原因就是缺乏有效的广告变现经验。而当这些APP开始接入广告时,又面临着如何顺利冷启动的问题。 本文将为您介绍一些关键的步骤和技巧,帮助您的APP在接入广告后成功实现冷启动。 提高用户留存率 广告变现不仅仅

    2024年02月06日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包