AMLL 语言解析器/撰写器
英文/英文 简体中文
这是原歌词包的重构版本. 文档尚未完成 .
下面是原始文件。 另见: AMLL 文档。 。 。 .
警告: 这是一个个人项目,仍在开发中。 可能还有许多问题,所以请不要在生产环境中直接使用!
一个用于AMLL的活字解析/生成模块,完全用TypeScript来写.
由于这个模块只关注词性内容,因此它抛弃了与歌词无关的所有信息. 如果您需要从词典文件中获取详细的信息(如艺术家),请考虑使用其他框架.
解析和生成支持
| 格式 | 通用扩展 | 解析 | 生成 |
|---|---|---|---|
| LyRiC (英语) | .lrc | ✅ | ✅ |
| LRC A2 数据 (增强LRC) | .lrc | ✅ | ✅ |
| ESLyric逐字歌词 | .lrc | ✅ | ✅ |
| 盐玩家歌词 (SPL) | .spl | ✅ | ✅ |
| 网易逐字歌词 | .yrc | ✅ | ✅ |
| QQ音乐逐字歌词 | .qrc | ✅ | ✅ |
| 拼写可操作 | .lys | ✅ | ✅ |
| 拼写行 | .lyl | ✅ | ✅ |
| 拼写快速导出 | .lqe | ✅ | ✅ |
| TTML 语言 | .ttml | ✅ | ✅ |
| 支助 | .ass | ❌ | ✅ |
格式化能力支持
每种格式都有不同的语法规则,因此它所支持的语法能力,如词级计时,翻译,和声段信息,也不同:
| 格式 | 时间颗粒性 | 翻译/转写 | 二重唱 | 背景声 | 元数据 |
|---|---|---|---|---|---|
LyRiC (英语:.lrc(中文(简体) ) | 行级 | XQ 以附加词行写入 | ❌ | QQ 文本包入 () | ❌ |
LRC A2( 微分数).lrc(中文(简体) ) | 词层 | XQ 以附加词行写入 | ❌ | QQ 文本包入 () | ❌ |
ESLyric (英语:.lrc(中文(简体) ) | 词层 | XQ 以附加词行写入 | ❌ | QQ 文本包入 () | ❌ |
SPL (英语:.spl(中文(简体) ) | 词层 | XQ 以附加词行写入 | ❌ | QQ 文本包入 () | ✅ |
净值.yrc(中文(简体) ) | 字符级别 | ❌ | ❌ | QQ 文本包入 () | ❌ |
QQ音乐(.qrc(中文(简体) ) | 字符级别 | ❌ | ❌ | QQ 文本包入 () | ❌ |
可拼写符号( C).lys(中文(简体) ) | 词层 | ❌ | ✅ | ✅ | ❌ |
拼写行( R).lyl(中文(简体) ) | 行级 | ❌ | ❌ | QQ 文本包入 () | ❌ |
拼写快速导出( L).lqe(中文(简体) ) | 词层 | ✅ | ✅ | ✅ | ❌ |
TTML (英语:.ttml(中文(简体) ) | 词层 | ✅ | ✅ | ✅ | ✅ |
支助.ass(中文(简体) ) | 词层 | ❌ | ❌ | QQ 文本包入 () | ❌ |
转换和退化规则
在通过AMLL的内部结构在格式之间转换时,当目标格式缺乏源格式提供的能力时,适用下列降解规则: 1
- 文字时间退化: 当目标格式只支持行级歌词, 如 LyRiC
.lrc线条.lyl,字级时间戳被剥去,一行上的所有字被合并为一行. - 翻译和转写退化数字 :
- 在导出为 LRC-家族格式(LyRiC,LRC A2,ESLyric,或SPL)时,会将翻译和转写作为附加的有主行时间戳的活字行被插入.
- 在导出到除TTML(YRC,QRC,LYS,或LYL)以外的词级格式时,会丢弃翻译和转写.
- 背景声:当目标格式没有原生背景-vocal标记时,背景相声会用括号环绕词尾写出:
(...)。 。 。 . - 二重奏属性:只有LYS,LQE和TTML保存二重奏信息. 它在导出到其他格式时丢失 .
- 元数据: 要保存向 SPL 导出时的元数据, 将包含元数据的完整剖析结果传递给
stringifySPL元数据为[key:value]标记行,当再次解析时,键会转换为小写。 TTML和SPL以外的格式不支持元数据. - 时间戳精度损失: ASS卡拉OK效果使用百分秒(1克),因此从以毫秒为基础的格式导出到ASS的回合时间戳并可能损失高达10毫秒的精度.
使用核心语言元件
当它们一起使用时,注意 两者的词条结构并不完全相同。您需要以如下例子(使用LyRiC作为示例)的方式转换它们,以便正确解析:
import { parseLrc } from "@applemusic-like-lyrics/lyric";
const lines = parseLrc("[00:00.00]test");
const converted = lines.map((line, i, lines) => ({
words: [
{
word: line.words[0]?.word ?? "",
startTime: line.words[0]?.startTime ?? 0,
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
},
],
startTime: line.words[0]?.startTime ?? 0,
endTime: lines[i + 1]?.words?.[0]?.startTime ?? Infinity,
translatedLyric: "",
romanLyric: "",
isBG: false,
isDuet: false,
}));
// Now you can pass converted to LyricPlayer
建议使用TypeScript,因为这样可以更容易地检测出错误.
大楼
wasm-pack build --target bundler --release --scope applemusic-like-lyrics