政安晨【零基础玩转各类开源AI项目】:基于Ubuntu系统本地部署使用GPT-SoVITS进行语音克隆与TTS语音生成

目录

介绍

什么是TTS

安装Miniconda

框架功能

测试通过的环境

开始

1. 安装好miniconda

2. 进入下载的GPT-SoVITS目录

3. 创建虚拟环境并执行脚本

4. 执行过程中可能会出错

5. 下载预训练模型

6. 训练过程中可能会报错

7. 使用过程中可能出错

8.以下是使用全过程


政安晨的个人主页政安晨

欢迎 👍点赞✍评论⭐收藏

收录专栏: 零基础玩转各类开源AI项目

希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正!

介绍

这是一款开源的AI音色克隆框架,目前只有TTS(文字转语音)功能,将来会更新变声功能。现在介绍如何搭建部署。

GPT-SoVITS的正确缩写应该是GSV,请不要用sovits来简称它,这会让人把它和So-VITS-SVC搞混,两者并没有什么关系

项目地址:GitHub - RVC-Boss/GPT-SoVITS: 1 min voice data can also be used to train a good TTS model! (few shot voice cloning)

什么是TTS

TTS(Text-To-Speech)这是一种文字转语音的语音合成。

类似的还有SVC(歌声转换)SVS(歌声合成)等。目前GPT-SoVITS只有TTS功能,也就是不能唱歌。

GPT-SoVITS实现了:

—— 由参考音频的情感、音色、语速控制合成音频的情感、音色、语速

—— 可以少量语音微调训练,也可不训练直接推理

—— 可以跨语种生成,即参考音频(训练集)和推理文本的语种为不同语种

安装Miniconda

这款开源音频克隆生成AI框架是基于conda的,在ubuntu系统中需要安装miniconda后再使用。

框架功能

  1. 零样本文本到语音(TTS): 输入 5 秒的声音样本,即刻体验文本到语音转换。

  2. 少样本 TTS: 仅需 1 分钟的训练数据即可微调模型,提升声音相似度和真实感。

  3. 跨语言支持: 支持与训练数据集不同语言的推理,目前支持英语、日语和中文。

  4. WebUI 工具: 集成工具包括声音伴奏分离、自动训练集分割、中文自动语音识别(ASR)和文本标注,协助初学者创建训练数据集和 GPT/SoVITS 模型。

测试通过的环境

  • Python 3.9,PyTorch 2.0.1,CUDA 11
  • Python 3.10.13,PyTorch 2.1.2,CUDA 12.3
  • Python 3.9,Pytorch 2.2.2,macOS 14.4.1(Apple 芯片)
  • Python 3.9,PyTorch 2.2.2,CPU 设备

注: numba==0.56.4 需要 python<3.11

笔者政安晨在Ubuntu系统、128G内存、12核CPU的PC机上,用CPU跑起来使用,亲测可行。

(注:显卡是AMD的,2G显存,没啥用)

开始

1. 安装好miniconda

后在工作目录下将软件源码下载下来:
 

git clone git@github.com:RVC-Boss/GPT-SoVITS.git

2. 进入下载的GPT-SoVITS目录
 

cd GPT-SoVITS

3. 创建虚拟环境并执行脚本
 

conda create -n GPTSoVits python=3.9
conda activate GPTSoVits
bash install.sh

4. 执行过程中可能会出错

注意网络情况。

5. 下载预训练模型

安装成功后,下载预训练模型

从 GPT-SoVITS Models 下载预训练模型,并将它们放置在 GPT_SoVITS\pretrained_models 中。

对于 UVR5(人声/伴奏分离和混响移除,附加),从 UVR5 Weights 下载模型,并将它们放置在 tools/uvr5/uvr5_weights 中。

中国地区用户可以进入以下链接并点击“下载副本”下载以上两个模型:

  • GPT-SoVITS Models

  • UVR5 Weights

对于中文自动语音识别(附加),从 Damo ASR Model, Damo VAD Model, 和 Damo Punc Model 下载模型,并将它们放置在 tools/asr/models 中。

对于英语与日语自动语音识别(附加),从 Faster Whisper Large V3 下载模型,并将它们放置在 tools/asr/models 中。 此外,其他模型可能具有类似效果,但占用更小的磁盘空间。

6. 训练过程中可能会报错

发现nltk报错时,去它的github中下载package里面的tokenkey的东西,解压后连同文件夹一起拷贝到出错里展示的搜索文件夹的目录中,但要注意网络情况。

7. 使用过程中可能出错

解决方法:多尝试几次,笔者就是这样做的。

8.以下是使用全过程

数据集处理

请认真准备数据集!以免后面出现各种报错,和炼出不理想的模型!好的数据集是炼出好的模型的基础!

3.1:使用UVR5处理原音频(如果原音频足够干净可以跳过这步,比如游戏中提取的干声)

3.1.1:方法1:用自带的UVR5处理音频

点击开启UVR5-WebUI稍加等待就会自动弹出图二的网页,如果没有弹出复制http://0.0.0.0:9873到浏览器打开

首先输入音频文件夹路径或者直接选择文件(2选1)

文件夹上面那个地址框就是文件夹路径

如果要复制文件路径就是这样↓

先用HP2模型处理一遍(提取人声),然后将输出的干声音频再用onnx_dereverb最后用DeEcho-Aggressive(去混响),输出格式选wav。输出的文件默认在GPT-SoVITS-beta\GPT-SoVITS-beta\output\uvr5_opt这个文件夹下,建议不要改输出路径,到时候找不到文件谁也帮不了你。处理完的音频(vocal)的是人声,(instrument)是伴奏,(No Reverb)的没混响的,(Reverb)的是混响。(vocal)(No Reverb)才是要用的文件,其他都可以删除。结束后记得到WebUI关闭UVR5节省显存。

如果没有成功输出,报错了。那么推荐使用下面一种方法——UVR5客户端。(✅可能兼容性有问题,但是效果是和UVR5对齐的,不要瞎黑内置工具效果有问题)

报错原因

报错原因一般是音频太短了,导致音频缓冲区爆了。也有一些是因为显卡性能不够的。

3.1.2:方法2:使用UVR5客户端(没有bug,模型更多)

官方下载地址:Releases · TRvlvr/model_repo · GitHub(beta版)

https://github.com/Anjok07/ultimatevocalremovergui/releases(正式版)

macOS和Liunx的使用方法

由于苹果的严格管控应用程序的安全性,您可能需要按照以下步骤打开UVR:

首先,使用终端运行以下命令,允许应用程序从所有来源运行:

sudo spctl --master-disable

其次,运行以下命令来绕过验证:

sudo xattr -rd com.apple.quarantine /Applications/Ultimate\ Vocal\ Remover.app

Linux:嗯?都用Linux了,用Git拉代码自己部署不是难事吧?欸嘿~

为了最好的分离效果教程中使用的是beta版,网盘中的windows安装包是beta版

目前MAC使用beta版要自己拉代码装环境,或者等安装包制作完成

网盘中的安装包是正式版的

警告:安装路径必须为全英文!!!不推荐修改默认安装路径,否则会有权限问题!!!

打开UVR5首先要下载模型,建议下载我打包好的,里面有几乎所有模型,包含vip模型。下载解压后先把Ultimate Vocal Remover根目录的models文件夹删了,再把解压的文件夹直接拖进Ultimate Vocal Remover根目录替换models文件夹

如果觉得模型包太大,也可以自己下载(需要科学上网,且速度很慢,一次只能下一个)。点击左下角的小扳手,打开设置界面,点击第三个下载模型。需要下载的模型有:MDX-Net:model_bs_roformer_ep_317_sdr_12.9755、VR Architecture:UVR-De-Echo-Normal、UVR-De-Echo-Aggressive、UVR-De-Echo-Dereverb、UVR-DeNoise。

如果是A卡或I卡用户需要在第二个设置界面点上Use OpenCL

下载完模型后开始处理音频,select input选择输入文件,select output选择输出文件夹,输出格式选WAV,记得点上GPU Conversion(使用GPU),首先选择MDX-Net类型使用Bs-Roformer-Viperx-1297(目前最好的提取人声的模型,又快又好)提取人声。处理完的音频(vocals)的是人声。然后把人声再输入去混响(下面三选一):VR Architecture:UVR-De-Echo-Normal(轻度混响)、UVR-De-Echo-Aggressive(重度混响)、UVR-De-Echo-Dereverb(变态混响),最后用UVR-DeNoise降噪一下。这套流程弄完会比自带的UVR5在人声提取方面好一点。

3.1.3:方法3:MDX23C(MAC用户暂时用)

因为目前MAC没有UVR5beta版的安装包,要么拉代码自己装,要么只能用5.6正式版

正式版目前最好的模型是MDX23C,流程和4.1.1.1.3.1一样的只是把Bs-Roformer-Viperx-1297换成MDX23C

3.2:切割音频

在切割音频前建议把所有音频拖进音频软件(如au、剪映)调整音量,最大音量调整至-9dB到-6dB,过高的删除

首先输入原音频的文件夹路径(不要有中文),如果刚刚经过了UVR5处理那么就是uvr5_opt这个文件夹。然后建议可以调整的参数有min_length、min_interval和max_sil_kept单位都是ms。min_length根据显存大小调整,显存越小调越小。min_interval根据音频的平均间隔调整,如果音频太密集可以适当调低。max_sil_kept会影响句子的连贯性,不同音频不同调整,不会调的话保持默认。其他参数不建议调整。点击开启语音切割,马上就切割好了。默认输出路径在output/slicer_opt。建议不要改输出路径,到时候找不到文件谁也帮不了你。当然也可以使用其他切分工具切分。

切分完后文件在\GPT-SoVITS-beta\GPT-SoVITS-beta\output\slicer_opt。打开切分文件夹,排序方式选大小,将时长超过 显存数 秒的音频手动切分至 显存数 秒以下。比如显卡是4090 显存是24g,那么就要将超过24秒的音频手动切分至24s以下,音频时长太长的会爆显存。如果语音切割后还是一个文件,那是因为音频太密集了。可以调低min_interval,实在不行用au手动切分。

3.3:音频降噪(如果原音频足够干净可以跳过这步,比如游戏中提取的干声)

在0221版本之后才有这个功能而且不太好用,对音质的破坏很大,谨慎使用。

输入刚才切割完音频的文件夹,默认是output/slicer_opt文件夹。然后点击开启语音降噪。默认输出路径在output/denoise_opt,建议不要改输出路径,到时候找不到文件谁也帮不了你。

3.4:打标

为什么要打标:打标就是给每个音频配上文字,这样才能让AI学习到每个字该怎么读。这里的标指的是标注

这步很简单只要把刚才的切分文件夹输入,如果你音频降噪过,那么默认是output/denoise_opt文件夹,如果你切分了没有降噪,那么默认是output/slicer_opt文件夹。然后选择达摩ASR或者fast whisper。达摩ASR只能用于识别中文,效果也最好。fast whisper可以标注99种语言,是目前最好的英语和日语识别,模型尺寸选large V3,语种选auto自动就好了。然后点开启离线批量ASR就好了,默认输出是output/asr_opt这个路径,建议不要改输出路径,到时候找不到文件谁也帮不了你。ASR需要一些时间,看着控制台有没有报错就好了

如果有字幕的可以用字幕标注,准确多了。内嵌字幕或者外挂字幕都可以,教程使用字幕标注(更准确)

3.5:校对标注(这步比较费时间,如果不追求极致效果可以跳过)

输入标注文件的文件路径,注意是文件路径!不是文件夹路径!示例:D:\GPT-SoVITS-beta\GPT-SoVITS-beta0128\output\asr_opt\slicer_opt.list 注意后面的文件名必须要输进去!打不开就再三检查路径是否正确!必须要有.list的后缀!!!然后开启打标webui

打开后就是SubFix,从左往右从上到下依次意思是:跳转页码、保存修改、合并音频、删除音频、上一页、下一页、分割音频、保存文件、反向选择。每一页修改完都要点一下保存修改(Submit Text),如果没保存就翻页那么会重置文本,在完成退出前要点保存文件(Save File),做任何其他操作前最好先点一下保存修改(Submit Text)。合并音频和分割音频不建议使用,精度非常差,一堆bug。删除音频先要点击要删除的音频右边的yes,再点删除音频(Delete Audio)。删除完后文件夹中的音频不会删除但标注已经删除了,不会加入训练集的。这个SubFix一堆bug,任何操作前都多点两下保存。

4:训练

4.1:输出logs

来到第二个页面

先设置实验名也就是模型名,不要有中文!然后第一个输入的是标注文件路径,注意是文件路径!不是文件夹路径!示例:D:\GPT-SoVITS-beta\GPT-SoVITS-beta0128\output\asr_opt\slicer_opt.list 注意后面的文件名必须要输进去!打不开就再三检查路径是否正确!必须要有.list的后缀!!!第二个输入的是切分音频文件夹路径 示例:G:\GPT-SoVITS\output\slicer_opt。注意复制的路径都不能有引号!!!千万不能有引号!然后点一键三连。

如果是英语或日语的话logs里的3-bert文件夹是空的,是正常的不用管。

4.2:微调训练

首先设置batch_size,sovits训练建议batch_size设置为显存的一半以下,高了会爆显存bs并不是越高越快!batch_size也需要根据数据集大小调整,也并不是严格按照显存数一半来设置,比如6g显存需要设置为1。如果爆显存就调低。当显卡3D占用100%的时候就是bs太高了,使用到了共享显存,速度会慢好几倍

以下是切片长度为10s时实测的不同显存的sovits训练最大batch_size,可以对照这个设置。如果切片更长、数据集更大的话要适当减少。

显存

batch_size

切片长度

6g

1

10s

8g

2

10s

12g

5

10s

16g

8

10s

22g

12

10s

24g

14

10s

32g

18

10s

40g

24

10s

80g

48

10s

在0213版本之后添加了dpo训练。dpo大幅提升了模型的效果,几乎不会吞字和复读,能够推理的字数也翻了几倍,但同时训练时显存占用多了2倍多,训练速度慢了4倍,12g以下显卡无法训练。数据集质量要求也高了很多。如果数据集有杂音,有混响,音质差,不校对标注,那么会有负面效果

如果你的显卡大于12g,且数据集质量较好,且愿意等待漫长的训练时间,那么可以开启dpo训练。否则请不要开启。下面是切片长度为10s时实测的不同显存的gpt训练最大batch_size。如果切片更长、数据集更大的话要适当减少。

显存

未开启dpo batch_size

开启dpo batch_size

切片长度

6g

1

无法训练

10s

8g

2

无法训练

10s

12g

4

1

10s

16g

7

1

10s

22g

10

4

10s

24g

11

6

10s

32g

16

6

10s

40g

21

8

10s

80g

44

18

10s

接着设置轮数,SoVITS模型轮数可以设置的高一点,反正训练的很快。GPT模型轮数千万不能高于20(一般情况下)建议设置10。然后先点开启SoVITS训练,训练完后再点开启GPT训练,不可以一起训练(除非你有两张卡)!如果中途中断了,直接再点开始训练就好了,会从最近的保存点开始训练。

训练的时候请ctrl+shift+esc打开任务管理器看,下拉打开选项,选择cuda。如果cuda占用为0那么就不在训练。专用GPU内存就是显存,其他的内存都是共享的,并不是真正的显存。爆显存了就调低bs。或者存在过长的音频,需要回到2.2步重新制作数据集。

win11没有cuda打开设置--系统--显示--显示卡--默认图形设置

关闭硬件加速GPU计划,并重启电脑

训练完成会显示训练完成,并且控制台显示的轮数停在设置的(总轮数-1)的轮数上。

看cuda占用需要下拉选择cuda,如果win11找不到cuda界面需要关闭硬件加速GPU计划并重启

关于学习率权重:

可以调低但不建议调高。直接听对比,自己听效果

关于高训练轮数:你可能会看见有人会说训练了几百轮,几千轮的(几万轮那就是搞错了轮数和步数)。但高轮数并不就是好。如果要训练高轮数请先保证数据集质量极好,标注全都经过手动校对,时长至少超过1小时才有必要拉高轮数。否则默认的十几轮效果已经很好了。

关于数据集长度:

请先保证质量!音频千万不能有杂音,要口齿清晰,响度统一,没有混响,每句话尽量完整,全部手动校对标注。30分钟内有明显提升,不建议再增加数据集长度(除非你有一堆4090)

模型怎样才算训练好了?

这是一个非常无聊且没有意义的问题。就好比上来就问老师我家孩子怎么才能学习好,谁都无法回答。

模型的训练关联于你的数据集质量、时长,轮数,甚至一些超自然的玄学因素;即便你有一个成品模型,最终的转换效果也要取决于你的参考音频以及推理参数。这不是一个线性的的过程,之间的变量实在是太多,所以你非得问“为什么我的模型出来不像啊”、“模型怎样才算训练好了”这样的问题。

但也不是一点办法没有,只能烧香拜佛了。我不否认烧香拜佛当然是一个有效的手段,但你也可以借助一些科学的工具,例如 Tensorboard 等,但还是戴上耳机,让你的耳朵告诉你吧。用耳朵听就是最科学的方式。

如果你的模型一直很差,那你该好好反思反思为什么不好好准备数据集了。


博主 政安晨 注:

在使用过程中有时会看到提示:


IMPORTANT: You are using gradio version 3.38.0, however version 4.29.0 is available, please upgrade.

放心更新它。

还是在conda环境中执行:

 pip show gradio

查看版本确实较旧时,执行:
 

pip install --upgrade gradio

表示更新到最新版本

另外,pip install gradio==<version>将“版本”替换为您要安装的 Gradio 版本。“<”和“>”是不需要的。

当然,如果更新之后,发现webui跑不起来,你由不愿意详细检查问题的话,就用上述命令更换回原来的版本。


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

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

相关文章

JavaEE技术之MySql主从复制及mycat[了解,不讲]

文章目录 1. 主从复制1.1. 主从同步的原理1.2. 检查数据库远程访问权限1.3. 主从配置1.3.1. master配置1.3.2. slave配置1.3.3. 主库创建同步用户1.3.4. 从库配置主从关系1.3.5. 重置主从关系 1.4. 测试主从复制 2. Mycat2.1. Mycat简介2.2. MyCat读写分离原理2.3. 不废话&…

代码随想录day63 | 单调栈P3 | ● 84.

84.柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&a…

docker部署minio和业务服务因变更minio密码导致访问不到图片的问题

问题起因 业务application和minio都是docker部署。按部署规则minio的环境变量中设置了MINIO_ROOT_USER和MINIO_ROOT_PASSWORD。这样就可以用这套用户名密码登录minio了。而我的application中是通过api访问minio获取资源URL&#xff0c;提供给前端的。所以在application的环境变…

苹果电脑MAC清理系统空间工具CleanMyMacX4.15.3中文版下载

苹果电脑以其出色的性能、优雅的设计和高效的操作系统而受到许多用户的喜爱。然而&#xff0c;随着时间的推移和使用量的增加&#xff0c;你可能会发现你的Mac开始变得缓慢和响应迟缓。这通常是因为硬盘空间被大量占用&#xff0c;影响了系统的整体性能。幸运的是&#xff0c;有…

qt: undefined reference to `vtable for aaa‘

版本qt4.8.6&#xff0c;编译报错“main.cpp:(.text0x3b): undefined reference to vtable for aaa” 就一个main.cpp #include <QApplication> #include <QTimer> #include <QCursor> #include <QMouseEvent> #include <QDesktopWidget> #inc…

【VMware】vSphere 8.0 安装和设置简介

本信息的目标读者为熟悉虚拟机技术和数据中心操作并具有丰富经验的 Windows 或 Linux 系统管理员。 vSphere 8.0 提供了各种安装和设置选项&#xff0c;这些选项定义了相应的任务序列。 vSphere 的两个核心组件是 ESXi 和 vCenter Server。ESXi 是可用于创建和运行虚拟机和虚拟…

租用便宜的香港云服务器?可以关注这几点

租用便宜的香港云服务器&#xff0c;要关注服务商、配置以及提供的服务水平协议&#xff08;SLA&#xff09;。一般来说&#xff0c;基础型的香港云服务器月付价格可以从几十到几百元不等。但请注意&#xff0c;非常低廉的价格可能会牺牲服务器的性能、可靠性以及技术支持。 对…

判断字符是否唯一——力扣

面试题 01.01. 判定字符是否唯一 已解答 简单 相关标签 相关企业 提示 实现一个算法&#xff0c;确定一个字符串 s 的所有字符是否全都不同。 示例 1&#xff1a; 输入: s "leetcode" 输出: false 示例 2&#xff1a; 输入: s "abc" 输出: true…

在k8s中部署Prometheus并实现对k8s集群的监控

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Prometheus&#xff1a;监控的神》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、k8s简介 2、 Prometheus概述 二、准备k8s环境 1、…

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024)

2024年生物医学、医学图像与信号处理国际会议(ICBMISP2024) 会议简介 2024年国际生物医学、医学成像和信号处理会议&#xff08;ICBMISP2024&#xff09;很高兴邀请您提交主题为“生物医学、医学图像和信号处理的当前挑战和未来前景”的原稿。通过ICBMISP2024&#xff0c;生物…

idea-自我常见配置

1. 主题配置 2. 显示方法分隔符 Editor->General->Appearance 3. 忽略大小写提示 Editor->General->Code Completion 4. 自动导包 Editor->general->Auto Import 5. 取消单行显示Tabs Editor->General->Editor Tabs 效果如下图&#xff1a; 6. 设置…

HarmonyOS NEXT星河版之美团外卖点餐功能实战(下)

文章目录 一、购物车逻辑1.1 购物车及加减菜1.2 菜品的加减---方案一1.3 菜品的加减---方案二1.4 购物车View完善1.5 清空购物车1.5 购物车数量和价格 二、小结 一、购物车逻辑 1.1 购物车及加减菜 在utils目录下新建CartStore.ets文件&#xff0c;如下&#xff1a; import …

Vue3的CRUD模版(附Demo)

目录 前言模版 前言 用惯Vue2之后&#xff0c;在碰Vue3后&#xff0c;整体还是有所区别 此文主要做一个回顾总结 假设界面如下&#xff1a; 可CRUD&#xff0c;对应的新增 添加一些必选项&#xff1a; 其中数据库的设计如下&#xff1a; 模版 对应需要注意参数位置、初始…

(41)5.6-5.8数据结构(栈和队列的应用和数组)

1.栈在括号匹配中的应用 #define _CRT_SECURE_NO_WARNINGS #define MaxSize 10 typedef struct { char data[MaxSize];//静态数组存放栈中元素 int top; //栈顶指针 }SqStack;//初始化栈 void InitStack(SqStack& S);//判断栈是否为空 bool StackEmpty(SqStack S…

Feign 第一次调用为什么会很慢?

feign调用的大致过程&#xff1f; Feign进行远程调用的&#xff0c;这里面包括&#xff0c;注册中心、负载均衡、FeignClient之间的关系&#xff0c;微服务通过不论是eureka、nacos也好注册到服务端&#xff0c;Feign是靠Ribbon做负载的&#xff0c;而Ribbon需要拿到注册中心的…

从零开始构建现代深度学习框架:数据支持、网站链接与代码步骤

文章目录 一、数据支持二、网站链接三、代码步骤1. 导入必要的库和模块2. 加载和预处理数据&#xff08;以MNIST为例&#xff09;3. 定义模型结构4. 编译模型5. 训练模型6. 评估模型 一、数据支持 在构建深度学习框架的过程中&#xff0c;数据是不可或缺的。以下是一些可能用到…

android进阶-Binder

参考&#xff1a;Android——Binder机制-CSDN博客 机制&#xff1a;Binder是一种进程间通信的机制 驱动&#xff1a;Binder是一个虚拟物理设备驱动 应用层&#xff1a;Binder是一个能发起进程间通信的JAVA类 Binder相对于传统的Socket方式&#xff0c;更加高效Binder数据拷贝…

豆芽机置入语音芯片WTN6040-8S:开启智能生活新篇章,让豆芽制作更便捷有趣

豆芽机的开发背景&#xff1a; 豆芽作为一种营养丰富、味道鲜美的食品&#xff0c;深受广大消费者的喜爱。然而&#xff0c;传统的豆芽生产过程繁琐&#xff0c;需要耗费大量的时间和人力&#xff0c;且存在生产效率低、质量不稳定等问题。随着人们生活节奏的加快和对健康饮食的…

DataLab-数据分析的Ai辅助工具

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09;DataLab是一个由DataCamp提供的强大在线数据分析平台&#xff0c;它通过AI技术简化了数据处理流程&#xff0c;使得用户无需编程或数据分析的高级技能即可快速获取数据洞察。它支持多种数据源&#xff0c;包…

C++多态实现原理详解

阅读引言&#xff1a; 我想象了一下&#xff0c; 假如人有突然问我什么是多态&#xff0c; 我该如何给别人说清楚呢&#xff1f;所以写下这篇文章&#xff0c; 希望大家看完有所收获。 ①. 开胃小菜 先看这样一个开胃小菜 这里我有点小小的疑惑&#xff0c; 大小为啥是1。 在C…