首页
/ Pocket TTS 实战指南:在纯 CPU 上部署轻量级语音合成、声音克隆与流式生成

Pocket TTS 实战指南:在纯 CPU 上部署轻量级语音合成、声音克隆与流式生成

2026-09-15 20:09:13作者:蔡丛锟

Pocket TTS 是 Kyutai 推出的轻量级文本转语音(TTS)应用,核心设计目标是在纯 CPU 上高效运行,只需一次 pip install 加一次函数调用即可生成音频,无需 GPU、无需 Web API。本文以仓库首页 docs/index.md 为主体骨架,结合 CLI 命令文档Python API 文档CLI 入口源码TTSModel 实现 等仓库证据,系统讲解从安装、命令行生成、本地服务部署到 Python 库集成的完整实战路径,以及声音克隆、模型量化、GPU 迁移等进阶用法,读完即可在你的机器上直接跑通一套本地语音合成服务。

Pocket TTS 模型架构图:文本与音频经编码得到条件潜在变量,由 flow_lm 自回归生成音频潜在变量,再经 Mimi VAE 解码为 80ms 音频块

项目概览:专为 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.pytorch.set_num_threads(1) 即限制了线程数,配合流式解码线程整体控制在极低核数);
  • 同时提供 Python API 与 CLI
  • 内置声音克隆(voice cloning):输入一段音频即可克隆音色;
  • 多语言支持:英语、法语、德语、葡萄牙语、意大利语、西班牙语;
  • 可处理超长文本:通过分句与分块流式生成,理论上可处理任意长度输入;
  • 可运行在浏览器端(社区 WebAssembly/JS 实现)。

环境要求方面,项目支持 Python 3.10 至 3.14,要求 PyTorch 2.5+,且不需要 GPU 版 PyTorch。仓库内 pyproject.toml 中定义了完整的依赖与打包信息,官方还提供了 Dockerfiledocker-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-01english_2026-04englishfrench_24lgermangerman_24lportugueseportuguese_24litalianitalian_24lspanishspanish_24l。其中 englishenglish_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.yamlmimi.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,核心类是 TTSModeltts_model.py),通过 pocket_tts/init.py 导出 TTSModelexport_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:当前设备(cpucuda);
  • 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_pathweights_path_without_voice_cloningtokenizer_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.pymodels/ 目录):

  1. FlowLMModelflow_lm.py:一个自回归"语言模型",负责根据文本条件与音频条件逐帧生成音频潜在变量(对应架构图中的 "calm model (flow_lm in the codebase)",绿色部分);
  2. 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_chunksdata/audio.py)流式写盘,因此无论输入多长都不会一次性消耗完内存。架构图中每个音频帧为 80ms,与 --frames-after-eos 的参数单位一致。

此外,模型内部大量使用 StatefulModulemodules/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 中明确声明:模型使用必须遵守所有适用法律法规,禁止未经明确合法同意的人声模仿或克隆、禁止制造虚假信息或欺骗内容(包括伪造真实人物/事件的录音)、禁止生成非法、有害、诽谤、骚扰、歧视、仇恨或侵犯隐私的内容。语音合成与声音克隆属于敏感能力,落地到产品前务必评估合规风险。

进一步阅读

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
34
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.21 K
2.82 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
952
1.87 K
docsdocs
暂无描述
Markdown
906
5.84 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
537
614
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
864
1.36 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
4.29 K
1.04 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.4 K
1.48 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
550
402
flutter_flutterflutter_flutter
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.19 K
348