TTS | 基于FastSpeech2的语音中英韩文语音合成项目实现,训练自己的语音模型!!

本文主要实现了基于fastspeech2模型的语音合成项目,并训练自己的语音模型~~

环境:Ubuntu(docker),pytorch,

项目地址1(中英文)

https://github.com/ming024/FastSpeech2

环境配置

(进入docker容器内运行)

git clone https://github.com/ming024/FastSpeech2
cd FastSpeech2
pip3 install -r requirements.txt

下载预训练模型并将它们存入新建文件夹,以下路径下output/ckpt/LJSpeech/output/ckpt/AISHELL3output/ckpt/LibriTTS/。如果是docker容器的情况下,先下载到本地再复制到容器内,不是的话可忽略这步。

 docker cp "/home/user/LJSpeech_900000.zip" torch:/workspace/tts-pro/FastSpeech2/output/ckpt/LJSpeech

对于英语单扬声器 TTS,运行

python3 synthesize.py --text "YOUR_DESIRED_TEXT" --restore_step 900000 --mode single -p config/LJSpeech/preprocess.yaml -m config/LJSpeech/model.yaml -t config/LJSpeech/train.yaml

可以改变文字,例如

python synthesize.py --text "There is nothing either good or bad, but thinking makes it so " --restore_step 900000 --mode single -p config/LJSpeech/preprocess.yaml -m config/LJSpeech/model.yaml -t config/LJSpeech/train.yaml

提示错误,无'./output/ckpt/LJSpeech/900000.pth.tar',作者并没有上传此文件,所以在这里省略。

对于普通话多人 TTS,运行

python3 synthesize.py --text "大家好" --speaker_id SPEAKER_ID --restore_step 600000 --mode single -p config/AISHELL3/preprocess.yaml -m config/AISHELL3/model.yaml -t config/AISHELL3/train.yaml

对于英语多人 TTS,运行前,需要把预训练模型,改为FastSpeech2/output/ckpt/LibriTTS/800000.pth.tar

要对FastSpeech2/hifigan/generator_universal.pth.tar.zip进行解压

unzip generator_universal.pth.tar.zip

进行批量推理

python3 synthesize.py --source preprocessed_data/LJSpeech/val.txt --restore_step 900000 --mode batch -p config/LJSpeech/preprocess.yaml -m config/LJSpeech/model.yaml -t config/LJSpeech/train.yaml

提示无RuntimeError: [enforce fail at inline_container.cc:110] . file in archive is not in a subdirectory: 900000.pth.tar

训练

数据预处理

下载数据集ljspeech,可下载到/home/ming/Data/LJSpeech-1.1路径

如果之前已经下载过数据集,可以打开FastSpeech2/config/LJSpeech/preprocess.yaml,修改数据集路径

dataset: "LJSpeech"path:corpus_path: "/workspace/tts-pro/FastSpeech/data/LJSpeech-1.1"lexicon_path: "lexicon/librispeech-lexicon.txt"raw_path: "./raw_data/LJSpeech"preprocessed_path: "./preprocessed_data/LJSpeech"preprocessing:val_size: 512text:text_cleaners: ["english_cleaners"]language: "en"audio:sampling_rate: 22050max_wav_value: 32768.0stft:filter_length: 1024hop_length: 256win_length: 1024mel:n_mel_channels: 80mel_fmin: 0mel_fmax: 8000 # please set to 8000 for HiFi-GAN vocoder, set to null for MelGAN vocoderpitch:feature: "phoneme_level" # support 'phoneme_level' or 'frame_level'normalization: Trueenergy:feature: "phoneme_level" # support 'phoneme_level' or 'frame_level'normalization: True

然后运行

python3 prepare_align.py config/LJSpeech/preprocess.yaml

运行后生成raw_data文件夹,数据如下

语音文件对应的标签文件。(.lab包含用于使用Corel WordPerfect显示和打印标签的信息;可以是Avery标签模板或其他自定义标签文件;包含定义标签在页面上的大小和位置的页面布局信息。

如论文中所述,蒙特利尔强制对齐器(MFA) 用于获取话语和音素序列之间的对齐。此处提供了支持的数据集的比对。将文件解压缩到preprocessed_data/LJSpeech/TextGrid/.

unzip LJSpeech.zip

解压后如图

(如果训练的是别的数据集,修改下数据集名称及路径就可以)别的数据集同理,解压缩命令

unzip LibriTTS.zip

解压后如图

接下来就是,对齐语料库,然后运行预处理脚本。

python3 preprocess.py config/LJSpeech/preprocess.yaml

运行后如图(可能需要点时间,等着就可以啦)

正式训练

先解压预训练权重

cd FastSpeech2/hifigan
unzip generator_LJSpeech.pth.tar.zip
cd ..

训练命令

python train.py -p config/LJSpeech/preprocess.yaml -m config/LJSpeech/model.yaml -t config/LJSpeech/train.yaml

训练过程

训练时间默认900000,需要一周时间,想要改少的话,修改

/workspace/FastSpeech2/config/LJSpeech/train.yaml中的 total_step: 900000

项目地址2(韩语)

HGU-DLLAB/Korean-FastSpeech2-Pytorch: Implementation of Korean FastSpeech2 (github.com)

环境设置

conda create --name mfa python=3.8
conda activate mfa
conda install montreal-forced-aligner==2.0.6
sudo apt-get install ffmpeg
pip install g2pk
cd Korean-FastSpeech2-Pytorch

安装要求环境

pip install -r requirements.txt
pip install tgt
pip install pyworld

下载数据集kks然后解压:数据12853

unzip kss.zip

数据格式如图

使用MFA进行语音文本对齐

运行processng_utils.ipynb ,生成韩语字典

(个人稍微修改)

kss-dic-01.py生成。语音.lab文件和korean-dict.txt韩语字典

import os, tqdm, re
from tqdm import tqdm
from jamo import h2j
from glob import globtext = '/workspace/Korean-FastSpeech2-Pytorch/data/kss/transcript.v.1.4.txt'
base_dir = '/workspace/Korean-FastSpeech2-Pytorch/data/kss/wavs'filters = '([.,!?])'with open(text, 'r', encoding='utf-8') as f:for line in f.readlines():temp = line.split('|')file_dir, script = temp[0], temp[3]script = re.sub(re.compile(filters), '', script)file_dir = file_dir.split('/')fn = file_dir[0] + '/' + file_dir[1][:-3] + 'lab'file_dir = os.path.join(base_dir, fn)with open(file_dir, 'w', encoding='utf-8') as f:f.write(script)file_list = sorted(glob(os.path.join(base_dir, '**/*.lab')))
jamo_dict = {}
for file_name in tqdm(file_list):sentence =  open(file_name, 'r', encoding='utf-8').readline()jamo = h2j(sentence).split(' ')for i, s in enumerate(jamo):if s not in jamo_dict:jamo_dict[s] = ' '.join(jamo[i])        dict_name = 'korean_dict.txt'
with open(dict_name, 'w', encoding='utf-8') as f:for key in jamo_dict.keys():content = '{}\t{}\n'.format(key, jamo_dict[key])f.write(content)

运行后生成

接下来训练一个g2p模型,通过训练数据集生成textgrid文件。

mfa train_g2p korean_dict.txt korean.zip
mfa g2p korean.zip kss korean.txt
#mfa g2p korean.zip /workspace/dataset/kssdataset  korean.txt
mfa train kss korean.txt out
#mfa train  /workspace/dataset/kssdataset  korean.txt out

生成textgrid文件

退出mfa虚拟环境(因为虚拟环境中未设置torch等),

也可在此处【file】直接下载Textgrid文件.放在Korean-FastSpeech2-Python路径下

然后修改data/kss.py的数据集位置

  • 第19行 :parts[0]处是.wav文件,parts[1]处是text文件

  • 第37行 : parts[0]处是.wav文件,parts[1]处是text文件

*TextGrid文件中提取的是每条音频对应的duration、pitch和energy信息.

修改数据集路径

hparams.py中的变量

- dataset: 数据集文件夹名

- data_path: dataset 的顶级文件夹

- meta_name : metadata 例如transcript.v.1.4.txt(语音及文本文件)

textgrid_path: textgrid 文件的位置( 如果是自己处理的数据,请提前压缩 textgrid 文件)

- tetxgrid_name: textgird 压缩textgrid 的文件名

import os
### kss ###
dataset = "kss"
data_path = os.path.join("/workspace/Korean-FastSpeech2-Pytorch/data", dataset)
meta_name = "transcript.v.1.4.txt"    # "transcript.v.1.4.txt" or "transcript.v.1.3.txt" 
textgrid_name = "TextGrid.zip"### set GPU number ###
train_visible_devices = "0"
synth_visible_devices = "0"# Text
text_cleaners = ['korean_cleaners']# Audio and mel
### kss ###
sampling_rate = 22050
filter_length = 1024
hop_length = 256
win_length = 1024### kss ###
max_wav_value = 32768.0
n_mel_channels = 80
mel_fmin = 0
mel_fmax = 8000f0_min = 71.0
f0_max = 792.8
energy_min = 0.0
energy_max = 283.72# FastSpeech 2
encoder_layer = 4
encoder_head = 2
encoder_hidden = 256
decoder_layer = 4
decoder_head = 2
decoder_hidden = 256
fft_conv1d_filter_size = 1024
fft_conv1d_kernel_size = (9, 1)
encoder_dropout = 0.2
decoder_dropout = 0.2variance_predictor_filter_size = 256
variance_predictor_kernel_size = 3
variance_predictor_dropout = 0.5max_seq_len = 1000# Checkpoints and synthesis path
preprocessed_path = os.path.join("./preprocessed/", dataset)
checkpoint_path = os.path.join("./ckpt/", dataset)
eval_path = os.path.join("./eval/", dataset)
log_path = os.path.join("./log/", dataset)
test_path = "./results"# Optimizer
batch_size = 16
epochs = 1000
n_warm_up_step = 4000
grad_clip_thresh = 1.0
acc_steps = 1betas = (0.9, 0.98)
eps = 1e-9
weight_decay = 0.# Vocoder
vocoder = 'vocgan'
vocoder_pretrained_model_name = "vocgan_kss_pretrained_model_epoch_4500.pt"
vocoder_pretrained_model_path = os.path.join("./vocoder/pretrained_models/", vocoder_pretrained_model_name)# Log-scaled duration
log_offset = 1.# Save, log and synthesis
save_step = 10000
eval_step = 1000
eval_size = 256
log_step = 1000
clear_Time = 20

修改数据集路径data/kss.py

第69行

    wav_bak_path = os.path.join(in_dir, "kss", "{}.wav".format(wav_bak_basename))

压缩textgrid文件

zip -r kss_textgird.zip kss

修改文件preprocess.py 后(如下)运行 python preprocess.py

#preprocess.py
import os
from data import kss
import hparams as hpdef write_metadata(train, val, out_dir):with open(os.path.join(out_dir, 'train.txt'), 'w', encoding='utf-8') as f:for m in train:f.write(m + '\n')with open(os.path.join(out_dir, 'val.txt'), 'w', encoding='utf-8') as f:for m in val:f.write(m + '\n')def main():in_dir = hp.data_pathout_dir = hp.preprocessed_pathmeta = hp.meta_nametextgrid_name = hp.textgrid_namemel_out_dir = os.path.join(out_dir, "mel")if not os.path.exists(mel_out_dir):os.makedirs(mel_out_dir, exist_ok=True)ali_out_dir = os.path.join(out_dir, "alignment")if not os.path.exists(ali_out_dir):os.makedirs(ali_out_dir, exist_ok=True)f0_out_dir = os.path.join(out_dir, "f0")if not os.path.exists(f0_out_dir):os.makedirs(f0_out_dir, exist_ok=True)energy_out_dir = os.path.join(out_dir, "energy")if not os.path.exists(energy_out_dir):os.makedirs(energy_out_dir, exist_ok=True)if os.path.isfile(textgrid_name):os.system('mv ./{} {}'.format(textgrid_name, out_dir))if not os.path.exists(os.path.join(out_dir, textgrid_name.replace(".zip", ""))):os.system('unzip {} -d {}'.format(os.path.join(out_dir, textgrid_name), out_dir))if "kss" in hp.dataset:# kss version 1.3if "v.1.3" in meta:if not os.path.exists(os.path.join(in_dir, "wavs_bak")):os.system("mv {} {}".format(os.path.join(in_dir, "wavs"), os.path.join(in_dir, "wavs_bak")))        os.makedirs(os.path.join(in_dir, "wavs"))# kss version 1.4if "v.1.4" in meta:if not os.path.exists(os.path.join(in_dir, "wavs_bak")):os.makedirs(os.path.join(in_dir, "wavs"))os.system("mv {} {}".format(os.path.join(in_dir, "../", meta), os.path.join(in_dir)))for i in range(1, 5) : os.system("mv {} {}".format(os.path.join(in_dir, str(i)), os.path.join(in_dir, "wavs")))os.system("mv {} {}".format(os.path.join(in_dir, "wavs"), os.path.join(in_dir, "wavs_bak")))os.makedirs(os.path.join(in_dir, "wavs"))train, val = kss.build_from_path(in_dir, out_dir, meta)write_metadata(train, val, out_dir)if __name__ == "__main__":main()

运行后如果出现错误,可参考【PS2,PS7】,成功的话会显示下图

然后生成

数据就全部处理完成啦~

训练

修改train.py文件中的数据路径后,就可以直接训练

python train.py

训练后生成

最后合成

python synthesize.py --step  90000

如果出错,请参考【PS8】

如果vocgan出错的话,查看权重位置。

训练自己的语音模型(ing)

上述项目训练都是在服务器上进行,接下来为了录音方便,用自己的笔记本电脑(Win11)进行录音,并设置一系列环境。

设置后端所需环境:python

创建一个新的虚拟环境


git clone https://github.com/pyrasis/mimic-recording-studio
conda create --name mimic python=3.8
conda activate mimic
conda install ffmpeg
cd mimic-recording-studio\backend
pip install -r .\requirements.txt
python run.py

设置前端所需环境:node,yarn

*按下快捷键Win+R,输入cmd,(*这里一定要用管理员打开,要不出错)

打开项目地址(前提是已经安装好nodejs的环境,没有安装的话请参考【PS4】)

cd >cd C:\Users\N-216\pro\Korean_TTS\mimic-recording-studio\frotend
npm install
npm run start

网站往拉下拉,有输入名字,然后开始

这里点击【Allow】允许访问麦克风

然后,点击继续【CONTINUE

录音时:空格键是开始录音,Esc是停止录音,p是重新录音,→是下一个提示,s是跳过提示

如果中间出现

以防万一,全选然后点击【Allow access】允许。

🎙️开始录音🎙️

按照提示词去读(后台位置在\mimic-recording-studio\backend\prompts下的csv或txt文件)

录了几条后后台如图

audio_files下,文件名是uuid:d77d86bc-3873-22c7-d129-f93c9605788b也对应的是name(录音时输入的名字)

这里的文件格式是按照自己想要的格式去分为4个文件夹,每条录音一依次放入文件夹内,如果想要换为其他格式,或者只想存为一个文件夹,需要修改mimic-recordingstudio\backend\app\file_system.py代码,里面有PrompFS类,可按照自己的方式去修改!!

mimic-recording-studio\backend\app\audio.py的功能是

_detect_leading_silence类是检查音频段中的前导静音。

  • 将保留 300 毫秒的前导/结束静音缓冲区,以避免过硬的切断。

  • 参数: sound (AudioSegment): 要检查静音的音频片段。

  • 返回值:int型,剪掉的毫秒数

trim_silence 类是去除音频中的前导音/结束音

  • 参数:path (str): 音频文件的文件名。

  • 返回值:音频片段: 没有过多静音的音频数据。

save_audio类是将音频数据保存为 wav 文件。

  • 参数: path (str): 保存 wav 文件的位置。

  • audio (AudioSegment): 音频数据。

get_audio_len类是得到音频长度,返回时,返回音频的长度/1000的值,将原本的毫秒转换为秒。

在C:\Users\N-216\pro\Korean_TTS\mimic-recording-studio\backend\db\mimicstudio.db处右键

点击【New Query】->输入

SELECT user_name AS [name], uuid FROM usermodel;

保存后,右键【Run Query】,就会出现录音名字和uuid

如果点击【New Query】->输入

-- SQLite
-- List all recordings
SELECT * FROM audiomodel;-- Lists recordings from january 2020 order by phrase
SELECT * FROM audiomodel WHERE created_date BETWEEN '2020-01-01' AND '2020-01-31' ORDER BY prompt;-- Lists number of recordings per day
SELECT DATE(created_date), COUNT(*) AS RecordingsPerDay
FROM audiomodel
GROUP BY DATE(created_date )
ORDER BY DATE(created_date)-- Shows average text length of recordings
SELECT AVG(LENGTH(prompt)) AS avgLength FROM audiomodel

就会查询到录音的所有数据

保存后,右键【Run Query】,就会出现

录好声音后,对于所有录音处理

复制到模型数据路径下

利用MFA处理自己的数据

打开MFA的虚拟环境

conda activate mfa
pip install chardet

需要将自己的数据集利用MFA去生成Fastspeech2所需要的语音信息

【TextGrid,alinment,energy,f0,mel】

ING...

提示信息很明显,意思就是在生产环境,不要再用这种方式运行程序,最好用WSGI服务来替代运行。

解决办法:

就是使用pywsgi 来代替 app.run(host=“0.0.0.0”, port=5000)

from flask import Flask
from gevent import pywsgiapp = Flask(__name__)
@app.route("/")
def hello_world():return "<p>Hello, World!</p>"server = pywsgi.WSGIServer(('0.0.0.0', 12345), app)
server.serve_forever()

文件共享(File)

如果不想训练,可直接下载权重进行测试,下载地址

https://drive.google.com/file/d/15IQZqjRvoQTPMdGMfdnrg4_-wnWFuXRp/view?usp=sharing

下载前,请仔细查看readme.txt文件。

PS

【PS1】ERROR: Could not install packages due to an OSError: [Errno 2] No such file or directory: '/workdir/conda-build/six_1593148849096/work'

在执行 pip install -r requirements.txt出现错误

解决

Getting weird OS Error when I try to import my repo into shar.streamlit - 🚀 Deployment - Streamlit

或者

先删掉six @ file:///workdir/conda-build/six_1593148849096/work

这是从 VCS 存储库安装软件包的特殊语法(pip 19.1 起受支持):

package_name @ git+https://githost/<repo>.git@<commit_id>

再进行

pip install -r requirements.txt

可参考PEP 440 – Version Identification and Dependency Specification | peps.python.org

[PS2]ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject

升级numpy

pip install --upgrade numpy

或者查看numpy与scipy的版本是否匹配

AttributeError: module 'numpy' has no attribute 'long'

最终版本

python==3.8  
numpy==1.23.0
scipy==1.9.0

【PS3】UnboundLocalError: local variable 'train' referenced before assignment

【PS4】起用本地网站后404

【PS5】WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.

就是在生产环境,不要再用这种方式运行程序,最好用WSGI服务来替代运行。

解决办法:

就是使用pywsgi 来代替 app.run(host=“0.0.0.0”, port=5000)

#pip install gevent
from flask import Flask
from gevent import pywsgiapp = Flask(__name__)
@app.route("/")
def hello_world():return "<p>Hello, World!</p>"server = pywsgi.WSGIServer(('0.0.0.0', 12345), app)
server.serve_forever()

【PS6】npm start 出错 : no such file or directory, open 'C:\Users\N-216\package.json'

解决办法:

重新设置nodejs设置环境参考https://blog.csdn.net/weixin_44649780/article/details/131275530?spm=1001.2014.3001.5501

【PS7】TypeError: pad_center() takes 1 positional argument but 2 were given

版本不对,重新设置环境后,显示也有警告但是任然可以运行~

【PS8】/workspace/tts/Korean-FastSpeech2-Pytorch/audio/audio_processing.py:50: FutureWarning: Pass size=1024 as keyword args. From version 0.10 passing these as positional arguments will result in an error

win_sq = librosa_util.pad_center(win_sq, n_fft)

因为传参的时候出现了问题,检查传进去的参数。

解决办法

librosa版本问题,0.10.0版本和0.9.2版本都会出错,换为0.8.0就没有问题。

pip install librosa==0.8.0

参考文献

【1】https://github.com/MycroftAI/mimic-recording-studio

附录

sudo docker cp /home/elena/LJSpeech.zip  torch_na:/workspace/tts-pro/FastSpeech2/preprocessed_data/LJSpeech/
sudo docker cp /home/elena/LibriTTS.zip  torch_na:/workspace/tts-pro/FastSpeech2/preprocessed_data/LibriTTS/TextGrid/

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不是走投无路,千万别去创业小公司!把大厂经验和方法带过去,实现业绩增长后,老板开始嫌弃和PUA我!...

这是一则来自过来人的惨痛提醒&#xff1a; 奉劝各位毕业的同学&#xff0c;不是走投无路&#xff0c;千万别去那种老板很穷的创业小公司&#xff0c;学完你的经验就让你滚蛋&#xff01; 这位网友说&#xff0c;老板一开始很敬重他&#xff0c;因为他是大厂出来的&#xff0c;…

如何快速判断一家公司要倒闭了?

作者&#xff1a;景岁 来源&#xff1a;西二旗生活指北&#xff08;ID&#xff1a;ShelchiLifeGuide&#xff09; 点击上方Python知识圈&#xff0c;选择设为星标 回复1024获取Python资料 互联网公司只有三种状态&#xff1a; 还没完&#xff0c;快完了&#xff0c;完了。 作为…

微信小程序-wx.createAnimation动画实现

一、效果 说明&#xff1a;类似携程切换往返地址 二、实现 1&#xff09;.wxml: <view class"animation"><view class"dis-flex"><view classflex3 animation"{{lAnimate}}">{{start}}</view><view classflex1 bi…

微信小程序图片流动动画效果(附代码,图)

微信小程序图片流动动画效果 最近也是在做一款小程序&#xff0c;玩一玩。 废话不多说&#xff0c;先上动态效果&#xff1a; 流动效果 要实现这样的效果可以利用css&#xff0c;但微信小程序这里有个swiper组件可以起到类似的效果。下面就一起来康康。 首先&#xff0c;了解…

一句话生成角色动画 # text2motion

‍ ‍‍ ‍ 当你和他人谈论人工智能的潜力时&#xff0c;很多人都表露出同样的担心&#xff1a; 害怕被取代‍ 特别在最近几个月&#xff0c;随着生成式人工智能的投资和创新的爆炸性增长&#xff0c;这些不安的感觉更加强烈。 机器学习中相对较新的创新&#xff0c;即扩散模型…

P1072 [NOIP2009 提高组] Hankson 的趣味题

题目描述 Hanks 博士是 BT&#xff08;Bio-Tech&#xff0c;生物技术) 领域的知名专家&#xff0c;他的儿子名叫 Hankson。现在&#xff0c;刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上&#xff0c;老师讲解了如何求两个正整数 c1​ 和 c2​ 的最大公约数…

小学奥数与信奥

小学奥数与信奥 题目 3. 把4分拆成几个数相加的形式(0不考虑作为加数)&#xff0c;有多少种不同的分拆方式&#xff1f; 把5分拆成几个数相加的形式(0不考虑作为加数)&#xff0c;有多少种不同的分拆方式&#xff1f; 把6分拆成几个数相加的形式(0不考虑作为加数)&#xff0c…

站长在线经典Python题:使用Python编程思想解决鸡兔同笼的问题的4种方法

欢迎你来到站长在线的Python题库&#xff0c;鸡兔写完Python教程以后&#xff0c;还是来一个Python的题目吧&#xff01;想来想去&#xff0c;还是写一个经典的题目为好&#xff0c;作为本栏目的第一个题目。我就想到了比较热门的题目《鸡兔同笼的问题》&#xff0c;本文不是用…

Qt常用的按钮控件编程(五)-- QCommandLinkButton 按钮

文章目录 前言7、QCommandLinkButton按钮7.1 例程功能和程序执行效果7.2 生成项目7.3 添加资源文件7.4 代码编辑7.4.1 修改项目文件 _radiobutton.pro7.4.2 修改 main.cpp7.4.3 修改 widget.h7.4.4 修改 widget.cpp 7.5 切换Kit&#xff0c;获得运行在不同系统中的运行的执行文…

【python】tkinter程序打包成exe可执行文件相关知识点记录

打包流程&#xff1a; 进入带打包的文件夹目录&#xff0c;输入“cmd” 在cmd对话框中输入 pyinstaller -F -w -i 【exe图标位置&#xff08;ico文件&#xff09;】【程序入口文件】 pyinstaller -F -w -i i.ico test.py 具体如图&#xff0c;图片摘自python利用pyinstaller打…

chatgpt赋能python:Python如何进行P图——探索Python图像处理库的可能性

Python如何进行P图——探索Python图像处理库的可能性 介绍 随着数字化时代的到来&#xff0c;图像处理已不再是专业领域的专属&#xff0c;许多人也开始接触和学习图像处理。我们常见的图像处理软件有Photoshop和GIMP等&#xff0c;而在Python编程领域中&#xff0c;也有很多…

面向对象程序设计 C++总结笔记(1)

面向对象程序设计 学习方法 理解基本原理掌握程序设计方法加强动手实践 课程目标 理解面向对象程序设计的基本原理&#xff0c;掌握面向对象技术的基本概念和封装性、继承性和多态性&#xff0c;能够具有面向对象程序设计思想。掌握C语言面向对象的基本特性和C语言基础知识&…

深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

文章目录 一、前期工作 导入库图片生成函数导入数据生成数据集函数 二、CNN模型建立 三、训练模型函数 四、训练模型与结果 五、验证 大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来一个利用卷积神经网络&#xff08;CNN&#xff09;进行中文OCR识别&#xff0c;…

7个成功的DTC品牌出海营销策略,提高海外客户的忠诚度!

关键词&#xff1a;DTC品牌出海、DTC营销、客户忠诚度 近年来&#xff0c;普通消费者关心的事情发生了巨大变化。 60% 的消费者会特意从品牌而不是第三方零售商处购买。 从大型零售商处购买再成为主流。人们希望与他们关心并感到关心的品牌建立关系。他们希望支持独立企业并找到…

Cat.1热度居高不下,利尔达 NT26E系列模组带来更多新选择

2021年全球Cat.1处于爆发期&#xff0c;出货量达到1.2亿&#xff0c;仅在中国市场上&#xff0c;Cat.1出货量就达到了1.1亿。据近日市场研究公司Counterpoint最新的发布全球蜂窝物联网芯片跟踪报告&#xff0c;2021年第四季度&#xff0c;4G Cat.1出货量同比增长154%。今年的市…

Cat.1模组再添新选择,利尔达推出NT26U提供多元应用思路

Cat.1因模组成熟度高且可复用现有的LTE资源而广受欢迎&#xff0c;它不但成本低&#xff0c;还能在短时间内形成规模效应。随着2G/3G的加速退网&#xff0c;Cat.1作为中低速率应用场景中最适合保障通信能力的网络之一更是水涨船高。 基于展锐的Cat.1模组 作为LTE网络的“低配版…

短信接收流程

Android 短信接收流程 Android S 短信接收流程 Android 12 短信接收流程 指路 -> 短信发送流程 流程图

开题报告PPT怎么制作

毕业设计答辩的首要环节就是前期答辩&#xff0c;也叫作开题汇报答辩&#xff0c;主要内容是对后期设计制作的规划及时间安排&#xff0c;同时还有设计要达到什么目的效果&#xff0c;预测在制作工程中可能遇到的问题并且提出这些问题的解决方案&#xff0c;开题报告汇报时以PP…

springboot+微信小程序的点餐系统(开题报告+论文+答辩PPT+源码)

技术架构 SprongBootMysql微信小程序 简介 本点餐小程序是使用Java/JavaScript编程语言开发的&#xff0c;存储数据方面则用到了MySQL数据库。顾客可以使用小程序扫码功能扫描餐厅桌角的二维码就座&#xff0c;也可以点击排号等位由后台工作人员安排就座&#xff1b;通过首页…

毕业论文学术报告答辩开题报告PPT模板

模板介绍 毕业论文学术报告答辩开题报告PPT模板。一套论文答辩幻灯片模板&#xff0c;内含黑色,红色多种配色&#xff0c;风格设计&#xff0c;动态播放效果&#xff0c;精美实用。 希望下面这份精美的PPT模板能给你带来帮助&#xff0c;温馨提示&#xff1a;本资源使用PPT或…