Pocket TTS 实战指南:在纯 CPU 上部署轻量级语音合成、声音克隆与流式生成
Pocket TTS 是 Kyutai 推出的轻量级文本转语音(TTS)应用,核心设计目标是在纯 CPU 上高效运行,只需一次 pip install 加一次函数调用即可生成音频,无需 GPU、无需 Web API。本文以仓库首页 docs/index.md 为主体骨架,结合 CLI 命令文档、Python API 文档 与 CLI 入口源码、TTSModel 实现 等仓库证据,系统讲解从安装、命令行生成、本地服务部署到 Python 库集成的完整实战路径,以及声音克隆、模型量化、GPU 迁移等进阶用法,读完即可在你的机器上直接跑通一套本地语音合成服务。
项目概览:专为 CPU 设计的轻量级 TTS
Pocket TTS 是一个"轻到能装进口袋"的 TTS 模型,项目口号是 "A TTS that fits in your CPU (and pocket)"。它的核心定位与特性(摘自 docs/index.md 的 Main takeaways)包括:
- 纯 CPU 运行:不需要 GPU 版本的 PyTorch,也不需要 CUDA 环境;
- 模型极小:约 100M 参数;
- 支持音频流式输出:边生成边返回音频块;
- 低延迟:约 200ms 即可拿到第一段音频;
- 快于实时:在 MacBook Air M4 的 CPU 上约 6x 实时速度;
- 资源占用少:仅使用 2 个 CPU 核心(源码 tts_model.py 中
torch.set_num_threads(1)即限制了线程数,配合流式解码线程整体控制在极低核数); - 同时提供 Python API 与 CLI;
- 内置声音克隆(voice cloning):输入一段音频即可克隆音色;
- 多语言支持:英语、法语、德语、葡萄牙语、意大利语、西班牙语;
- 可处理超长文本:通过分句与分块流式生成,理论上可处理任意长度输入;
- 可运行在浏览器端(社区 WebAssembly/JS 实现)。
环境要求方面,项目支持 Python 3.10 至 3.14,要求 PyTorch 2.5+,且不需要 GPU 版 PyTorch。仓库内 pyproject.toml 中定义了完整的依赖与打包信息,官方还提供了 Dockerfile 与 docker-compose.yaml 便于容器化部署。
安装与环境准备
Pocket TTS 以 PyPI 包 pocket-tts 形式发布,推荐使用 uv 工具链,它会在隔离环境中按需安装依赖;也可以用传统 pip 安装。
# pip 安装
pip install pocket-tts
# 或使用 uv
uv add pocket-tts
安装完成后,可以直接用 uvx 运行 CLI 而无需显式安装:
uvx pocket-tts generate
Linux 下的 CPU-only 安装(避免拉取 CUDA 依赖)
官方文档特别强调:在 Linux 上,PyPI 默认提供的是 PyTorch 的 CUDA 构建版本,因此直接 pip install pocket-tts 会一并下载 nvidia-* 系列 CUDA 运行时包——即使 Pocket TTS 本身只在 CPU 上运行。这会让安装体积增加数 GB(以 torch 2.13 为例,约 3 GB 而非 200 MB)。解决方案是从 PyTorch 的 CPU 专属索引安装:
pip install pocket-tts --extra-index-url https://download.pytorch.org/whl/cpu
不安装而直接跑 CLI 时,把同一索引传给 uvx:
uvx --index https://download.pytorch.org/whl/cpu pocket-tts generate
使用 uv 管理项目时,可以在 pyproject.toml 中显式声明 CPU 索引:
[[tool.uv.index]]
name = "pytorch-cpu"
url = "https://download.pytorch.org/whl/cpu"
explicit = true
[tool.uv.sources]
torch = [{ index = "pytorch-cpu" }]
macOS 与 Windows 无需上述配置,因为这两个平台默认的 PyTorch wheel 本身就是 CPU-only 的。
CLI 实战一:generate 命令——单次文本转语音
generate 命令从命令行直接将文本合成为 WAV 文件,并打印速度统计信息。它也是 CLI 入口源码 中第一个核心命令。
uvx pocket-tts generate
# 或 pip 手动安装后:
pocket-tts generate
不带任何参数时,它会用默认文本与默认音色生成 ./tts_output.wav。默认文本为 "Hello world! I am Kyutai Pocket TTS. I'm fast enough to run on small CPUs. I hope you'll like me."(定义于 default_parameters.py)。
核心参数
| 参数 | 说明 | 默认值 |
|---|---|---|
--text TEXT |
要合成的文本;传 - 可从标准输入读取 |
内置默认文本 |
--voice VOICE |
声音条件文件(要克隆的音色),支持内置音色名、本地 wav 路径、.safetensors 路径、http(s):// URL、hf:// 路径 |
按语言选内置音色 |
--output-path PATH |
输出音频路径 | ./tts_output.wav |
--language LANG |
选择预训练语言模型,与 --config 互斥 |
english |
--config PATH |
自定义 config YAML,支持本地路径、https:// URL、hf:// 路径,与 --language 互斥 |
无 |
--sampler-decode-steps N |
采样解码步数,越大质量越高、速度越慢 | 1 |
--temperature T |
采样温度;不传时取配置中模型推荐值(英语模型 0.3,其余 0.7) | None |
--noise-clamp V |
噪声采样最大值 | None |
--eos-threshold V |
EOS(句尾标记)判定阈值,调小会提前结束 | -4.0 |
--frames-after-eos N |
EOS 之后额外生成的帧数,每帧约 80ms | None(按文本长度自动计算) |
--device DEV |
运行设备 | cpu |
--quantize |
启用 int8 动态量化,降低内存占用并可能提速 | False |
-q / --quiet |
关闭日志输出 | False |
其中 --language 的合法取值(与 generate 文档 一致)为:english_2026-01、english_2026-04、english、french_24l、german、german_24l、portuguese、portuguese_24l、italian、italian_24l、spanish、spanish_24l。其中 english 与 english_2026-04 是同一个模型;24l 后缀是未蒸馏的更大模型,质量更高但更慢,官方注明目前仅作为预览。这些取值对应 config 目录 下同名的 YAML 配置文件。
常用示例
# 自定义文本
pocket-tts generate --text "Hello, this is a custom message."
# 指定输出路径
pocket-tts generate --text "自定义消息" --output-path "./my_audio.wav"
# 使用本地音频文件克隆音色
pocket-tts generate --voice "./my_voice.wav"
# 使用 export-voice 导出的 safetensors 音色(加载更快)
pocket-tts generate --voice "./my_voice.safetensors"
# 更高音质(更多解码步数 + 调整温度)
pocket-tts generate --sampler-decode-steps 5 --temperature 0.5
# 更富表现力(更高温度)
pocket-tts generate --temperature 1.0
# 调小 EOS 阈值让句子更早结束
pocket-tts generate --eos-threshold -3.0
内置音色目录
--voice 支持一组内置音色名称(基于官方发布权重预计算的嵌入,各语言均有对应)。常用音色包括:
- 英语(en):alba、anna、azelma、bill_boerst、caro_davy、charles、cosette、eponine、eve、fantine、george、jane、jean、javert、marius、mary、michael、paul、peter_yearsley、stuart_bell、vera
- 意大利语(it):giovanni
- 西班牙语(es):lola
- 德语(de):juergen
- 葡萄牙语(pt):rafael
- 法语(fr):estelle
各语言的默认音色在源码 default_parameters.py 中定义:意大利语默认 giovanni、西班牙语默认 lola、德语默认 juergen、葡萄牙语默认 rafael、法语默认 estelle,其余语言默认 alba。需要注意的是,这些预计算嵌入只对官方发布权重有效,因此在使用 --config 或 --checkpoint 指定自定义/社区模型时,--voice 默认回退到 alba 的原始音频文件(任何模型都能对其克隆)。
输出格式
generate 命令始终输出标准 WAV 文件:24kHz 采样率、单声道、16-bit PCM。这也是 english.yaml 中 mimi.sample_rate: 24000 与源码 scipy.io.wavfile.write 调用所确认的事实。
CLI 实战二:serve 命令——本地 HTTP 语音服务
serve 命令启动一个基于 FastAPI 的本地 Web 服务,同时提供浏览器界面与 HTTP API。因为模型常驻内存,多次请求之间无需重复加载,比命令行方式更适合快速尝试多种音色和文本(源码见 main.py)。
uvx pocket-tts serve
# 或
pocket-tts serve
启动后访问 http://localhost:8000 即可使用 Web 界面。
参数说明
| 参数 | 说明 | 默认值 |
|---|---|---|
--host HOST |
绑定主机 | localhost |
--port PORT |
绑定端口 | 8000 |
--reload |
开发模式自动重载 | False |
--language LANG |
语言模型,与 --config 互斥 |
english |
--config PATH |
自定义 config YAML,与 --language 互斥 |
无 |
--default-voice VOICE |
请求未指定音色时使用的音色;接受内置音色名、本地音频/.safetensors 路径、http(s):// 或 hf:// 路径;启动时即加载,加载失败会直接导致服务启动失败 |
语言内置音色 |
--quantize |
int8 量化 | False |
# 自定义端口
pocket-tts serve --host "localhost" --port 8080
# 选择法语 24 层模型
pocket-tts serve --language french_24l
# 自定义默认音色(本地音频、safetensors、URL、内置音色名均可)
pocket-tts serve --default-voice "./my_voice.wav"
pocket-tts serve --default-voice "./my_voice.safetensors"
pocket-tts serve --default-voice "hf://kyutai/tts-voices/alba-mackenna/casual.wav"
pocket-tts serve --default-voice "marius"
HTTP API 端点
从 main.py 的源码可以看到,服务暴露以下端点:
GET /:返回 Web 前端页面(static/index.html);GET /health:健康检查,返回{"status": "healthy"};POST /tts:核心合成接口,表单字段包括:text(必填):要合成的文本;voice_url(可选):内置音色名或http://、https://、hf://开头的音色地址,与voice_wav互斥;voice_wav(可选):上传的音色音频文件。
响应为 audio/wav 类型的流式音频(StreamingResponse,使用 Transfer-Encoding: chunked),音频由 generate_audio_stream() 实时流式写入,这正是 Web 端能边生成边播放的原因。
CLI 实战三:export-voice 命令——把音频预转为声音嵌入
声音克隆的关键洞察是:处理一段音频文件(如 wav/mp3)来提取音色是相对较慢的操作,而加载一个 safetensors 文件(本质是已经算好的音色 KV 缓存)则非常快。export-voice 命令负责把音频文件一次性转换为 safetensors 格式的声音嵌入,之后每次生成语音时直接加载即可(文档见 export_voice.md)。
uvx pocket-tts export-voice audio-path export-path
# 或
pocket-tts export-voice audio-path export-path
参数说明
audio-path(必填):要转换的音频文件路径,支持 wav、mp3 等常见格式,也支持http:或hf:远程地址;处理时只取音频前 30 秒;export-path(必填):输出 safetensors 文件路径;--quiet:除错误外不打印输出;--language/--config:与generate语义一致,二者互斥。
# 导出本地音频
pocket-tts export-voice voice_memo127762.mp3 jack.safetensors
# 导出在线音频
pocket-tts export-voice https://huggingface.co/kyutai/tts-voices/resolve/main/alba-mackenna/announcer.wav ./announcer.safetensors
# 直接用导出的 safetensors 生成语音
pocket-tts generate --text "Hello, welcome to today's game between the Bears and Cubs." --voice announcer.safetensors
从源码看,export_voice 的实现是先加载模型,再以 truncate=True 调用 get_state_for_audio_prompt() 提取状态,最后写入 safetensors(main.py)。
将 Pocket TTS 集成进 Python 应用
除了命令行,Pocket TTS 提供完整的 Python API,核心类是 TTSModel(tts_model.py),通过 pocket_tts/init.py 导出 TTSModel 与 export_model_state。典型用法:
from pocket_tts import TTSModel
import scipy.io.wavfile
# 加载模型(首次会下载权重)
tts_model = TTSModel.load_model()
# 从音频提示提取音色状态(可传内置音色名、本地文件、hf:// 或 http(s):// 地址)
voice_state = tts_model.get_state_for_audio_prompt("alba")
# 生成音频,返回 1D 的 torch Tensor(PCM 数据)
audio = tts_model.generate_audio(voice_state, "Hello world, this is a test.")
# 保存为 WAV(24kHz)
scipy.io.wavfile.write("output.wav", tts_model.sample_rate, audio.numpy())
TTSModel.load_model() 参数
model = TTSModel.load_model(
language=None, # 内置语言配置名;与 config 互斥,缺省为 english
config=None, # 自定义 config YAML 路径(本地/https://hf://)
temp=None, # 采样温度;None 时取配置推荐值(英语 0.3,其余 0.7)
sampler_decode_steps=1, # 采样解码步数
noise_clamp=None, # 噪声采样最大值
eos_threshold=-4.0, # EOS 判定阈值
quantize=False, # 是否启用 int8 动态量化
)
常用属性与方法
属性
model.device:当前设备(cpu或cuda);model.sample_rate:输出音频采样率,通常为 24000 Hz。
get_state_for_audio_prompt(audio_conditioning, truncate=False)
从音频文件/URL 提取声音克隆状态,或直接从 .safetensors 加载状态。audio_conditioning 可以是路径(Path/str)、URL 或 torch.Tensor。
# 从 Hugging Face 地址加载
voice_state = model.get_state_for_audio_prompt("hf://kyutai/tts-voices/alba-mackenna/casual.wav")
# 从本地音频加载
voice_state = model.get_state_for_audio_prompt("./my_voice.wav")
# 从 safetensors 快速加载
voice_state = model.get_state_for_audio_prompt("./my_voice.safetensors")
generate_audio(model_state, text_to_generate, frames_after_eos=None, copy_state=True)
根据文本一次性生成完整音频张量,返回形状为 [samples] 的 1D Tensor。
generate_audio_stream(...)
流式生成音频块,适合超长文本与实时播放场景,serve 命令的流式输出正是基于此方法:
for chunk in model.generate_audio_stream(voice_state, "Long text content..."):
# 每个 chunk 都是 [samples] 形状的 Tensor,可边生成边播放或写盘
print(f"Generated chunk: {chunk.shape[0]} samples")
声音状态与 safetensors 导出
load_model() 与 get_state_for_audio_prompt() 都是相对较慢的操作(前者要下载权重、后者要跑一遍音频编码),因此文档建议在内存中复用模型与音色状态。如果需要多个音色频繁切换,可以预加载多个 voice state:
voices = {
"casual": model.get_state_for_audio_prompt("hf://kyutai/tts-voices/alba-mackenna/casual.wav"),
"funny": model.get_state_for_audio_prompt("https://huggingface.co/kyutai/tts-voices/resolve/main/expresso/ex01-ex02_default_001_channel1_168s.wav"),
}
audio_a = model.generate_audio(voices["casual"], "Hey there!")
audio_b = model.generate_audio(voices["funny"], "Good morning.")
把音色状态导出为 safetensors 文件,之后加载只需读盘、无需任何 PyTorch 计算,速度极快:
from pocket_tts import TTSModel, export_model_state
model = TTSModel.load_model()
model_state = model.get_state_for_audio_prompt("some_voice.wav")
export_model_state(model_state, "./some_voice.safetensors")
# 之后快速加载
model_state_copy = model.get_state_for_audio_prompt("./some_voice.safetensors")
audio = model.generate_audio(model_state_copy, "Hello world!")
批量处理
复用同一音色状态批量生成多条文本,然后拼接成一个音频文件(Python API 文档 提供了完整示例):
import torch
texts = ["First sentence to generate.", "Second sentence.", "Third sentence."]
audios = [model.generate_audio(voice_state, text) for text in texts]
full_audio = torch.cat(audios, dim=0)
scipy.io.wavfile.write("batch_output.wav", model.sample_rate, full_audio.numpy())
自定义模型配置(config YAML)
--config / config= 参数允许加载自定义权重配置,接受三种来源:本地 YAML 路径、https:// URL、hf:// 路径(格式为 hf://<repo_id>/<path><a href="https://link.gitcode.com/i/5cd35c8c126ae9181c60f9f7e5b5ef8f" target="_blank">@revision])。仓库 [pocket_tts/config/ 内置了各语言对应的 YAML,以 english.yaml 为例,其核心结构为:
weights_path: hf://kyutai/pocket-tts/languages/english/model.safetensors@<commit>
weights_path_without_voice_cloning: hf://kyutai/pocket-tts-without-voice-cloning/languages/english/model.safetensors@<commit>
default_temperature: 0.3
flow_lm:
insert_bos_before_voice: true
dtype: float32
flow:
depth: 6
dim: 512
transformer:
d_model: 1024
hidden_scale: 4
max_period: 10000
num_heads: 16
num_layers: 6
lookup_table:
dim: 1024
n_bins: 4000
tokenizer: sentencepiece
tokenizer_path: hf://kyutai/pocket-tts-without-voice-cloning/languages/english/tokenizer.model@<commit>
mimi:
dtype: float32
sample_rate: 24000
frame_rate: 12.5
seanet: {...}
transformer: {...}
quantizer: {...}
自定义配置时,复制一份内置 YAML,修改其中的 weights_path、weights_path_without_voice_cloning 与 tokenizer_path 指向你想加载的模型即可,然后:
pocket-tts generate --config "./my_config.yaml"
pocket-tts serve --config "hf://user/repo/config_file.yaml@commit_hash"
从源码看,配置由 utils/config.py 中的 load_config 解析,权重加载逻辑位于 utils/weights_loading.py(区分带/不带声音克隆的两套权重)。
在 GPU 上运行(非官方支持)
Pocket TTS 面向 CPU 设计,在单线程性能强劲的硬件(如 Apple Silicon)上未观察到 GPU 加速收益——这是因为推理 batch size 为 1 且模型很小。但这与硬件相关:官方在云 x86 虚拟机(4 vCPU + Tesla T4)上实测,将模型移到 GPU 后获得约 2.6x 的持续加速(CPU 上 RTF 约 2.3–2.5x,GPU 上约 6.28x,长短文本结论一致)。如果你的 CPU 线程受限或弱于现代笔记本芯片,值得尝试 GPU。
由于 TTSModel 是普通 nn.Module,可以自行移动设备(注意 load_model() 没有 device 参数,官方不支持但可行):
tts_model = TTSModel.load_model()
tts_model.to("cuda")
audio = tts_model.generate_audio(voice_state, "Hello world, this is a test.")
# generate_audio() 返回与模型同设备的张量,GPU 上需先移回 CPU 再调 .numpy()
scipy.io.wavfile.write("output.wav", tts_model.sample_rate, audio.detach().cpu().numpy())
需要注意的边界:
generate命令有--device选项(默认cpu);serve命令与 Docker 镜像不暴露设备选项,始终运行在 CPU;pip install pocket-tts会装当前 PyPI 上的 torch 构建,其 CUDA 版本可能高于驱动支持版本,此时torch.cuda.is_available()会静默返回False(只有一条 UserWarning)。如遇此情况,请显式安装与驱动匹配的 torch,例如pip install torch --index-url https://download.pytorch.org/whl/cu121;quantize=True(int8 动态量化)只在 CPU 上有效,模型移到 CUDA 后会抛出NotImplementedError: Could not run 'quantized::linear_dynamic' ... 'CUDA' backend(量化实现见 quantization.py);- 可选的
torchao量化后端(pip install pocket-tts[quantize])声明了torch>=2.11,若你为适配旧驱动而锁定了较旧 torch,需注意torchao与锁定 torch 版本的兼容性。
使用社区训练的模型
任何社区训练好的模型,只要提供一个 YAML 配置文件,就能通过 --config 直接使用(见 docs/index.md 的 "Models trained by the community" 一节)。--config 支持 https://、hf:// 或本地路径:
uvx pocket-tts generate \
--config hf://user/repo/config_file.yaml@commit_hash \
--text "Hello from a community model"
官方建议在 URL 中嵌入 commit hash 以规避模型作者后续的破坏性变更,例如:
uvx pocket-tts generate \
--config hf://user/repo/config_file.yaml@891886a61a1ed45fd429a0a63bd96181e6cff637
需要特别说明的是:内置音色是使用官方发布权重预计算的嵌入,不适用于社区模型。使用 --config 时 --voice 默认回退到 alba 的原始音频文件(任何模型都可对其克隆),你也可以传入自己的音频文件指定其他音色。仓库内置的 english_2026-04.yaml 等即标准官方配置示例。
架构与源码原理:flow_lm + Mimi 的双模块生成
深入源码可以理解 Pocket TTS 为何能如此轻量。模型由两个核心模块组成(见 tts_model.py 与 models/ 目录):
FlowLMModel(flow_lm.py):一个自回归"语言模型",负责根据文本条件与音频条件逐帧生成音频潜在变量(对应架构图中的 "calm model (flow_lm in the codebase)",绿色部分);- Mimi VAE 编解码器(mimi.py):将音频波形编码为潜在变量(
Mimi vae encoding),并将生成的音频潜在变量解码回 80ms 粒度的音频波形(Mimi vae decoding)。
生成流程(与 model_arch.png 一致):文本经分词/嵌入得到文本条件潜在变量,参考音频经 Mimi 编码得到音频条件潜在变量,二者共同引导 flow_lm 自回归生成音频潜在变量,最后由 Mimi 解码器还原为 PCM 音频。
超长文本的支持来自分句与流式机制:源码 text_chunking.py 实现了 split_into_best_sentences 分句与 prepare_text_prompt 文本预处理,配合 generate_audio_stream() 逐块生成、stream_audio_chunks(data/audio.py)流式写盘,因此无论输入多长都不会一次性消耗完内存。架构图中每个音频帧为 80ms,与 --frames-after-eos 的参数单位一致。
此外,模型内部大量使用 StatefulModule(modules/stateful_module.py)管理 KV 缓存状态——这也是"音色状态"(voice state)本质上就是一段 KV 缓存的原因:export-voice 导出的 safetensors 实际就是预先算好的缓存,加载时无需重新计算。
在浏览器与其他生态中运行
由于模型足够小(约 100M 参数),社区实现了多种浏览器端/跨语言移植方案,官方在 docs/index.md 中列出的方向包括:基于 Rust + XN 的 WebAssembly 移植、ONNX Runtime Web 导出、Candle(Rust)版本、jax-js 网页版,以及 MLX(Apple Silicon)、C++(ONNX Runtime 单文件)、C#(TorchSharp)、LiteRT(Android GPU)等替代实现。这些均为社区项目,官方尚未正式支持浏览器端运行。
使用注意与合规边界
官方在 docs/index.md 中明确声明:模型使用必须遵守所有适用法律法规,禁止未经明确合法同意的人声模仿或克隆、禁止制造虚假信息或欺骗内容(包括伪造真实人物/事件的录音)、禁止生成非法、有害、诽谤、骚扰、歧视、仇恨或侵犯隐私的内容。语音合成与声音克隆属于敏感能力,落地到产品前务必评估合规风险。
进一步阅读
- 命令行详细文档:generate、serve、export_voice
- Python API 文档 与 TTSModel API 参考
- 模型源码:TTSModel、FlowLMModel、Mimi
- CLI 实现源码:pocket_tts/main.py
- 语言配置示例:english.yaml
- 量化说明:docs/quantization.md,量化实现:pocket_tts/quantization.py
- 官方提供 pocket-tts-example.ipynb 可交互式体验 Python API,以及 scripts/generate_default_voices.py 等脚本可参考其调用方式
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.26 K641- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python870
SlideSCIPPT插件,支持素材库、AI助手、一键添加图片标题,复制粘贴位置、一键图片对齐、一键插入Markdown(加粗、超链接等行内样式、代码块、LaTeX等块级样式)、便捷导出图片!C#611
Agent-Reach给你的 AI Agent 一键装上互联网能力。13 个平台(网页/GitHub/YouTube/小红书/B站/Twitter/Reddit 等)多后端路由,当下最稳的接入方式替你选好、装好、体检好。GitHub 主仓库同步镜像。Python1284
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go23245
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java37451
