Pocket TTS Small · MNN 原生 KV 推理
将 Kyutai Pocket TTS 的三个小模型转换为 MNN,提供流式语音合成、预计算 Alba 音色和可直接使用的 Python/原生库运行包。 本 README 根据已完成的转换、数值验收和性能报告整理。五个发布变体均通过既有1/4线程短长句及流式状态门禁,模型运行文件保持验收原字节。
直接推荐:先用 models/18m-fp32,以1线程、High/Normal、dynamic0运行。 它是本轮完整实验的统一基线。
要使用本次18.2M原生LLM导出的混合精度成果,选择 models/18m-w8-mixed。 它已通过完整数值验收,使用MNN正式LLM导出主干和原生KV,Mimi末端六算子采用W8存储,其余保持FP32,详见1.1节。
如果首要目标是降低包体、内存和本机CPU合成耗时,选择 models/2m-fp32。FP32仍作为默认性能对照;混合版提供独立的已验收配置和用法。
运行平台:Linux x86_64 AVX2、Python ≥3.11、glibc ≥2.38、提供GLIBCXX_3.4.32的libstdc++。
附匹配的MNN/Express/桥接.so与Python host,神经网络执行不依赖PyTorch、ONNX Runtime或上游Pocket TTS包。
这是模型资源与独立运行包,ModelScope用于下载;不支持直接传给modelscope.pipeline()。Android新原生KV路径尚未验证。
下文run.sh命令仅适用于该Linux预编译包,不是Android运行命令,也不适用于任意MNN版本。 端侧接入、版本要求与新旧库隔离见DEPLOYMENT.md。
原模型与 Hugging Face 地址
- 官方原模型:kyutai/pocket-tts。
- 本次实际转换的权重来源: kyutai/pocket-tts-without-voice-cloning。使用无声音克隆的基础权重,没有使用
_refl版本。 - 上游代码:kyutai-labs/pocket-tts,实验固定提交
cb77ab8561658221d6912cff6e83c09834a70819。
三个基础模型位于同一 Hugging Face 仓库的不同目录,以下链接固定到实际实验版本:
| MNN型号 | 官方参数规格 | Hugging Face 原始权重 | 权重revision |
|---|---|---|---|
| 18m | 18.2M | english_18m_2026-10/model.safetensors | 08ffc58775e62aad9409511b9591c9af626270f3 |
| 7m | 6.9M | english_7m_2026-10/model.safetensors | 08ffc58775e62aad9409511b9591c9af626270f3 |
| 2m | 1.9M | english_2m_2026-10/model.safetensors | a3055dcb533cf2ec90458008a01e7cef550bae2a |
tokenizer及各型号Alba状态的来源版本另列于conversion.json。带克隆版本的仓库地址不表示本运行包支持任意WAV声音克隆。
1. 具体推荐与模型选择
| 变体 | 路径 | 推荐用途 | 存储与计算 | 运行资产MiB |
|---|---|---|---|---|
| 18m-fp32(默认基线) | models/18m-fp32 |
默认使用、复现及后续优化对照 | FP32存储与计算 | 74.055 |
| 7m-fp32 | models/7m-fp32 |
模型容量与资源成本居中的候选 | FP32存储与计算 | 30.353 |
| 2m-fp32 | models/2m-fp32 |
包体、内存和本机CPU耗时优先 | FP32存储与计算 | 9.444 |
| 18m-w8-mixed | models/18m-w8-mixed |
18.2M原生LLM导出的已验收混合精度版本 | 末端6算子W8存储,其余FP32;FP32计算 | 74.000 |
| 2m-w8-mixed | models/2m-w8-mixed |
同上,不建议替代FP32默认版本 | 末端6算子W8存储,其余FP32;FP32计算 | 9.411 |
推荐18.2M FP32,是因为它是本轮主要实验对象、全程保留FP32并通过完整门禁,适合作为统一参照;没有主观听感最优的证据。 在三个FP32模型的同批单线程测试中,2M合成同一句文本的耗时比18M少68.9%,完整运行资产少87.3%;7M分别少24.3%和59.0%。输出音频时长不同,这不是固定音频长度的吞吐提升。 最新另一批测试中,2M/18M的单线程进程峰值RSS为60.109/142.383MiB;7M未测该批RSS。
当前不推荐用W8换取性能: 18M/2M版本仅压缩26,720/15,048个权重元素,整包净省58,183/35,063字节,约0.075%/0.354%;没有稳定提速,18M单线程反而慢约9.6%。 这些版本只证明六个Mimi算子的W8存储在指定模式下可用,不是完整INT8计算或已验证加速版。
2m是型号简称,实际官方规格为1.9M。低秩词嵌入在导出时展开,运行资产大小不能按官方参数量×4直接估算;上表也不包含共享运行库。
所有数值误差均对比各自模型的PyTorch参考,不能据此给18M/7M/2M作音质排名。最终业务选择还需用实际文本检查发音和听感。
1.1 18.2M原生LLM导出混合精度版本:18m-w8-mixed
这是本次已经发布、能够按验收配置正常使用的混合版本。 实验目录名为mnn-18m-native-kv-int8-decoder-final,发布路径为models/18m-w8-mixed,原始模型规格18.2M。
转换分两步:先通过MNN正式入口transformers/llm/export/llmexport.py --type pocket_tts --export mnn --quant_bit 32生成原生KV FP32模型,
再在该产物上对Mimi末端六个权重算子做选择性W8/HQQ编码。因此它保留本次原生LLM导出和C++持久KV路径;不是早期只做算子融合、显式传递主干KV的版本。
正式导出入口当前要求quant_bit32,不能把过程写成直接使用llmexport.py --quant_bit 8。
| 部分 | 18.2M混合版实际处理 |
|---|---|
| Transformer主干 | MNN正式LLM导出,复用Decoder/Attention/RoPE/Linear;FP32权重,C++原生packed KV |
| 音色seed图 | 导入同一组原生Attention缓存;无学习权重量化 |
| Drifting采样头 | 独立flow子图,保持FP32 |
| Mimi解码器 | 仅末端六个Conv/Deconv权重算子W8/HQQ存储,共26,720个权重元素;其余FP32 |
| bias/norm/常量/host/音色/状态 | 保留FP32和原验收字节 |
| 运算配置 | High + Normal + dynamic0;W8权重反量化后执行FP32计算 |
这里的“混合精度”明确指W8/FP32混合权重存储。当前验收环境没有证明它采用混合INT8/FP32算术,也没有将完整主干量化为INT8。
| 18.2M混合版指标 | 1线程 | 4线程 |
|---|---|---|
| 完整短句波形相对L2 | 0.405762% | 0.405758% |
| 完整长句波形相对L2 | 0.510835% | 0.510821% |
| 短/长句及状态完整门禁 | 通过 | 通过 |
| 预热后合成耗时/秒 | 0.251782 | 0.292397 |
| 首块音频/ms | 17.312 | 15.223 |
| RTF | 0.071529 | 0.083067 |
| 进程峰值RSS/MiB | 142.305 | 142.660 |
性能来自2.2节同一批五轮中位数,短句输出3.52秒音频;完整运行资产74.000MiB。与同批18M FP32相比,整包省58,183字节、单线程耗时增加约9.6%,因此不把它作为提速方案推荐。 如果目的是使用此次原生LLM导出的18.2M混合模型,就选这一项,并保持以下配置:
bash runtime/run.sh --model models/18m-w8-mixed --threads 1 \
--precision high --memory normal --dynamic-quant-option 0 --warmup 1 \
--text "Hello world. This is Pocket TTS running locally." --output 18m-native-llm-mixed.wav
将--threads 1改为--threads 4可复现四线程配置。不要把这份通过结论套用到Memory_Low或动态INT8选项。
2. 基线与性能指标
RTF = 合成耗时 / 生成音频秒数,越小越快,<1表示快于实时。 下列均为已有同批5轮中位数,每次独立进程,先完整预热1次再测1次;
包含每次请求的reset/音色前缀注入和WAV写盘,排除加载和预先读取音色。min/max原值见metrics.json,不是置信区间。
主机:Linux x86_64、Ryzen 7 9700X虚拟机、4个逻辑CPU、AVX2;High/Normal、dynamic0、Alba、seed42、temperature0.3、24kHz单声道。
实际文本: Hello world. This is Pocket TTS running locally.
短句音频长度:18M=3.52s,7M=3.44s,2M=3.04s。
2.1 三个FP32模型:同批比较
| 模型 | 线程 | 合成s | 首块ms | RTF | 相对18M同线程基线耗时比 |
|---|---|---|---|---|---|
| 18m-fp32 | 1 | 0.232250 | 15.880 | 0.065980 | 1.000× |
| 18m-fp32 | 4 | 0.282538 | 15.344 | 0.080267 | 1.000× |
| 7m-fp32 | 1 | 0.175719 | 9.327 | 0.051081 | 0.757× |
| 7m-fp32 | 4 | 0.236959 | 10.399 | 0.068883 | 0.839× |
| 2m-fp32 | 1 | 0.072230 | 4.178 | 0.023760 | 0.311× |
| 2m-fp32 | 4 | 0.111821 | 5.802 | 0.036783 | 0.396× |
此批未测RSS;不从另一批填入RSS后伪装为同批数据。耗时比比较当前输入的整句耗时,输出音频长度不同,因此不等于固定时长计算吞吐比。
2.2 FP32与W8混合:最新同批RTF复测
| 模型 | 线程 | 合成s | 首块ms | RTF | 进程峰值RSS MiB |
|---|---|---|---|---|---|
| 18m-fp32 | 1 | 0.229703 | 15.818 | 0.065256 | 142.383 |
| 18m-w8-mixed | 1 | 0.251782 | 17.312 | 0.071529 | 142.305 |
| 18m-fp32 | 4 | 0.290600 | 15.227 | 0.082557 | 142.598 |
| 18m-w8-mixed | 4 | 0.292397 | 15.223 | 0.083067 | 142.660 |
| 2m-fp32 | 1 | 0.069708 | 3.820 | 0.022930 | 60.109 |
| 2m-w8-mixed | 1 | 0.069230 | 3.726 | 0.022773 | 60.270 |
| 2m-fp32 | 4 | 0.118533 | 5.470 | 0.038991 | 60.312 |
| 2m-w8-mixed | 4 | 0.117955 | 5.660 | 0.038801 | 60.484 |
本批18M FP32基线:单线程约0.230s生成3.52s音频,RTF≈0.0653,约15.3倍实时;四线程RTF≈0.0826。 W8混合没有稳定提速,18M单线程本次还慢约9.6%;2M差异不足1%。本机四线程比单线程慢。 小模型逐帧执行中的线程调度/同步是可能原因,本批没有算子/线程profile证明其占比。RSS为整个Python进程峰值,包含加载与预热,不是纯网络内存。 两张表来自不同批次,应各自内部比较,不把7M旧批和最新18M/2M数字拼成新的同批排名。
3. 精度验收
门限为完整原始float32 PCM相对L2 <1%,样本点一一对应,同时要求samples/EOS/分块/token/实际噪声和流式缓存一致。 这不表示每个sample相对误差均<1%,也不要求完整音频逐元素allclose。未量化子图维持atol=0.002、rtol=0.001,量化输出另用相对L2<5%。 不裁剪、不时间对齐、不强制参考EOS;短句和长句独立验收,包含变长序列、reset/replay和跨Mimi context=50。
| 模型 | 线程 | 短句波形误差 | 长句波形误差 |
|---|---|---|---|
| 18m-fp32 | 1 | 0.206848% | 0.361018% |
| 18m-fp32 | 4 | 0.206852% | 0.361002% |
| 7m-fp32 | 1 | 0.044344% | 0.895089% |
| 7m-fp32 | 4 | 0.044304% | 0.895102% |
| 2m-fp32 | 1 | 0.005818% | 0.044844% |
| 2m-fp32 | 4 | 0.005831% | 0.044852% |
| 18m-w8-mixed | 1 | 0.405762% | 0.510835% |
| 18m-w8-mixed | 4 | 0.405758% | 0.510821% |
| 2m-w8-mixed | 1 | 0.584235% | 0.646540% |
| 2m-w8-mixed | 4 | 0.584228% | 0.646538% |
长句参考文本:Pocket TTS can generate speech locally with MNN. This longer paragraph checks streaming attention over many audio frames. The decoder must preserve its convolution buffers between calls. Each sentence should be spoken clearly, and repeated requests should start from the same saved voice state. We also check how a long input is split into smaller pieces for reliable speech synthesis. 长句音频:18M=21.36s、7M=21.84s、2M=20.00s。没有人工听感、ASR WER、UTMOS、MOS或说话人相似度评分。
4. 下载与运行
4.1 下载
python3 -m pip install modelscope_hub
python3 - <<'PY'
from modelscope_hub import HubApi
HubApi().download_repo("dr3334/Pocket-TTS-MNN", "model", revision="v1.0.3", local_dir="Pocket-TTS-MNN")
PY
cd Pocket-TTS-MNN
完整下载包括5个变体;若只需要基线,使用相同调用并增加:
allow_patterns=["README.md", "DEPLOYMENT.md", "LICENSE.md", "licenses/*", "configuration.json", "baseline.json", "validation.json", "metrics.*", "conversion.json", "runtime/**", "verify_release.py", "SHA256SUMS", "release-manifest.json", "models/18m-fp32/**"]。
全仓校验需要完整下载;筛选下载后校验器会报告缺少未下载模型,不能把该提示当成基线文件损坏。
4.2 安装最小推理依赖、验证文件
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r runtime/requirements.txt
python verify_release.py
推理只需NumPy、sentencepiece及随包原生库;requirements还保留通用tokenizers兼容。
公开下载不要求登录。不要安装普通pip MNN后替换随包库,也不要strip/patchelf;核心修复与模型hash互相匹配。
4.3 推荐用法:18M FP32、1线程
bash runtime/run.sh --model models/18m-fp32 --threads 1 \
--text "Hello world. This is Pocket TTS running locally." --output baseline.wav
启动器默认18M FP32、1线程、High/Normal、dynamic0、预热1次,自动在启动Python前设置包内库搜索路径并显式选择桥接库。
可以从任意工作目录调用启动器;切换模型时显式--model路径以当前工作目录为准。
# 4线程运行同一基线
bash runtime/run.sh --threads 4 --output baseline-t4.wav
# 更小的FP32模型
bash runtime/run.sh --model models/2m-fp32 --threads 1 --output 2m.wav
# 模型容量与资源成本居中的FP32候选
bash runtime/run.sh --model models/7m-fp32 --threads 1 --output 7m.wav
# 限定Normal模式的W8存储实验
bash runtime/run.sh --model models/18m-w8-mixed --threads 1 --output mixed.wav
每次CLI打印的耗时/首块/RTF为该次请求,不能当成上述五轮中位数。Linux旧系统如Ubuntu22.04的默认glibc不足以直接运行本预编译包;
出现GLIBC_2.38或GLIBCXX_3.4.32 not found时需使用符合要求的环境,或自行移植匹配核心后重新做精度验收。
4.4 Python API
python runtime/example.py --model models/18m-fp32 --text "A local speech synthesis example." --output api.wav
示例负责在导入桥接库前重启进程设置库路径。自写API程序时也需在启动Python前设置LD_LIBRARY_PATH=runtime/linux-x86_64,
并给TTSModel.load_model显式传包内libpockettts_mnn.so、precision="high", memory="normal", dynamic_quant_option=0;保留配置内SHA校验。
5. 转换与架构说明
5.1 各个子图的变化
| 部分 | 本次处理 | 保留的行为 |
|---|---|---|
backbone.mnn |
复用LLM Decoder/Attention/RoPE/Linear导出;主干KV由C++持久缓存管理,主图输出条件特征与EOS | Pocket的LayerNorm、GELU、LayerScale、残差、投影和标量EOS;FP32权重 |
backbone_seed.mnn |
新增无学习权重的音色前缀图,按同名Attention导入Alba packed KV | 每次请求reset/reseed,音色不被修改;0字节weight文件也要保留 |
flow.mnn |
复用已验收FP32音频采样子图 | 18M/7M drifting、2M pointwise;条件与噪声输入,采样调度仍由host执行 |
decoder.mnn |
独立Mimi流式解码,复用FP32图;两个W8变体只改末端六算子的权重编码 | 卷积历史、反卷积重叠尾部、context=50的滑窗Transformer缓存 |
| host与音色 | host.npz、Alba状态、tokenizer保持匹配型号和原字节 | 分句、查表/输入投影、BOS、噪声、EOS判断、状态调度及WAV写出 |
“原生KV”指主干缓存由C++管理;完整TTS host仍为Python/NumPy,不是llm_demo或纯C++ TTS入口。
此前同批对照中,最终路径相对旧显式FP32的请求耗时下降约28.9%~54.6%;这是缓存、导出和Attention设置的整体收益,不能归因于单一算子。
单纯复用LLM融合算子的早期原型没有普遍加速,18M曾退化;因此最终推荐的是经过完整复测的原生KV产物。
5.2 FP32转换参数与例子
正式入口为transformers/llm/export/llmexport.py --type pocket_tts --export mnn --quant_bit 32。
在包含本轮适配和修复的完整MNN开发工作区中,18M示例为:
python transformers/llm/export/llmexport.py \
--path pockettts/models/original-english_18m_2026-10 --type pocket_tts \
--pocket_base_model pockettts/models/mnn-18m --export mnn --quant_bit 32 \
--mnnconvert /path/to/patched/MNNConvert --dst_path /path/to/new-empty-output
--path是本地原始权重和配置目录;--pocket_base_model须为同一型号已验收的FP32 flow/Mimi/host资产,不能混用不同模型。
发布包不是完整开发仓库,这条命令用于说明转换过程,不能在只有模型下载目录时直接重建。
| 参数/设置 | 实际值 |
|---|---|
| 新主干ONNX | opset15 |
| 权重存储 | FP32、外置sidefile,--saveExternalData |
| 转换器开关 | --allowCustomOp --transformerFuse |
| C4 | --transformerFuseC4=1 |
| QKV投影融合 | --transformerFuseQkvProj=0 |
| GateUp投影融合 | --transformerFuseGateUpProj=0 |
| LnProj融合 | --transformerFuseLnProj=1 |
| 图修复/优化 | JSON无损往返、external字节审计,最终独立输出优化使用--optimizeLevel=1 |
| 音频图 | 复用已验收FP32;其首次导出走独立wrapper,ONNX opset17 |
已记录的最终原生KV阶段耗时如下。阶段含主干/seed导出和审计及旧音频/host复用;进程耗时另含Python启动与模型加载。 两者都不含模型下载、flow/Mimi首次转换和C++编译,不能当成从零转换全部模型的时间。
| 模型 | 导出阶段/秒 | 进程总耗时/秒 |
|---|---|---|
| 18M | 0.539911 | 3.552058 |
| 7M | 0.431070 | 3.453999 |
| 2M | 0.400233 | 3.429710 |
5.3 W8范围与量化效果
由合格FP32另做MNN→MNN权重量化:--optimizeLevel 0 --weightQuantBits 8 --weightQuantBlock 16 --weightQuantAsymmetric=1 --saveExternalData --compressionParamsFile <guide.json>。
18M实际启用--hqq,2M选普通非对称量化。Guide选中权重写bits8,排除权重写bits0;不能用bits32表示排除。
仅保留Mimi model.6两个残差Conv、model.8 Deconv、model.9两个残差Conv、audio输出Conv。子集从编码base精确复用,不再量化。
Const/norm/bias、主干、flow、host、音色与KV保持FP32;请求block16不保证每个算子实际block均为16,须检查编码元数据。
18M的base HQQ编码耗时0.661927秒、六算子子集pack为0.044209秒;2M普通编码为0.026660秒、子集pack为0.029550秒。它们不是从原始模型开始的全流程耗时。 量化排查修复过布尔参数/HQQ开关、optimizeLevel0初始化、JSON小常量往返及CPU Mean归约问题;这些修复没有让完整INT8或FP16自动通过闭环语音验收。
| 方案 | 既有完整波形验收 | 使用评价 |
|---|---|---|
| 三个最终FP32 | 1/4线程短长句及状态门禁通过 | 当前推荐 |
| 原生LLM导出主干 + 末端六算子W8,High/Normal/dynamic0 | 18M/2M通过 | 已验收的混合存储方案;18M使用方法见1.1节,未证明加速收益 |
| 18M全学习权重/仅主干FP16-RNE | 1/4线程短长句均未通过 | 不发布;存储FP16不代表FP16计算 |
| 完整主干INT8、Low动态INT8 | 未通过相同整句门限 | 不发布;逐帧teacher对齐或进入INT8 kernel不能代替整句通过 |
切换Precision_Low或Memory_Low不能继承本仓High/Normal结论。完整参数、来源和各阶段口径见conversion.json。
6. 文件、版本与注意事项
models/{18m-fp32,7m-fp32,2m-fp32,18m-w8-mixed,2m-w8-mixed}/
config.json + backbone.mnn/.weight + backbone_seed.mnn/.weight
flow.mnn/.weight + decoder.mnn/.weight + host.npz + alba.npz
tokenizer.model + text_chunking.py + LICENSE.pocket-tts
runtime/ Python host、启动/API示例、Linux x86_64库
sources/ 桥接/PocketTtsModule与最小公有头文件,非完整MNN核心源码
baseline.json 默认模型及其指标
metrics.json + metrics.csv + validation.json + conversion.json
release-manifest.json + SHA256SUMS + verify_release.py
licenses/ + LICENSE.md
模型config保持验收时字节。少量reused_from/source绝对路径是历史来源元数据,不参与推理。W8 config中的acceptance_tested=false是导出时快照,
后续完整验收结果及其config SHA写在根validation.json,没有改写原始审计。原本的绝对软链接已解引用为普通文件,空seed sidefile也保留。
发布模型经过JSON无损转换;随包Core、Express和桥接包含外置权重、Mean及KV相关修复。版本号同为MNN3.6.1不足以证明兼容;详见随包源码说明和三个库的SHA。
它由匹配旧ABI的对象做定向修复重链接,未声称当前最新MNN全树clean build或全库CI通过。重编译/换库需重新数值验收。
仅验证英语和预计算Alba。未接入任意音频声音克隆、中文、移动端JNI/APK或Android新KV真机推理。不要将桌面RTF写成手机指标。
6.1 端侧与版本兼容
- 已验收组合为随包固定SHA的Linux x86_64 Core/Express/桥接;普通pip MNN、其他版本或自行构建的同版本均未获本次结果认证。
- 历史Android arm64只编译过旧generic桥接,缺少当前模型需要的cached/seed/reset接口;新的Android Core、Express、桥接与host/JNI仍需完成并做真机验收。
- 六个旧C API源码签名保留,新增KV接口采用追加方式;这不构成任意MNN/Express C++ ABI兼容承诺。
- 新原生KV构建整体使用
_pockettts_nativekv后缀,保留旧库。 新Core、Express、桥接的SONAME和动态依赖也须带后缀,不能只改文件名。后缀不保证两套C++符号同进程隔离。 - DEPLOYMENT.md给出平台矩阵、构建模板、host移植范围、隔离方式和验收要求;其中Android步骤是待实施路线,不是已运行成功的命令记录。
7. 许可与来源
权重、tokenizer及预计算Alba派生状态:CC BY 4.0;代码许可分别保留。
原模型:Kyutai,pocket-tts-without-voice-cloning。
Alba:Alba MacKenna,casual voice与CC BY 4.0说明。
MNN为Apache-2.0;上游Pocket TTS代码为MIT,每模型的MIT文件不替代权重/音色许可。
本仓是第三方MNN转换,修改了图布局、外置存储、KV/音色格式及两个混合版的少量权重编码;无上游背书。
完整署名与许可链接见LICENSE.md,源版本及许可核验见conversion.json和licenses/source-licenses.json。
8. 数据索引与版本
| 文件 | 内容 |
|---|---|
| baseline.json | 默认18M FP32的配置SHA、完整精度和最新性能 |
| metrics.json、metrics.csv | 两个独立性能批次共14行;中位数、min/max、线程、预热和来源指纹 |
| validation.json | 五模型、1/4线程短长句和流式状态门禁 |
| conversion.json | 原模型版本、转换开关、子图变化及阶段耗时 |
| DEPLOYMENT.md | 端侧接入、MNN版本限制、带后缀的新库构建与新旧库隔离 |
| release-manifest.json、SHA256SUMS | 本版本文件清单与SHA-256 |
v1.0.0为首次已核验发布;v1.0.1补充报告结论、具体推荐及固定版本的Hugging Face原始权重链接,并同步文件校验清单。
v1.0.2突出18.2M原生LLM导出混合版的身份、转换关系、完整指标及独立使用命令。
v1.0.3补充端侧与版本兼容说明,提供新构建的库名后缀配置;已验收运行二进制和模型继续保留原字节。
五款模型和运行库与v1.0.0逐字节相同,没有重新转换、量化或推理测速。README与性能数据整理日期:2026-10-21(Asia/Shanghai)。