MockingBird - 实时语音克隆 中文/普通话

news2025/1/24 14:28:47

在这里插入图片描述

文章目录

    • 一、关于 MockingBird
      • 特性
    • 二、安装
      • 1、通用配置
      • 2、M1芯片Mac环境配置(Inference Time)
        • 2.1 安装`PyQt5`
        • 2.2 安装`pyworld`和`ctc-segmentation`
        • 2.3 安装其他依赖
        • 2.4 运行
    • 三、准备预训练模型
      • 1、使用数据集自己训练encoder模型 (可选)
      • 2、使用数据集自己训练合成器模型(与2.3二选一)
      • 3、使用社区预先训练好的合成器(与2二选一)
      • 4、训练声码器 (可选)
    • 四、启动程序或工具箱
      • 1、启动Web程序(v2):
      • 2、启动工具箱:
    • 五、番外:语音转换 Voice Conversion(PPG based)
      • 1、准备环境
      • 2、使用数据集自己训练PPG2Mel模型 (可选)
      • 3、启动工具箱VC模式
    • 六、常见问题(FQ&A)
      • 1.数据集在哪里下载?
      • 2、`<datasets_root>`是什麼意思?
      • 3、训练模型显存不足
      • 4、碰到 RuntimeError
      • 5、如何改善CPU、GPU占用率?
      • 6、发生 `页面文件太小,无法完成操作`
      • 7、什么时候算训练完成?
    • 引用及论文


一、关于 MockingBird

  • github : https://github.com/babysor/MockingBird
  • Wiki教程 : https://github.com/babysor/MockingBird/wiki/Quick-Start-(Newbie)
  • DEMO VIDEO : https://www.bilibili.com/video/BV17Q4y1B7mY/
  • 训练教程 : https://vaj2fgg8yn.feishu.cn/docs/doccn7kAbr3SJz0KM0SIDJ0Xnhd

特性

  • 🌍 中文 支持普通话并使用多种中文数据集进行测试:aidatatang_200zh, magicdata, aishell3, biaobei, MozillaCommonVoice, data_aishell 等
  • 🤩 PyTorch 适用于 pytorch,已在 1.9.0 版本(最新于 2021 年 8 月)中测试,GPU Tesla T4 和 GTX 2060
  • 🌍 Windows + Linux 可在 Windows 操作系统和 linux 操作系统中运行(苹果系统M1版也有社区成功运行案例)
  • 🤩 Easy & Awesome 仅需下载或新训练合成器(synthesizer)就有良好效果,复用预训练的编码器/声码器,或实时的HiFi-GAN作为vocoder
  • 🌍 Webserver Ready 可伺服你的训练结果,供远程调用

二、安装


安装要求


1、通用配置

按照原始存储库测试您是否已准备好所有环境。 运行工具箱(demo_toolbox.py)需要 Python 3.7 或更高版本

  • 安装 PyTorch。
    如果在用 pip 方式安装的时候出现 ERROR: Could not find a version that satisfies the requirement torch==1.9.0+cu102 (from versions: 0.1.2, 0.1.2.post1, 0.1.2.post2) 这个错误可能是 python 版本过低,3.9 可以安装成功
  • 安装 ffmpeg。
  • 运行pip install -r requirements.txt 来安装剩余的必要包。
    这里的环境建议使用 Repo Tag 0.0.1 Pytorch1.9.0 with Torchvision0.10.0 and cudatoolkit10.2 requirements.txt webrtcvad-wheels 因为 requiremants.txt 是在几个月前导出的,所以不适配新版本
  • 安装 webrtcvad pip install webrtcvad-wheels
    或者
  • conda 或者 mamba 安装依赖
conda env create -n env_name -f env.yml

mamba env create -n env_name -f env.yml

会创建新环境安装必须的依赖. 之后切换环境就完成了:

conda activate env_name

env.yml只包含了运行时必要的依赖,暂时不包括monotonic-align,如果想要装GPU版本的pytorch可以查看官网教程。


2、M1芯片Mac环境配置(Inference Time)

以下环境按x86-64搭建,使用原生的demo_toolbox.py,可作为在不改代码情况下快速使用的workaround。
如需使用M1芯片训练,因demo_toolbox.py依赖的PyQt5不支持M1,则应按需修改代码,或者尝试使用web.py


2.1 安装PyQt5

参考 : https://stackoverflow.com/a/68038451/20455983

  • 用Rosetta打开Terminal,参考这个链接
  • 用系统Python创建项目虚拟环境
/usr/bin/python3 -m venv /PathToMockingBird/venv
source /PathToMockingBird/venv/bin/activate
  • 升级pip并安装 PyQt5
pip install --upgrade pip
pip install pyqt5

2.2 安装pyworldctc-segmentation

这里两个文件直接pip install的时候找不到wheel,尝试从c里build时找不到Python.h报错

  • 安装pyworld
    • brew install python 通过brew安装python时会自动安装Python.h
    • export CPLUS_INCLUDE_PATH=/opt/homebrew/Frameworks/Python.framework/Headers 对于M1,brew安装Python.h到上述路径。把路径添加到环境变量里
    • pip install pyworld
  • 安装ctc-segmentation
    因上述方法没有成功,选择从github clone源码手动编译
    • git clone https://github.com/lumaku/ctc-segmentation.git 克隆到任意位置
    • cd ctc-segmentation
    • source /PathToMockingBird/venv/bin/activate 假设一开始未开启,打开MockingBird项目的虚拟环境
    • cythonize -3 ctc_segmentation/ctc_segmentation_dyn.pyx
    • /usr/bin/arch -x86_64 python setup.py build 要注意明确用x86-64架构编译
    • /usr/bin/arch -x86_64 python setup.py install --optimize=1 --skip-build用x86-64架构安装

2.3 安装其他依赖
  • /usr/bin/arch -x86_64 pip install torch torchvision torchaudio 这里用pip安装PyTorch,明确架构是x86
  • pip install ffmpeg 安装ffmpeg
  • pip install -r requirements.txt

2.4 运行

参考这个链接 ,让项目跑在x86架构环境上

  • vim /PathToMockingBird/venv/bin/pythonM1
  • 写入以下代码
#!/usr/bin/env zsh
mydir=${0:a:h}
/usr/bin/arch -x86_64 $mydir/python "$@"
  • chmod +x pythonM1 设为可执行文件
  • 如果使用PyCharm,则把Interpreter指向pythonM1,否则也可命令行运行/PathToMockingBird/venv/bin/pythonM1 demo_toolbox.py

三、准备预训练模型

考虑训练您自己专属的模型或者下载社区他人训练好的模型:
近期创建了知乎专题 将不定期更新炼丹小技巧or心得,也欢迎提问


1、使用数据集自己训练encoder模型 (可选)

  • 进行音频和梅尔频谱图预处理: python encoder_preprocess.py <datasets_root> 使用-d {dataset} 指定数据集,支持 librispeech_other,voxceleb1,aidatatang_200zh,使用逗号分割处理多数据集。
  • 训练encoder: python encoder_train.py my_run <datasets_root>/SV2TTS/encoder
    训练encoder使用了visdom。你可以加上-no_visdom禁用visdom,但是有可视化会更好。在单独的命令行/进程中运行"visdom"来启动visdom服务器。

2、使用数据集自己训练合成器模型(与2.3二选一)

  • 下载 数据集并解压:确保您可以访问 train 文件夹中的所有音频文件(如.wav)
  • 进行音频和梅尔频谱图预处理: python pre.py <datasets_root> -d {dataset} -n {number} 可传入参数:
  • -d {dataset} 指定数据集,支持 aidatatang_200zh, magicdata, aishell3, data_aishell, 不传默认为aidatatang_200zh
  • -n {number} 指定并行数,CPU 11770k + 32GB实测10没有问题
    假如你下载的 aidatatang_200zh文件放在D盘,train文件路径为 D:\data\aidatatang_200zh\corpus\train , 你的datasets_root就是 D:\data\
  • 训练合成器: python ./control/cli/synthesizer_train.py mandarin <datasets_root>/SV2TTS/synthesizer
  • 当您在训练文件夹 synthesizer/saved_models/ 中看到注意线显示和损失满足您的需要时,请转到启动程序一步。

3、使用社区预先训练好的合成器(与2二选一)

当实在没有设备或者不想慢慢调试,可以使用社区贡献的模型(欢迎持续分享):

作者下载链接效果预览信息
作者https://pan.baidu.com/s/1iONvRxmkI-t1nHqxKytY3g 百度盘链接 4j5d75k steps 用3个开源数据集混合训练
作者https://pan.baidu.com/s/1fMh9IlgKJlL2PIiRTYDUvw 百度盘链接 提取码:om7f25k steps 用3个开源数据集混合训练, 切换到tag v0.0.1使用
@FawenYohttps://yisiou-my.sharepoint.com/:u:/g/personal/lawrence_cheng_fawenyo_onmicrosoft_com/EWFWDHzee-NNg9TWdKckCc4BC7bK2j9cCbOWn0-_tK0nOg?e=n0gGgCinput output200k steps 台湾口音需切换到tag v0.0.1使用
@mivenhttps://pan.baidu.com/s/1PI-hM3sn5wbeChRryX-RCQ 提取码:2021https://www.bilibili.com/video/BV1uh411B7AD/150k steps 注意:根据issue修复 并切换到tag v0.0.1使用

4、训练声码器 (可选)

对效果影响不大,已经预置3款,如果希望自己训练可以参考以下命令。

  • 预处理数据: python vocoder_preprocess.py <datasets_root> -m <synthesizer_model_path>
    <datasets_root>替换为你的数据集目录,<synthesizer_model_path>替换为一个你最好的synthesizer模型目录,例如 sythensizer\saved_models\xxx
  • 训练wavernn声码器: python ./control/cli/vocoder_train.py <trainid> <datasets_root>
    <trainid>替换为你想要的标识,同一标识再次训练时会延续原模型
  • 训练hifigan声码器: python ./control/cli/vocoder_train.py <trainid> <datasets_root> hifigan
    <trainid>替换为你想要的标识,同一标识再次训练时会延续原模型
  • 训练fregan声码器: python ./control/cli/vocoder_train.py <trainid> <datasets_root> --config config.json fregan
    <trainid>替换为你想要的标识,同一标识再次训练时会延续原模型
  • 将GAN声码器的训练切换为多GPU模式:修改GAN文件夹下.json文件中的"num_gpus"参数

四、启动程序或工具箱

您可以尝试使用以下命令:


1、启动Web程序(v2):

python web.py` 运行成功后在浏览器打开地址, 默认为 `http://localhost:8080
  • 仅支持手动新录音(16khz), 不支持超过4MB的录音,最佳长度在5~15秒

2、启动工具箱:

python demo_toolbox.py -d <datasets_root>

请指定一个可用的数据集文件路径,如果有支持的数据集则会自动加载供调试,也同时会作为手动录制音频的存储目录。

d48ea37adf3660e657cfb047c10edbc


五、番外:语音转换 Voice Conversion(PPG based)

想像柯南拿着变声器然后发出毛利小五郎的声音吗?本项目现基于PPG-VC,引入额外两个模块(PPG extractor + PPG2Mel), 可以实现变声功能。(文档不全,尤其是训练部分,正在努力补充中)


1、准备环境

  • 确保项目以上环境已经安装ok,运行pip install espnet 来安装剩余的必要包。
  • 下载以下模型 链接: https://pan.baidu.com/s/1bl_x_DHJSAUyN2fma-Q_Wg 提取码:gh41
    • 24K采样率专用的vocoder(hifigan)到 vocoder\saved_models\xxx
    • 预训练的ppg特征encoder(ppg_extractor)到 ppg_extractor\saved_models\xxx
    • 预训练的PPG2Mel到 ppg2mel\saved_models\xxx

2、使用数据集自己训练PPG2Mel模型 (可选)

  • 下载aidatatang_200zh数据集并解压:确保您可以访问 train 文件夹中的所有音频文件(如.wav)
  • 进行音频和梅尔频谱图预处理: python ./control/cli/pre4ppg.py <datasets_root> -d {dataset} -n {number} 可传入参数:
  • -d {dataset} 指定数据集,支持 aidatatang_200zh, 不传默认为aidatatang_200zh
  • -n {number} 指定并行数,CPU 11700k在8的情况下,需要运行12到18小时!待优化
    假如你下载的 aidatatang_200zh文件放在D盘,train文件路径为 D:\data\aidatatang_200zh\corpus\train , 你的datasets_root就是 D:\data\
  • 训练合成器, 注意在上一步先下载好ppg2mel.yaml, 修改里面的地址指向预训练好的文件夹: python ./control/cli/ppg2mel_train.py --config .\ppg2mel\saved_models\ppg2mel.yaml --oneshotvc
  • 如果想要继续上一次的训练,可以通过--load .\ppg2mel\saved_models\<old_pt_file> 参数指定一个预训练模型文件。

3、启动工具箱VC模式

您可以尝试使用以下命令: python demo_toolbox.py -vc -d <datasets_root>
请指定一个可用的数据集文件路径,如果有支持的数据集则会自动加载供调试,也同时会作为手动录制音频的存储目录。

微信图片_20220305005351


六、常见问题(FQ&A)


1.数据集在哪里下载?

数据集OpenSLR地址其他源 (Google Drive, Baidu网盘等)
aidatatang_200zhOpenSLRGoogle Drive
magicdataOpenSLRGoogle Drive (Dev set)
aishell3OpenSLRGoogle Drive
data_aishellOpenSLR

解压 aidatatang_200zh 后,还需将 aidatatang_200zh\corpus\train下的文件全选解压缩


2、<datasets_root>是什麼意思?

假如数据集路径为 D:\data\aidatatang_200zh,那么 <datasets_root>就是 D:\data


3、训练模型显存不足

训练合成器时:将 synthesizer/hparams.py中的batch_size参数调小

//调整前
tts_schedule = [(2,  1e-3,  20_000,  12),   # Progressive training schedule
                (2,  5e-4,  40_000,  12),   # (r, lr, step, batch_size)
                (2,  2e-4,  80_000,  12),   #
                (2,  1e-4, 160_000,  12),   # r = reduction factor (# of mel frames
                (2,  3e-5, 320_000,  12),   #     synthesized for each decoder iteration)
                (2,  1e-5, 640_000,  12)],  # lr = learning rate
//调整后
tts_schedule = [(2,  1e-3,  20_000,  8),   # Progressive training schedule
                (2,  5e-4,  40_000,  8),   # (r, lr, step, batch_size)
                (2,  2e-4,  80_000,  8),   #
                (2,  1e-4, 160_000,  8),   # r = reduction factor (# of mel frames
                (2,  3e-5, 320_000,  8),   #     synthesized for each decoder iteration)
                (2,  1e-5, 640_000,  8)],  # lr = learning rate

声码器-预处理数据集时:将 synthesizer/hparams.py中的batch_size参数调小

//调整前
### Data Preprocessing
        max_mel_frames = 900,
        rescale = True,
        rescaling_max = 0.9,
        synthesis_batch_size = 16,                  # For vocoder preprocessing and inference.
//调整后
### Data Preprocessing
        max_mel_frames = 900,
        rescale = True,
        rescaling_max = 0.9,
        synthesis_batch_size = 8,                  # For vocoder preprocessing and inference.

声码器-训练声码器时:将 vocoder/wavernn/hparams.py中的batch_size参数调小

//调整前
# Training
voc_batch_size = 100
voc_lr = 1e-4
voc_gen_at_checkpoint = 5
voc_pad = 2

//调整后
# Training
voc_batch_size = 6
voc_lr = 1e-4
voc_gen_at_checkpoint = 5
voc_pad =2

4、碰到 RuntimeError

RuntimeError: Error(s) in loading state_dict for Tacotron: size mismatch for encoder.embedding.weight: copying a param with shape torch.Size([70, 512]) from checkpoint, the shape in current model is torch.Size([75, 512]).

请参照 issue #37


5、如何改善CPU、GPU占用率?

视情况调整batch_size参数来改善


6、发生 页面文件太小,无法完成操作

请参考这篇文章,将虚拟内存更改为100G(102400),例如:文件放置D盘就更改D盘的虚拟内存


7、什么时候算训练完成?

首先一定要出现注意力模型,其次是loss足够低,取决于硬件设备和数据集。拿本人的供参考,我的注意力是在 18k 步之后出现的,并且在 50k 步之后损失变得低于 0.4 [attention_step_20500_sample_1


step-135500-mel-spectrogram_sample_1


引用及论文

该库一开始从仅支持英语的Real-Time-Voice-Cloning 分叉出来的,鸣谢作者。

URLDesignation标题实现源码
1803.09017GlobalStyleToken (synthesizer)Style Tokens: Unsupervised Style Modeling, Control and Transfer in End-to-End Speech Synthesis本代码库
2010.05646HiFi-GAN (vocoder)Generative Adversarial Networks for Efficient and High Fidelity Speech Synthesis本代码库
2106.02297Fre-GAN (vocoder)Fre-GAN: Adversarial Frequency-consistent Audio Synthesis本代码库
1806.04558SV2TTSTransfer Learning from Speaker Verification to Multispeaker Text-To-Speech Synthesis本代码库
1802.08435WaveRNN (vocoder)Efficient Neural Audio Synthesisfatchord/WaveRNN
1703.10135Tacotron (synthesizer)Tacotron: Towards End-to-End Speech Synthesisfatchord/WaveRNN
1710.10467GE2E (encoder)Generalized End-To-End Loss for Speaker Verification本代码库

2024-08-04(日)

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

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

相关文章

41缺失的第一个正数【力扣】【C++】

题目描述 题目链接 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 [1,…

一篇文章让你搞懂原码,反码,补码!

目录 1.机器数和机器数真值 1.1机器数 1.2机器数的真值 2.原码&#xff0c;反码&#xff0c;补码的计算方法 2.1原码 2.2反码 2.3补码 3.为什么要使用反码和补码&#xff1f; 3.1原码不能让符号位参与运算的问题&#xff1a; 3.2为了解决原码作减法&#xff0c;引入…

【C语言】算法:二分查找

当我们想在一个有序的序列里面查找一个数字的时候&#xff0c;通常会想到使用循环遍历&#xff0c;也就是下面这种方法&#xff1a; 比如我们想在下面的数组里面找到7&#xff1a; int main() {int num 7;int arr[10] { 1,2,3,4,5,6,7,8,9,10 };for (int i 0; i < size…

在亚马逊云科技AWS上利用ElasticSearch和RAG搭建个性化推荐系统

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍用当下热门的RAG和大语言模型&#xf…

ThreadLocal源码分析

1.前言 1.1 ThreadLocal基本原理 ThreadLocal 是 Java 中的一个非常有用的类&#xff0c;它提供了一种线程局部变量&#xff0c;即每个线程都可以访问到自己独立初始化过的变量副本&#xff0c;这个变量对其他线程是不可见的。最常见的用法就是用户请求携带用户ID请求某个接口…

机器学习 第9章-聚类

机器学习 第9章-聚类 9.1 聚类任务 在“无监督学习”(unsupervised learning)中&#xff0c;训练样本的标记信息是未知的&#xff0c;目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律&#xff0c;为进一步的数据分析提供基础。此类学习任务中研究最多、应用最广…

【Git】如何优雅地使用Git中的tag来管理项目版本

目录 tagtag 和 branch区别操作命令打tag&#xff0c;当前分支标记tag提交到远程服务器删除本地tag删除远程tag切换到特定的tag查看所有tag查看标签详细信息 好书推荐 tag Git中的tag&#xff08;标签&#xff09;用于给项目在特定时间点&#xff08;某个版本发布&#xff09;…

周鸿祎回应将成三六零第一大股东:会和公司一起走下去

在数字化浪潮席卷全球的今天&#xff0c;网络安全已成为国家安全的重要组成部分。三六零&#xff0c;作为国内网络安全领域的佼佼者&#xff0c;其每一步动态都牵动着业界的神经。近日&#xff0c;随着公司控股股东天津奇信志成的解散清算&#xff0c;周鸿祎的持股比例上升&…

【数据泄露】据称一名威胁行为者正在出售某个加密货币交易平台数据库

该威胁行为者表示&#xff1a; “你好&#xff0c; 我想出售一个加密货币交易平台的数据库 (.csv)。该平台很活跃&#xff0c;并且对实际使用它的用户来说很合法。 行数&#xff1a;150,000 价格&#xff1a;1,500 美元” 泄露数据&#xff1a;user_id、user_name、user_ro…

【Java】Java学生信息管理系统(源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

SpringBoot项目详细整合邮箱服务

springboot 版本&#xff1a;2.6.3 Java版本&#xff1a;1.8 一、应用场景 用户注册发送激活邮箱 注册登录时用邮箱接收验证码 用户密码重置 向用户发送相关系统消息 … 二、添加依赖 <!-- 邮箱 --> <dependency><groupId>org.springframework.b…

【单片机毕业设计选题24098】-校园智能绿植浇灌系统

系统功能: 1. 手机通过蓝牙模块显示系统信息 2. OLED模块显示系统信息 3. DHT11采集温湿度 4. 继电器模块控制水泵 5. 按键调节湿度设定阈值 6. 土壤湿度传感器模块采集土壤湿度 7. 光照传感器采集光照值 系统分为手动和自动模式&#xff0c;上电默认为自动模式&#x…

scratch魔法门 2024年6月scratch四级 中国电子学会图形化编程 少儿编程等级考试四级真题和答案解析

目录 scratch魔法门 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、pyt…

2024/8/4 维高-STD60N驱动器(伺服)---客户反馈:电机异响

步进电机 MHS1A86-60B85B &#xff0c;额定电流6A 步骤一&#xff1a;设置额定电流 std60n驱动器拔码全部为off&#xff08;后台设置&#xff09;&#xff0c;伺服后台连上后设置h00-11按电机铭牌进行 设置下额定电流 步骤二&#xff1a;最好设置峰值电流一…

Jenkins未授权访问漏洞

Jenkins未授权访问漏洞 默认情况下 Jenkins面板中用户可以选择执行脚本界面来操作一些系统层命令&#xff0c;攻击者可通过未授权访问漏洞或者暴力破解用户密码等进入后台管理服务&#xff0c;通过脚本执行界面从而获取服务器权限。 漏洞复现 步骤一:使用以下fofa语法进行产品…

GUI:Tkinter(一)

Tkinter文档 一&#xff0c;Tkinter基本流程 1. 创建应用程序主窗口对象 from tkinter import * window Tk() window.mainloop()#开启主循环 2. 在主窗口中&#xff0c;添加各种可视化组件&#xff0c;比如&#xff1a;按钮&#xff08;Button&#xff09;、文本框&#x…

Java中Lambda表达式的使用

Lambda的背景 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda 表达式&#xff08;Lambda expressio…

用户看广告获取密码访问网页内容流量主模式源码

简介&#xff1a; 全开源付费进群流量主模式&#xff0c;用户看广告获取密码访问网页内容&#xff0c;网站生成内容&#xff0c;用户需要浏览内容跳转至小程序&#xff0c;观看广告后获取密码&#xff0c;输入密码查看网页内容。 与之前得9.9付费进群区别就是内容体现在了网页…

【信创】国产操作系统上使用的万能打印驱动 _ 统信 _ 麒麟 _ 中科方德

往期好文&#xff1a;统信UOS服务器离线安装postgresql数据库 Hello&#xff0c;大家好&#xff01;今天给大家带来一款在信创终端操作系统上使用的万能打印驱动——瑞印万能打印驱动。这款驱动程序是国产操作系统下的通用打印驱动程序&#xff0c;具有很高的兼容性和广泛的功能…

图论:1857. 有向图中最大颜色值(拓扑排序+动态规划)

文章目录 1.问题分析2.代码解析2.1 代码步骤1. 初始化数据结构2. 构建图和入度数组3. 初始化队列4. 拓扑排序和动态规划5. 检查是否存在环并返回结果 3. 问题扩展1. 最长路径问题&#xff08;DAG&#xff09;2. 最短路径问题&#xff08;DAG&#xff09;3. 最大路径和问题4. 路…