examples/creator/ai-clean-bad.srt
summary: 0 errors, 15 warnings
WARN C601 cue#1 | repeated word: '然后'
WARN C601 cue#2 | repeated word: '就是'
WARN C602 cue#3 | ASR marker: ASR music marker '[Music]'
WARN C401 cue#3 | possible confusion: '认真的做' should be '认真地做'
WARN C402 | inconsistent term: 'moonpost' vs canonical 'MoonPost'
WARN C402 | inconsistent term: 'webvtt' vs canonical 'WebVTT'
explain 和 profile
查看诊断码说明:
moon run cmd/main --target native -- explain C601
moon run cmd/main --target native -- explain E101
查看所有 profile 配置:
moon run cmd/main --target native -- profile list
moon run cmd/main --target native -- profile show creator --name douyin
moon run cmd/main --target native -- profile show delivery --name ott-zh
MoonPost
English | 简体中文
MoonPost 是一个用 MoonBit 编写的字幕、时间码与后期质检工具包,面向两类 真实生产流程:创作者发布前字幕清洗,以及影视/OTT 字幕交付验收。
MoonPost 现在按两条能力线组织,而不是把自媒体规则和影视交付规则混在同一个 大而全的检查器里:
底层的 SRT/WebVTT/ASS parser、QC rule engine、timecode 和 report formatter 由两条能力线共享。共享底座保持中性,具体平台习惯和交付规范通过 Creator / Delivery profile 区分。
MoonPost 不做视频解码、转码或 FFmpeg 封装。项目关注的是适合用 MoonBit 确定性实现的后期基础设施层:parser、数据模型、QC 规则、报告、CLI 工具 和 Wasm-ready 核心包。
MoonPost 是原创 MoonBit 项目,不是对任何特定第三方库的移植或重写。 项目所采用的行业标准(SMPTE 时间码、SRT/WebVTT/ASS 字幕格式、Netflix TTSG、 广电 GY/T 357-2024 等)均为公开规范,不涉及第三方源码移植。如后续参考或 移植其他开源项目,会在文档中明确注明来源、许可证和参考范围。
仓库与赛事状态
moon add MaoDingA/moonpost./wasm-demo/build.sh && python3 -m http.server 8765 -d wasm-demo/public功能
共享基础能力:
23.976、24、25、29.97、29.97df、30、50、59.94、59.94df。Creator 能力:
creator check与creator clean,用于发布前检查和安全格式清理。Delivery 能力:
--fail-on-error,适合自动化交付检查。delivery check目录级交付预检和delivery subtitle-check单字幕文件 QC,可检查交付包资产、manifest、metadata、SHA-256 checksum 和字幕问题。两条生产线
creator check、creator cleandelivery check、delivery subtitle-check使用场景
Creator 场景:
Delivery 场景:
--fail-on-error接入自动化交付流程。共享场景:
适用人群
MoonPost 主要面向会直接处理字幕文件、发布前检查和交付验收的用户。
环境要求
moon命令的 shell 环境。开发过程中测试过的本地 MoonBit 工具链:
安装
MoonPost 已发布到 mooncakes.io,可以在任何 MoonBit 项目中作为依赖使用:
安装后在代码中按需导入子包:
可用的子包包括
MaoDingA/moonpost/subtitle、MaoDingA/moonpost/timecode、MaoDingA/moonpost/qc、MaoDingA/moonpost/creator、MaoDingA/moonpost/delivery、MaoDingA/moonpost/dcp、MaoDingA/moonpost/retime和MaoDingA/moonpost/align。完整 API 参考 README 中的”核心公开 API”章节,稳定性边界见 API_STABILITY.md。快速开始
克隆仓库后运行测试:
从源码运行 CLI:
源码运行前缀是:
下面的示例都会使用这个前缀。如果之后发布独立二进制,可以把该前缀替换为
moonpost。5 分钟用户体验路径
这条路径覆盖格式转换、AI 字幕清洗、国内长视频交付 profile 和完整 e2e 用户流程; 如果需要浏览器体验,再运行
./wasm-demo/build.sh并打开本地 demo。Creator / Delivery 示例
Creator AI 字幕清洗示例
检查包含 AI 转写产物的字幕:
输出示例:
explain 和 profile
查看诊断码说明:
查看所有 profile 配置:
CI 集成示例见
examples/ci-integration.md。creator clean示例中的 profile 应匹配实际语言和平台习惯;这里的douyin命令仅用于展示调用形状。依赖
--fail-on-error退出码做自动化时,请使用构建后的 native 可执行文件。Delivery 第一阶段目标
当前第一阶段把
delivery check <folder>作为可展示的目录级交付预检能力:delivery check会扫描交付目录第一层,识别 video、subtitle、poster、 metadata、checksum 和moonpost.delivery.json,根据 package profile 与 manifest 检查缺失资产和必需字幕语言,解析checksum.txt/checksums.txt/SHA256SUMS中的 SHA-256 条目校验文件内容,并对目录内 SRT/WebVTT/ASS 运行字幕 QC。checksum 当前支持标准sha256sum风格的<64hex> filename和<64hex> *filename行;checksum 指向目录外路径会报错。单个字幕文件仍可用
delivery subtitle-check独立检查:--fail-on-error适合接入自动化流程;如果希望 Warning 也阻塞交付,可使用--fail-on-warning。依赖退出码时请使用构建后的 native 可执行文件。字幕交付 profile 目前包括
ott-zh、cinema-zh、broadcast、srt-basic、dcp-source-srt和dcp-frame-strict。srt-basicdcp-source-srtdcp-frame-strict边界也要说清:这些 profile 检查的是 SRT 文本源文件,不是 DCP XML/MXF Timed Text validator,也不是 IMF IMSC validator;内嵌字幕流和烧录字幕的字体、 字号、安全区、实际渲染位置需要在相应容器、DCP/IMF 包或视频画面里验证。
CLI 概览
字幕 QC
检查 SRT 或 WebVTT 文件:
输出 JSON report:
显式开启中英双语文本规范检查:
--text-style默认关闭,不会改变普通qc结果。可选值包括bilingual、zh和en。构建 native CLI 后,可以用
--fail-on-error在发现 Error 级问题时返回非零退出码:示例报告:
QC Profiles
Profiles 为不同交付上下文提供实用默认值。
defaultstreamingcinemasocial-videoCLI 也支持通过
--fps <rate>覆盖当前 profile 的帧网格。QC 规则代码
E101E102E201W100W101W102W201W202W203W204W310W401W402W501W502W503W510W511W520W601W602W603W701时间码
MaoDingA/moonpost/timecode是 MoonPost 的通用 SMPTE 时间码基础包。它把 时间码标签、帧数、时长和半开时间码区间分开建模,支持 drop-frame 边界计算、 同帧率时间码算术、显式比较,以及基于精确帧率分子/分母的 23.976 / 29.97 / 59.94 换算。它还提供 24 小时 wrap policy、rational seconds、ST 12 logical word/user bits/packed LTC bytes(限 24h 内、nominal <= 30fps 的 LTC codeword)、 以及 FCPXML、IMF、Apple delivery-package 和 EDL timecode 字段的轻量 interop helpers。包级可测试示例见timecode/README.mbt.md。把 SMPTE 风格时间码转换为帧数:
输出:
把帧数转换回时间码:
输出:
在不同帧率假设之间转换时间码:
输出:
生成 IMF composition 风格的精确 edit-rate timecode 字段:
输出:
规范化一个 CMX 风格 EDL event 行:
输出:
支持的 CLI 帧率值:
23.976,23.98,23976,2398242547.952,47.95,47952,47954829.97,29.97ndf,2997,2997ndf29.97df,29.97DF,29.97-drop,29.97 drop,2997df,2997drop305059.94,59.94ndf,5994,5994ndf59.94df,59.94DF,59.94-drop,59.94 drop,5994df,5994drop607296100119.88,11988120库 API 还提供
Duration类型、Timecode::add_frames、Timecode::frame_distance、Timecode::add_duration、TimecodeRange和parse_timecode_result等显式同帧率操作。跨帧率比较、区间和时长运算不会隐式 换算,会返回None,调用方可以先选择目标帧率再转换。FCPXML、IMF、Apple delivery 和 EDL helpers 只处理时间码相关 metadata 字段,不解析完整文件。字幕转换
MoonPost 支持 SRT、WebVTT 和 ASS(Advanced SubStation Alpha)之间的相互转换。
SRT 转 WebVTT:
SRT 转 ASS:
ASS 转 SRT(自动剥离 override tags 和
\N换行符):写出到文件:
WebVTT 转 SRT:
标点半角/全角规范化转换:
--punctuation可选值包括bilingual、zh和en。该命令只改 cue 文本中的 常见标点,不会重写词语、重排字幕行或改变时间码。已实现的 parser 行为:
WEBVTTheader。NOTE、STYLE、REGIONmetadata block 会被 parser 跳过。Retime
整体平移所有 cue:
输出:
把重定时结果写入文件:
在不同帧率假设之间转换 cue 时间:
把 cue 时间吸附到帧网格:
浏览器 Wasm Demo(本地运行)
MoonPost 包含一个字幕 QC 浏览器 demo。该 demo 加载 MoonBit
wasm-gc构建产物,并在浏览器中运行 QC。字幕文本保留在本地浏览器会话中,不上传服务器。构建 Wasm 产物:
启动本地服务:
打开:
该 demo 需要浏览器支持 WebAssembly GC 和 JS string builtins。
Library Packages
MoonPost 由多个小型 MoonBit package 组成。公开 API 可参考生成的
pkg.generated.mbti文件。MaoDingA/moonpost/timecodeMaoDingA/moonpost/subtitleMaoDingA/moonpost/qcMaoDingA/moonpost/creatorMaoDingA/moonpost/deliveryMaoDingA/moonpost/dcpMaoDingA/moonpost/retimeMaoDingA/moonpost/alignMaoDingA/moonpost/cliMaoDingA/moonpost/wasm_demo/coreqc_subtitle。核心公开 API
Timecode:
Subtitle:
QC:
Retime:
Align:
DCP:
Wasm demo core:
仓库结构
更完整的层级说明见
docs/project-structure.md。CI
仓库包含 GitHub Actions 工作流
.github/workflows/ci.yml,会在 push、pull request 和手动触发时运行。CI 覆盖:
moon fmt后检查是否产生未提交 diff。moon info后检查pkg.generated.mbti等生成接口摘要是否同步。moon check --target native和moon check --target wasm-gc。moon build --target native和moon build --target wasm-gc。moon test --target native和moon test --target wasm-gc。wasm-demo/public/moonpost_qc.wasm产物检查。开发
运行 native 测试:
运行 Wasm-GC 兼容测试:
检查 native 和 Wasm-GC target:
格式化源码:
重新生成公开接口摘要:
构建 Wasm demo core:
许可证
Apache-2.0。见 LICENSE。