Skip to content

歌词、转换器与音质

CrLyric 标准

tracks.lyrics 返回 CrLyric,所有时间都是毫秒

ts
import type { CrLyric } from '@shiqianjiang/ceru-plugin-sdk'

const lyric: CrLyric = {
  format: 'crlyric',
  version: 1,
  track: {
    pluginId: 'example.library',
    providerId: 'catalog',
    kind: 'track',
    id: 'morning'
  },
  offsetMs: 0,
  lines: [
    {
      startTimeMs: 1000,
      endTimeMs: 3000,
      text: 'Morning light',
      translation: '晨光',
      words: [
        { startTimeMs: 1000, endTimeMs: 1800, text: 'Morning ' },
        { startTimeMs: 1800, endTimeMs: 3000, text: 'light' }
      ]
    }
  ]
}
字段规则
format / version固定 crlyric / 1
trackResourceRef,kind 必须是 track
offsetMs有限数值,单位毫秒,可表达时间偏移
lines最多 20,000 行,按 startTimeMs 非递减排列
startTimeMs / endTimeMs?非负毫秒;结束不得早于开始
text / translation? / romanization?文本,各项最多 65,536 个 UTF-16 代码单元
words?最多 10,000 词,按开始时间排列
startTimeMs / endTimeMs / text必需,时间有效且不逆序;可含 romanization
isBackground? / isDuet?背景或对唱标记
plainText?无时间轴歌词,最多 1,048,576 个代码单元

没有歌词时返回合法文档 lines: [];有纯文本可填 plainText。不要把“歌词为空”升级成整首歌无法播放。

歌词转换器

平台歌词解析、解密与导出属于插件能力。Core 校验统一数据,不包含平台解析器。

在 contributes 声明:

json
{
  "lyricConverters": [{ "id": "plain", "title": "纯文本歌词", "formats": ["plain"] }]
}

注册一个最小可运行转换器:

ts
import { definePlugin } from '@shiqianjiang/ceru-plugin-sdk'

export default definePlugin((ctx) => {
  ctx.lyricConverters.register('plain', {
    async parse(request, operation) {
      operation.signal.throwIfAborted()
      return {
        format: 'crlyric',
        version: 1,
        track: request.track,
        offsetMs: 0,
        lines: [],
        plainText: request.text
      }
    },
    async export() {
      throw new Error('此示例不支持导出带时间轴的歌词')
    }
  })
})
方法输入返回
parse(request, operation)track, format, text, translation?, romanization?Promise<CrLyric>
export(request, operation)document: CrLyric, formatPromise<LyricExportResult>

输入格式契约包含 auto、lrc、enhanced-lrc、yrc、qrc、krc、ttml、plain;只声明自己真的支持的格式。导出格式为 lrc、enhanced-lrc、yrc,结果包含 format, text, mime: 'text/plain', extension: 'lrc' | 'yrc'

Core 对转换输入/导出文本另有 2 × 1024 × 1024 的字符串 length 上限,单位是代码单元,不要误写为 UTF-8 的 2 MiB。

音质的顺序

常用音质标识推荐使用 128k320kflacflac24bithiresatmosatmos_plusmaster。它们是命名约定,不是强制枚举;按实际能力选取,也可以自定义。详见音源命名约定

在 Provider 声明中按从低到高排列:

json
{ "qualities": ["128k", "320k", "flac", "original"] }

名称没有内建排名,original 也不会自动比 flac 高。歌曲的 metadata.qualities 用于描述该曲实际可用音质;解析时检查请求值是否受支持,缺省 quality 由你的业务选择合理默认值。

SDK 提供的音质辅助函数及参数见类型参考。不要继承 v1 中固定平台音质列表作为所有 Provider 的规则。

Released under the Apache License 2.0 License.